From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B825236A for ; Thu, 9 Feb 2023 20:31:52 +0000 (UTC) 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 A72134B3; Thu, 9 Feb 2023 12:32:28 -0800 (PST) Received: from slackpad.lan (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 4AC993F703; Thu, 9 Feb 2023 12:31:44 -0800 (PST) Date: Thu, 9 Feb 2023 20:29:52 +0000 From: Andre Przywara To: Andreas Feldner Cc: Andreas Feldner , Rob Herring , Krzysztof Kozlowski , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, Maxime Ripard Subject: Re: [PATCH] ARM: dts: allwinner: minimize irq debounce filter per default Message-ID: <20230209202952.673d5a60@slackpad.lan> In-Reply-To: References: <20230207011608.2ce24d17@slackpad.lan> Organization: Arm Ltd. X-Mailer: Claws Mail 4.1.0 (GTK 3.24.31; x86_64-slackware-linux-gnu) Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Wed, 8 Feb 2023 13:50:04 +0100 Andreas Feldner wrote: Hi Andreas, CC:ing Maxime, who wrote the debouncing code back then. > Am 07.02.23 um 02:16 schrieb Andre Przywara: > > On Mon, 6 Feb 2023 20:51:50 +0100 > > Andreas Feldner wrote: > > > > Hi Andreas, > > > > thanks for taking care about this board and sending patches! =20 > Thank YOU for maintaining it! > >> The SoC features debounce logic for external interrupts. Per default, > >> this is based on a 32kHz oscillator, in effect filtering away multiple > >> interrupts separated by less than roughly 100=C3=AF=C2=BF=C2=BDs. > >> > >> This patch sets different defaults for this filter for this board: > >> PG is connected to non-mechanical components, without any risk for > >> showing bounces. PA is mostly exposed to GPIO pins, however the > >> existence of a debounce filter is undesirable as well if electronic > >> components are connected. =20 > > So how do you know if that's the case? It seems to be quite normal to > > just connect mechanical switches to GPIO pins. > > > > If you are trying to fix a particular issue you encountered, please > > describe that here, and say how (or at least that) the patch fixes it. > > > > And I would suggest to treat port G and port A differently. If you > > need a lower debounce threshold for port A, you can apply a DT overlay > > in U-Boot, just for your board. =20 >=20 > Fair enough. You run into problems when you connect (electronic) > devices to bank A (typically by the 40pin CON2 connector), where > the driver requires fast IRQs to work. In my case this has been a > DHT22 sensor, and the default debounce breaking the dht11.ko > driver. Sure, what I meant is that this is a property of your particular setup (because you attach something to the *headers*) , so it shouldn't be in the generic DT, but just in your copy. Which ideally means using a DT overlay. > Now, what kind of problem is this - I'm no way sure: >=20 > a) is it an unlucky default, because whoever connects a mechanical > switch will know about the problem of bouncing and be taking > care to deal with it (whereas at least I was complete unsuspecting > when connecting an electronic device that a debounce function > might be in place), or The Linux default is basically the reset default: just leave the register at 0x0. It seems like you cannot really turn that off at all in hardware, and the reset setting is indeed 32KHz/1. So far there haven't been any complaints, though I don't know if people just don't use it in anger, or cannot be bothered to send a report to the list. > b) is it a bug in the devicetree for (at least) the BananaPi M2 Zero, > because the IRQ bank G is hard wired to electronic devices that > should not be fenced by a debouncing function, or Well, we could try to turn that "off" as much as possible, but on the other hand the debounce only affects *GPIO* *interrupts*, so not sure that gives us anything. The PortG pins are used for the SDIO Wifi, BT UART, and the wakeup pins for the Wifi chip. Only the wakeup pins would be affected, and I doubt that we wake up that often that it matters. If you've made other observations, please let me know. Certainly no board with an in-tree DT sets the debounce property, which means everyone uses 32KHz/1, and also did so before the functionality was introduced. I'd say we should try to only fix things that are actually broken: hence I was asking whether you have seen actual problems. Which apparently you have, with your sensor, but not on PortG? > c) is it missing dt binding documentation of the input-debounce > attribute? Documentation for what, exactly? The default behaviour? Yes, we should add that, though not sure that really belongs into the binding. > Anyway, the combination of these is quite irritating. To me it > seems a sufficiently elegant solution to explicitly include the > setting in the devicetree and leave it to whoever is unhappy > with it, to create a better suited device tree overlay. >=20 > >> Additionally, the clock-frequency attribute is added for each of > >> the 4 cores to eliminate the kernel error message on boot, that > >> the attribute is missing. > >> > >> Signed-off-by: Andreas Feldner > >> --- > >> .../dts/sun8i-h2-plus-bananapi-m2-zero.dts | 18 ++++++++++++++++= ++ > >> 1 file changed, 18 insertions(+) > >> > >> diff --git a/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts b/ar= ch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts > >> index d729b7c705db..1fc0d5d1e51a 100644 > >> --- a/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts > >> +++ b/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts > >> @@ -113,6 +113,22 @@ wifi_pwrseq: wifi_pwrseq { > >> =20 > >> &cpu0 { > >> cpu-supply =3D <®_vdd_cpux>; > >> + clock-frequency =3D <1296000000>; =20 > > I see where you are coming from, this is really an unnecessary warning > > message. However this message should be really removed from the kernel > > instead of adding some rather meaningless value here. > > The current DT spec marks this property as required, though, so I added > > a PR there to get this fixed: > > https://github.com/devicetree-org/devicetree-specification/pull/61 > > Once this is through, we can try to remove the kernel message. =20 >=20 > OK, so I'll take care to have this change removed from my patch. > I thought so, but then it was the configuration I'd been testing with... >=20 > >> +}; > >> + > >> +&cpu1 { > >> + cpu-supply =3D <®_vdd_cpux>; =20 > > I don't think we need this for every core? =20 >=20 > I came across a discussion that this was marked required on the > cpu@... level whereas it would make sense on the cpus level. I did > not check if this suggestion was implemented in the meantime, > sorry! >=20 > >> + clock-frequency =3D <1296000000>; > >> +}; > >> + > >> +&cpu2 { > >> + cpu-supply =3D <®_vdd_cpux>; > >> + clock-frequency =3D <1296000000>; > >> +}; > >> + > >> +&cpu3 { > >> + cpu-supply =3D <®_vdd_cpux>; > >> + clock-frequency =3D <1296000000>; > >> }; > >> =20 > >> &de { > >> @@ -193,6 +209,8 @@ bluetooth { > >> }; > >> =20 > >> &pio { > >> + /* 1=C3=AF=C2=BF=C2=BDs debounce filter on both IRQ banks */ =20 > > Is that supposed to be in UTF-8? It seems to have got lost in > > translation, or is that just me? =20 > O yes, the Greek character slipped into the comment. > >> + input-debounce =3D <1 1>; =20 > > As mentioned above, I am not so sure this is generic enough to put it > > here for PA. And what is the significance of "1 us", in particular? Is > > that just the smallest value? =20 >=20 > Yes indeed it's a bit more complicated than I feel it needs to be. The > configuration is taken as microseconds and translated into the best > matching clock and divider by the driver. However, 0 is not translated > to the lowest divider of the high speed clock as would be logical if > you ask for zero microseconds, but to "leave at default". The default > of the board is 0 in the register, translating to lowest divider on the > _low_ speed clock. I'd say the "if (!debounce) continue;" code is just to defend against the division by zero, which would be the next statement to execute. We might want to change that to interpret 0 as "lowest possible", which would be 24MHz/1. Please feel free to send a patch in this regard, and CC: Maxime, to get some input on that idea. > To me this is mindboggling. >=20 > If you want to keep IRQ bank A as it is today and switch off the > definitely unnecessary (and _potentially_ IRQ eating) debounce off > for bank G only, I'd suggest the following setting: >=20 > =C2=A0=C2=A0=C2=A0 input-debounce =3D <31 1>; It should be documented that the effective default is 31, I guess the binding is the right place. > This is because 31 Microseconds is exactly the time that is best > matched by the low speed clock with low divider and translated > to a 0 in the config register by the driver. >=20 > The absolutely equivalent setting, with the only drawback that it > would have confused me to death is: >=20 > =C2=A0=C2=A0=C2=A0 input-debounce =3D <0 1>; >=20 > (because it skips setting IRQ bank A debouncing, leaving it at 31.25 us) >=20 > Or, and that was my suggestion, you set both correctly for > electronic devices and leave the task of switching on debouncing > to the implementors of applications with mechanical switches: >=20 > =C2=A0=C2=A0=C2=A0 input-debounce =3D <1 1>; >=20 > To me, any of these being present in the devicetree would have been > of great help, because I would have seen that there is something > to set. >=20 >=20 > One final question: how would you like this change: >=20 > --- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c > +++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c > @@ -1467,6 +1467,10 @@ static int sunxi_pinctrl_setup_debounce(struct=20 > sunxi_pinctrl *pctl, > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 writel(src | div << 4, > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 pctl->membase + > sunxi_irq_debounce_reg_from_bank(pctl->desc, i)); > + > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 pr_info("Debounce filter for IRQ bank %d configured to " > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 "%d us (reg %x= )\n", > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 i, debounce, s= rc | div << 4); That looks certainly useful, please send a proper patch. Cheers, Andre > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } >=20 > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return 0; >=20 > It helped me to cross-check what the driver is really doing, and it > again would have helped me with me DHT problem to learn about > the existence of a debouncing filter. >=20 > Yours, >=20 > Andreas. >=20 >=20 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 D833EC61DA4 for ; Thu, 9 Feb 2023 20:33:08 +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=I33wwsofJNhwXiuYnHlzyCE36uoE3jc25t7d1yycIiI=; b=tEU15U5Ersw6Pe Y+8TS2eaWYg0x42Ym247PnZtR0OEIe+uIQPatnp1YU9h6sLBCBjb8sC/GHcBMlDRGWK27zbLfEjZW N9jrHW/y47G+xdC3SO0XgaE5dWv8Bzu+3ZYs6dA8HTrs1I8WBwWdokFLzFJvwmps//FmXCdQIXdlR tjiLFnnFDkglcKrNf2X871PMpDkCSAtRCTNklbv33j/m5J9D2TcZ64uhetuvqd4FiwLMcsaHYl5EN jTE4nYqO6dcj8OEAe/r6QNFo9eDp6ETycJvncvnWzXg/tKTNGNNkrXryObVuCEhGDNRNAv2gxbuV7 9/7IyfPhb/NiGk7q61Bg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pQDaJ-003BHE-7A; Thu, 09 Feb 2023 20:31:59 +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 1pQDaE-003BFx-9D for linux-arm-kernel@lists.infradead.org; Thu, 09 Feb 2023 20:31: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 A72134B3; Thu, 9 Feb 2023 12:32:28 -0800 (PST) Received: from slackpad.lan (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 4AC993F703; Thu, 9 Feb 2023 12:31:44 -0800 (PST) Date: Thu, 9 Feb 2023 20:29:52 +0000 From: Andre Przywara To: Andreas Feldner Cc: Andreas Feldner , Rob Herring , Krzysztof Kozlowski , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, Maxime Ripard Subject: Re: [PATCH] ARM: dts: allwinner: minimize irq debounce filter per default Message-ID: <20230209202952.673d5a60@slackpad.lan> In-Reply-To: References: <20230207011608.2ce24d17@slackpad.lan> 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-20230209_123154_461945_F8D0DCF3 X-CRM114-Status: GOOD ( 73.97 ) 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 T24gV2VkLCA4IEZlYiAyMDIzIDEzOjUwOjA0ICswMTAwCkFuZHJlYXMgRmVsZG5lciA8YW5kcmVh c0BmZWxkbmVyLWJ2LmRlPiB3cm90ZToKCkhpIEFuZHJlYXMsCgpDQzppbmcgTWF4aW1lLCB3aG8g d3JvdGUgdGhlIGRlYm91bmNpbmcgY29kZSBiYWNrIHRoZW4uCgo+IEFtIDA3LjAyLjIzIHVtIDAy OjE2IHNjaHJpZWIgQW5kcmUgUHJ6eXdhcmE6Cj4gPiBPbiBNb24sIDYgRmViIDIwMjMgMjA6NTE6 NTAgKzAxMDAKPiA+IEFuZHJlYXMgRmVsZG5lciA8cGVsemlAZmx5aW5nLXNuYWlsLmRlPiB3cm90 ZToKPiA+Cj4gPiBIaSBBbmRyZWFzLAo+ID4KPiA+IHRoYW5rcyBmb3IgdGFraW5nIGNhcmUgYWJv dXQgdGhpcyBib2FyZCBhbmQgc2VuZGluZyBwYXRjaGVzISAgCj4gVGhhbmsgWU9VIGZvciBtYWlu dGFpbmluZyBpdCEKPiA+PiBUaGUgU29DIGZlYXR1cmVzIGRlYm91bmNlIGxvZ2ljIGZvciBleHRl cm5hbCBpbnRlcnJ1cHRzLiBQZXIgZGVmYXVsdCwKPiA+PiB0aGlzIGlzIGJhc2VkIG9uIGEgMzJr SHogb3NjaWxsYXRvciwgaW4gZWZmZWN0IGZpbHRlcmluZyBhd2F5IG11bHRpcGxlCj4gPj4gaW50 ZXJydXB0cyBzZXBhcmF0ZWQgYnkgbGVzcyB0aGFuIHJvdWdobHkgMTAww6/Cv8K9cy4KPiA+Pgo+ ID4+IFRoaXMgcGF0Y2ggc2V0cyBkaWZmZXJlbnQgZGVmYXVsdHMgZm9yIHRoaXMgZmlsdGVyIGZv ciB0aGlzIGJvYXJkOgo+ID4+IFBHIGlzIGNvbm5lY3RlZCB0byBub24tbWVjaGFuaWNhbCBjb21w b25lbnRzLCB3aXRob3V0IGFueSByaXNrIGZvcgo+ID4+IHNob3dpbmcgYm91bmNlcy4gUEEgaXMg bW9zdGx5IGV4cG9zZWQgdG8gR1BJTyBwaW5zLCBob3dldmVyIHRoZQo+ID4+IGV4aXN0ZW5jZSBv ZiBhIGRlYm91bmNlIGZpbHRlciBpcyB1bmRlc2lyYWJsZSBhcyB3ZWxsIGlmIGVsZWN0cm9uaWMK PiA+PiBjb21wb25lbnRzIGFyZSBjb25uZWN0ZWQuICAKPiA+IFNvIGhvdyBkbyB5b3Uga25vdyBp ZiB0aGF0J3MgdGhlIGNhc2U/IEl0IHNlZW1zIHRvIGJlIHF1aXRlIG5vcm1hbCB0bwo+ID4ganVz dCBjb25uZWN0IG1lY2hhbmljYWwgc3dpdGNoZXMgdG8gR1BJTyBwaW5zLgo+ID4KPiA+IElmIHlv dSBhcmUgdHJ5aW5nIHRvIGZpeCBhIHBhcnRpY3VsYXIgaXNzdWUgeW91IGVuY291bnRlcmVkLCBw bGVhc2UKPiA+IGRlc2NyaWJlIHRoYXQgaGVyZSwgYW5kIHNheSBob3cgKG9yIGF0IGxlYXN0IHRo YXQpIHRoZSBwYXRjaCBmaXhlcyBpdC4KPiA+Cj4gPiBBbmQgSSB3b3VsZCBzdWdnZXN0IHRvIHRy ZWF0IHBvcnQgRyBhbmQgcG9ydCBBIGRpZmZlcmVudGx5LiBJZiB5b3UKPiA+IG5lZWQgYSBsb3dl ciBkZWJvdW5jZSB0aHJlc2hvbGQgZm9yIHBvcnQgQSwgeW91IGNhbiBhcHBseSBhIERUIG92ZXJs YXkKPiA+IGluIFUtQm9vdCwganVzdCBmb3IgeW91ciBib2FyZC4gIAo+IAo+IEZhaXIgZW5vdWdo LiBZb3UgcnVuIGludG8gcHJvYmxlbXMgd2hlbiB5b3UgY29ubmVjdCAoZWxlY3Ryb25pYykKPiBk ZXZpY2VzIHRvIGJhbmsgQSAodHlwaWNhbGx5IGJ5IHRoZSA0MHBpbiBDT04yIGNvbm5lY3Rvciks IHdoZXJlCj4gdGhlIGRyaXZlciByZXF1aXJlcyBmYXN0IElSUXMgdG8gd29yay4gSW4gbXkgY2Fz ZSB0aGlzIGhhcyBiZWVuIGEKPiBESFQyMiBzZW5zb3IsIGFuZCB0aGUgZGVmYXVsdCBkZWJvdW5j ZSBicmVha2luZyB0aGUgZGh0MTEua28KPiBkcml2ZXIuCgpTdXJlLCB3aGF0IEkgbWVhbnQgaXMg dGhhdCB0aGlzIGlzIGEgcHJvcGVydHkgb2YgeW91ciBwYXJ0aWN1bGFyCnNldHVwIChiZWNhdXNl IHlvdSBhdHRhY2ggc29tZXRoaW5nIHRvIHRoZSAqaGVhZGVycyopICwgc28gaXQgc2hvdWxkbid0 CmJlIGluIHRoZSBnZW5lcmljIERULCBidXQganVzdCBpbiB5b3VyIGNvcHkuIFdoaWNoIGlkZWFs bHkgbWVhbnMgdXNpbmcKYSBEVCBvdmVybGF5LgoKPiBOb3csIHdoYXQga2luZCBvZiBwcm9ibGVt IGlzIHRoaXMgLSBJJ20gbm8gd2F5IHN1cmU6Cj4gCj4gYSkgaXMgaXQgYW4gdW5sdWNreSBkZWZh dWx0LCBiZWNhdXNlIHdob2V2ZXIgY29ubmVjdHMgYSBtZWNoYW5pY2FsCj4gc3dpdGNoIHdpbGwg a25vdyBhYm91dCB0aGUgcHJvYmxlbSBvZiBib3VuY2luZyBhbmQgYmUgdGFraW5nCj4gY2FyZSB0 byBkZWFsIHdpdGggaXQgKHdoZXJlYXMgYXQgbGVhc3QgSSB3YXMgY29tcGxldGUgdW5zdXNwZWN0 aW5nCj4gd2hlbiBjb25uZWN0aW5nIGFuIGVsZWN0cm9uaWMgZGV2aWNlIHRoYXQgYSBkZWJvdW5j ZSBmdW5jdGlvbgo+IG1pZ2h0IGJlIGluIHBsYWNlKSwgb3IKClRoZSBMaW51eCBkZWZhdWx0IGlz IGJhc2ljYWxseSB0aGUgcmVzZXQgZGVmYXVsdDoganVzdCBsZWF2ZSB0aGUKcmVnaXN0ZXIgYXQg MHgwLiBJdCBzZWVtcyBsaWtlIHlvdSBjYW5ub3QgcmVhbGx5IHR1cm4gdGhhdCBvZmYgYXQgYWxs CmluIGhhcmR3YXJlLCBhbmQgdGhlIHJlc2V0IHNldHRpbmcgaXMgaW5kZWVkIDMyS0h6LzEuIFNv IGZhciB0aGVyZQpoYXZlbid0IGJlZW4gYW55IGNvbXBsYWludHMsIHRob3VnaCBJIGRvbid0IGtu b3cgaWYgcGVvcGxlIGp1c3QKZG9uJ3QgdXNlIGl0IGluIGFuZ2VyLCBvciBjYW5ub3QgYmUgYm90 aGVyZWQgdG8gc2VuZCBhIHJlcG9ydCB0byB0aGUKbGlzdC4KCj4gYikgaXMgaXQgYSBidWcgaW4g dGhlIGRldmljZXRyZWUgZm9yIChhdCBsZWFzdCkgdGhlIEJhbmFuYVBpIE0yIFplcm8sCj4gYmVj YXVzZSB0aGUgSVJRIGJhbmsgRyBpcyBoYXJkIHdpcmVkIHRvIGVsZWN0cm9uaWMgZGV2aWNlcyB0 aGF0Cj4gc2hvdWxkIG5vdCBiZSBmZW5jZWQgYnkgYSBkZWJvdW5jaW5nIGZ1bmN0aW9uLCBvcgoK V2VsbCwgd2UgY291bGQgdHJ5IHRvIHR1cm4gdGhhdCAib2ZmIiBhcyBtdWNoIGFzIHBvc3NpYmxl LCBidXQgb24gdGhlCm90aGVyIGhhbmQgdGhlIGRlYm91bmNlIG9ubHkgYWZmZWN0cyAqR1BJTyog KmludGVycnVwdHMqLCBzbyBub3Qgc3VyZQp0aGF0IGdpdmVzIHVzIGFueXRoaW5nLiBUaGUgUG9y dEcgcGlucyBhcmUgdXNlZCBmb3IgdGhlIFNESU8gV2lmaSwgQlQKVUFSVCwgYW5kIHRoZSB3YWtl dXAgcGlucyBmb3IgdGhlIFdpZmkgY2hpcC4gT25seSB0aGUgd2FrZXVwIHBpbnMgd291bGQKYmUg YWZmZWN0ZWQsIGFuZCBJIGRvdWJ0IHRoYXQgd2Ugd2FrZSB1cCB0aGF0IG9mdGVuIHRoYXQgaXQg bWF0dGVycy4gSWYKeW91J3ZlIG1hZGUgb3RoZXIgb2JzZXJ2YXRpb25zLCBwbGVhc2UgbGV0IG1l IGtub3cuCgpDZXJ0YWlubHkgbm8gYm9hcmQgd2l0aCBhbiBpbi10cmVlIERUIHNldHMgdGhlIGRl Ym91bmNlIHByb3BlcnR5LCB3aGljaAptZWFucyBldmVyeW9uZSB1c2VzIDMyS0h6LzEsIGFuZCBh bHNvIGRpZCBzbyBiZWZvcmUgdGhlIGZ1bmN0aW9uYWxpdHkKd2FzIGludHJvZHVjZWQuCgpJJ2Qg c2F5IHdlIHNob3VsZCB0cnkgdG8gb25seSBmaXggdGhpbmdzIHRoYXQgYXJlIGFjdHVhbGx5IGJy b2tlbjogaGVuY2UKSSB3YXMgYXNraW5nIHdoZXRoZXIgeW91IGhhdmUgc2VlbiBhY3R1YWwgcHJv YmxlbXMuIFdoaWNoIGFwcGFyZW50bHkgeW91CmhhdmUsIHdpdGggeW91ciBzZW5zb3IsIGJ1dCBu b3Qgb24gUG9ydEc/Cgo+IGMpIGlzIGl0IG1pc3NpbmcgZHQgYmluZGluZyBkb2N1bWVudGF0aW9u IG9mIHRoZSBpbnB1dC1kZWJvdW5jZQo+IGF0dHJpYnV0ZT8KCkRvY3VtZW50YXRpb24gZm9yIHdo YXQsIGV4YWN0bHk/IFRoZSBkZWZhdWx0IGJlaGF2aW91cj8gWWVzLCB3ZSBzaG91bGQKYWRkIHRo YXQsIHRob3VnaCBub3Qgc3VyZSB0aGF0IHJlYWxseSBiZWxvbmdzIGludG8gdGhlIGJpbmRpbmcu Cgo+IEFueXdheSwgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZXNlIGlzIHF1aXRlIGlycml0YXRpbmcu IFRvIG1lIGl0Cj4gc2VlbXMgYSBzdWZmaWNpZW50bHkgZWxlZ2FudCBzb2x1dGlvbiB0byBleHBs aWNpdGx5IGluY2x1ZGUgdGhlCj4gc2V0dGluZyBpbiB0aGUgZGV2aWNldHJlZSBhbmQgbGVhdmUg aXQgdG8gd2hvZXZlciBpcyB1bmhhcHB5Cj4gd2l0aCBpdCwgdG8gY3JlYXRlIGEgYmV0dGVyIHN1 aXRlZCBkZXZpY2UgdHJlZSBvdmVybGF5Lgo+IAo+ID4+IEFkZGl0aW9uYWxseSwgdGhlIGNsb2Nr LWZyZXF1ZW5jeSBhdHRyaWJ1dGUgaXMgYWRkZWQgZm9yIGVhY2ggb2YKPiA+PiB0aGUgNCBjb3Jl cyB0byBlbGltaW5hdGUgdGhlIGtlcm5lbCBlcnJvciBtZXNzYWdlIG9uIGJvb3QsIHRoYXQKPiA+ PiB0aGUgYXR0cmlidXRlIGlzIG1pc3NpbmcuCj4gPj4KPiA+PiBTaWduZWQtb2ZmLWJ5OiBBbmRy ZWFzIEZlbGRuZXIgPHBlbHppQGZseWluZy1zbmFpbC5kZT4KPiA+PiAtLS0KPiA+PiAgIC4uLi9k dHMvc3VuOGktaDItcGx1cy1iYW5hbmFwaS1tMi16ZXJvLmR0cyAgICAgfCAxOCArKysrKysrKysr KysrKysrKysKPiA+PiAgIDEgZmlsZSBjaGFuZ2VkLCAxOCBpbnNlcnRpb25zKCspCj4gPj4KPiA+ PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuOGktaDItcGx1cy1iYW5hbmFwaS1t Mi16ZXJvLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjhpLWgyLXBsdXMtYmFuYW5hcGktbTIt emVyby5kdHMKPiA+PiBpbmRleCBkNzI5YjdjNzA1ZGIuLjFmYzBkNWQxZTUxYSAxMDA2NDQKPiA+ PiAtLS0gYS9hcmNoL2FybS9ib290L2R0cy9zdW44aS1oMi1wbHVzLWJhbmFuYXBpLW0yLXplcm8u ZHRzCj4gPj4gKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuOGktaDItcGx1cy1iYW5hbmFwaS1t Mi16ZXJvLmR0cwo+ID4+IEBAIC0xMTMsNiArMTEzLDIyIEBAIHdpZmlfcHdyc2VxOiB3aWZpX3B3 cnNlcSB7Cj4gPj4gICAKPiA+PiAgICZjcHUwIHsKPiA+PiAgIAljcHUtc3VwcGx5ID0gPCZyZWdf dmRkX2NwdXg+Owo+ID4+ICsJY2xvY2stZnJlcXVlbmN5ID0gPDEyOTYwMDAwMDA+OyAgCj4gPiBJ IHNlZSB3aGVyZSB5b3UgYXJlIGNvbWluZyBmcm9tLCB0aGlzIGlzIHJlYWxseSBhbiB1bm5lY2Vz c2FyeSB3YXJuaW5nCj4gPiBtZXNzYWdlLiBIb3dldmVyIHRoaXMgbWVzc2FnZSBzaG91bGQgYmUg cmVhbGx5IHJlbW92ZWQgZnJvbSB0aGUga2VybmVsCj4gPiBpbnN0ZWFkIG9mIGFkZGluZyBzb21l IHJhdGhlciBtZWFuaW5nbGVzcyB2YWx1ZSBoZXJlLgo+ID4gVGhlIGN1cnJlbnQgRFQgc3BlYyBt YXJrcyB0aGlzIHByb3BlcnR5IGFzIHJlcXVpcmVkLCB0aG91Z2gsIHNvIEkgYWRkZWQKPiA+IGEg UFIgdGhlcmUgdG8gZ2V0IHRoaXMgZml4ZWQ6Cj4gPiBodHRwczovL2dpdGh1Yi5jb20vZGV2aWNl dHJlZS1vcmcvZGV2aWNldHJlZS1zcGVjaWZpY2F0aW9uL3B1bGwvNjEKPiA+IE9uY2UgdGhpcyBp cyB0aHJvdWdoLCB3ZSBjYW4gdHJ5IHRvIHJlbW92ZSB0aGUga2VybmVsIG1lc3NhZ2UuICAKPiAK PiBPSywgc28gSSdsbCB0YWtlIGNhcmUgdG8gaGF2ZSB0aGlzIGNoYW5nZSByZW1vdmVkIGZyb20g bXkgcGF0Y2guCj4gSSB0aG91Z2h0IHNvLCBidXQgdGhlbiBpdCB3YXMgdGhlIGNvbmZpZ3VyYXRp b24gSSdkIGJlZW4gdGVzdGluZyB3aXRoLi4uCj4gCj4gPj4gK307Cj4gPj4gKwo+ID4+ICsmY3B1 MSB7Cj4gPj4gKwljcHUtc3VwcGx5ID0gPCZyZWdfdmRkX2NwdXg+OyAgCj4gPiBJIGRvbid0IHRo aW5rIHdlIG5lZWQgdGhpcyBmb3IgZXZlcnkgY29yZT8gIAo+IAo+IEkgY2FtZSBhY3Jvc3MgYSBk aXNjdXNzaW9uIHRoYXQgdGhpcyB3YXMgbWFya2VkIHJlcXVpcmVkIG9uIHRoZQo+IGNwdUAuLi4g bGV2ZWwgd2hlcmVhcyBpdCB3b3VsZCBtYWtlIHNlbnNlIG9uIHRoZSBjcHVzIGxldmVsLiBJIGRp ZAo+IG5vdCBjaGVjayBpZiB0aGlzIHN1Z2dlc3Rpb24gd2FzIGltcGxlbWVudGVkIGluIHRoZSBt ZWFudGltZSwKPiBzb3JyeSEKPiAKPiA+PiArCWNsb2NrLWZyZXF1ZW5jeSA9IDwxMjk2MDAwMDAw PjsKPiA+PiArfTsKPiA+PiArCj4gPj4gKyZjcHUyIHsKPiA+PiArCWNwdS1zdXBwbHkgPSA8JnJl Z192ZGRfY3B1eD47Cj4gPj4gKwljbG9jay1mcmVxdWVuY3kgPSA8MTI5NjAwMDAwMD47Cj4gPj4g K307Cj4gPj4gKwo+ID4+ICsmY3B1MyB7Cj4gPj4gKwljcHUtc3VwcGx5ID0gPCZyZWdfdmRkX2Nw dXg+Owo+ID4+ICsJY2xvY2stZnJlcXVlbmN5ID0gPDEyOTYwMDAwMDA+Owo+ID4+ICAgfTsKPiA+ PiAgIAo+ID4+ICAgJmRlIHsKPiA+PiBAQCAtMTkzLDYgKzIwOSw4IEBAIGJsdWV0b290aCB7Cj4g Pj4gICB9Owo+ID4+ICAgCj4gPj4gICAmcGlvIHsKPiA+PiArCS8qIDHDr8K/wr1zIGRlYm91bmNl IGZpbHRlciBvbiBib3RoIElSUSBiYW5rcyAqLyAgCj4gPiBJcyB0aGF0IHN1cHBvc2VkIHRvIGJl IDxtaWNybz4gaW4gVVRGLTg/IEl0IHNlZW1zIHRvIGhhdmUgZ290IGxvc3QgaW4KPiA+IHRyYW5z bGF0aW9uLCBvciBpcyB0aGF0IGp1c3QgbWU/ICAKPiBPIHllcywgdGhlIEdyZWVrIGNoYXJhY3Rl ciBzbGlwcGVkIGludG8gdGhlIGNvbW1lbnQuCj4gPj4gKwlpbnB1dC1kZWJvdW5jZSA9IDwxIDE+ OyAgCj4gPiBBcyBtZW50aW9uZWQgYWJvdmUsIEkgYW0gbm90IHNvIHN1cmUgdGhpcyBpcyBnZW5l cmljIGVub3VnaCB0byBwdXQgaXQKPiA+IGhlcmUgZm9yIFBBLiBBbmQgd2hhdCBpcyB0aGUgc2ln bmlmaWNhbmNlIG9mICIxIHVzIiwgaW4gcGFydGljdWxhcj8gSXMKPiA+IHRoYXQganVzdCB0aGUg c21hbGxlc3QgdmFsdWU/ICAKPiAKPiBZZXMgaW5kZWVkIGl0J3MgYSBiaXQgbW9yZSBjb21wbGlj YXRlZCB0aGFuIEkgZmVlbCBpdCBuZWVkcyB0byBiZS4gVGhlCj4gY29uZmlndXJhdGlvbiBpcyB0 YWtlbiBhcyBtaWNyb3NlY29uZHMgYW5kIHRyYW5zbGF0ZWQgaW50byB0aGUgYmVzdAo+IG1hdGNo aW5nIGNsb2NrIGFuZCBkaXZpZGVyIGJ5IHRoZSBkcml2ZXIuIEhvd2V2ZXIsIDAgaXMgbm90IHRy YW5zbGF0ZWQKPiB0byB0aGUgbG93ZXN0IGRpdmlkZXIgb2YgdGhlIGhpZ2ggc3BlZWQgY2xvY2sg YXMgd291bGQgYmUgbG9naWNhbCBpZgo+IHlvdSBhc2sgZm9yIHplcm8gbWljcm9zZWNvbmRzLCBi dXQgdG8gImxlYXZlIGF0IGRlZmF1bHQiLiBUaGUgZGVmYXVsdAo+IG9mIHRoZSBib2FyZCBpcyAw IGluIHRoZSByZWdpc3RlciwgdHJhbnNsYXRpbmcgdG8gbG93ZXN0IGRpdmlkZXIgb24gdGhlCj4g X2xvd18gc3BlZWQgY2xvY2suCgpJJ2Qgc2F5IHRoZSAiaWYgKCFkZWJvdW5jZSkgY29udGludWU7 IiBjb2RlIGlzIGp1c3QgdG8gZGVmZW5kIGFnYWluc3QKdGhlIGRpdmlzaW9uIGJ5IHplcm8sIHdo aWNoIHdvdWxkIGJlIHRoZSBuZXh0IHN0YXRlbWVudCB0byBleGVjdXRlLgoKV2UgbWlnaHQgd2Fu dCB0byBjaGFuZ2UgdGhhdCB0byBpbnRlcnByZXQgMCBhcyAibG93ZXN0IHBvc3NpYmxlIiwgd2hp Y2gKd291bGQgYmUgMjRNSHovMS4gUGxlYXNlIGZlZWwgZnJlZSB0byBzZW5kIGEgcGF0Y2ggaW4g dGhpcyByZWdhcmQsIGFuZApDQzogTWF4aW1lLCB0byBnZXQgc29tZSBpbnB1dCBvbiB0aGF0IGlk ZWEuCgo+IFRvIG1lIHRoaXMgaXMgbWluZGJvZ2dsaW5nLgo+IAo+IElmIHlvdSB3YW50IHRvIGtl ZXAgSVJRIGJhbmsgQSBhcyBpdCBpcyB0b2RheSBhbmQgc3dpdGNoIG9mZiB0aGUKPiBkZWZpbml0 ZWx5IHVubmVjZXNzYXJ5IChhbmQgX3BvdGVudGlhbGx5XyBJUlEgZWF0aW5nKSBkZWJvdW5jZSBv ZmYKPiBmb3IgYmFuayBHIG9ubHksIEknZCBzdWdnZXN0IHRoZSBmb2xsb3dpbmcgc2V0dGluZzoK PiAKPiAgwqDCoMKgIGlucHV0LWRlYm91bmNlID0gPDMxIDE+OwoKSXQgc2hvdWxkIGJlIGRvY3Vt ZW50ZWQgdGhhdCB0aGUgZWZmZWN0aXZlIGRlZmF1bHQgaXMgMzEsIEkgZ3Vlc3MgdGhlCmJpbmRp bmcgaXMgdGhlIHJpZ2h0IHBsYWNlLgoKPiBUaGlzIGlzIGJlY2F1c2UgMzEgTWljcm9zZWNvbmRz IGlzIGV4YWN0bHkgdGhlIHRpbWUgdGhhdCBpcyBiZXN0Cj4gbWF0Y2hlZCBieSB0aGUgbG93IHNw ZWVkIGNsb2NrIHdpdGggbG93IGRpdmlkZXIgYW5kIHRyYW5zbGF0ZWQKPiB0byBhIDAgaW4gdGhl IGNvbmZpZyByZWdpc3RlciBieSB0aGUgZHJpdmVyLgo+IAo+IFRoZSBhYnNvbHV0ZWx5IGVxdWl2 YWxlbnQgc2V0dGluZywgd2l0aCB0aGUgb25seSBkcmF3YmFjayB0aGF0IGl0Cj4gd291bGQgaGF2 ZSBjb25mdXNlZCBtZSB0byBkZWF0aCBpczoKPiAKPiAgwqDCoMKgIGlucHV0LWRlYm91bmNlID0g PDAgMT47Cj4gCj4gKGJlY2F1c2UgaXQgc2tpcHMgc2V0dGluZyBJUlEgYmFuayBBIGRlYm91bmNp bmcsIGxlYXZpbmcgaXQgYXQgMzEuMjUgdXMpCj4gCj4gT3IsIGFuZCB0aGF0IHdhcyBteSBzdWdn ZXN0aW9uLCB5b3Ugc2V0IGJvdGggY29ycmVjdGx5IGZvcgo+IGVsZWN0cm9uaWMgZGV2aWNlcyBh bmQgbGVhdmUgdGhlIHRhc2sgb2Ygc3dpdGNoaW5nIG9uIGRlYm91bmNpbmcKPiB0byB0aGUgaW1w bGVtZW50b3JzIG9mIGFwcGxpY2F0aW9ucyB3aXRoIG1lY2hhbmljYWwgc3dpdGNoZXM6Cj4gCj4g IMKgwqDCoCBpbnB1dC1kZWJvdW5jZSA9IDwxIDE+Owo+IAo+IFRvIG1lLCBhbnkgb2YgdGhlc2Ug YmVpbmcgcHJlc2VudCBpbiB0aGUgZGV2aWNldHJlZSB3b3VsZCBoYXZlIGJlZW4KPiBvZiBncmVh dCBoZWxwLCBiZWNhdXNlIEkgd291bGQgaGF2ZSBzZWVuIHRoYXQgdGhlcmUgaXMgc29tZXRoaW5n Cj4gdG8gc2V0Lgo+IAo+IAo+IE9uZSBmaW5hbCBxdWVzdGlvbjogaG93IHdvdWxkIHlvdSBsaWtl IHRoaXMgY2hhbmdlOgo+IAo+IC0tLSBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1 bnhpLmMKPiArKysgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW54aS5jCj4gQEAg LTE0NjcsNiArMTQ2NywxMCBAQCBzdGF0aWMgaW50IHN1bnhpX3BpbmN0cmxfc2V0dXBfZGVib3Vu Y2Uoc3RydWN0IAo+IHN1bnhpX3BpbmN0cmwgKnBjdGwsCj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB3cml0ZWwoc3JjIHwgZGl2IDw8IDQsCj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBjdGwtPm1lbWJhc2UgKwo+IHN1bnhpX2lycV9kZWJv dW5jZV9yZWdfZnJvbV9iYW5rKHBjdGwtPmRlc2MsIGkpKTsKPiArCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgcHJfaW5mbygiRGVib3VuY2UgZmlsdGVyIGZvciBJUlEgYmFuayAlZCBj b25maWd1cmVkIHRvICIKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgIiVkIHVzIChyZWcgJXgpXG4iLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBpLCBkZWJvdW5jZSwgc3JjIHwgZGl2IDw8IDQpOwoKVGhhdCBsb29r cyBjZXJ0YWlubHkgdXNlZnVsLCBwbGVhc2Ugc2VuZCBhIHByb3BlciBwYXRjaC4KCkNoZWVycywK QW5kcmUKCj4gIMKgwqDCoMKgwqDCoMKgIH0KPiAKPiAgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDA7 Cj4gCj4gSXQgaGVscGVkIG1lIHRvIGNyb3NzLWNoZWNrIHdoYXQgdGhlIGRyaXZlciBpcyByZWFs bHkgZG9pbmcsIGFuZCBpdAo+IGFnYWluIHdvdWxkIGhhdmUgaGVscGVkIG1lIHdpdGggbWUgREhU IHByb2JsZW0gdG8gbGVhcm4gYWJvdXQKPiB0aGUgZXhpc3RlbmNlIG9mIGEgZGVib3VuY2luZyBm aWx0ZXIuCj4gCj4gWW91cnMsCj4gCj4gQW5kcmVhcy4KPiAKPiAKCgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcg bGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmlu ZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==