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 9EA182F27 for ; Sat, 11 Feb 2023 15:15:59 +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 5EA3D4B3; Sat, 11 Feb 2023 07:16:41 -0800 (PST) Received: from slackpad.lan (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 2C2873F71E; Sat, 11 Feb 2023 07:15:57 -0800 (PST) Date: Sat, 11 Feb 2023 15:13:58 +0000 From: Andre Przywara To: pelzi@flying-snail.de Cc: Maxime Ripard , 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 Subject: Re: [PATCH] ARM: dts: allwinner: minimize irq debounce filter per default Message-ID: <20230211151358.3467b4f9@slackpad.lan> In-Reply-To: References: <20230207011608.2ce24d17@slackpad.lan> <20230209202952.673d5a60@slackpad.lan> <20230210082936.qefzz4fsp3jpalvp@houat> <20230210094425.474cfba5@donnerap.cambridge.arm.com> <20230210100620.z6j7rvkiwyu7paij@houat> <20230210101814.2d36ae57@donnerap.cambridge.arm.com> 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 Sat, 11 Feb 2023 13:50:54 +0100 pelzi@flying-snail.de wrote: Hi, > Am 10.02.23 um 11:18 schrieb Andre Przywara: > > On Fri, 10 Feb 2023 11:06:20 +0100 > > Maxime Ripard wrote: > > =20 > >> On Fri, Feb 10, 2023 at 09:44:25AM +0000, Andre Przywara wrote: =20 > >>> On Fri, 10 Feb 2023 09:29:36 +0100 > >>> Maxime Ripard wrote: > >>> > >>> Hi Maxime, > >>> > >>> thanks for the reply! > >>> =20 > >>>> On Thu, Feb 09, 2023 at 08:29:52PM +0000, Andre Przywara wrote: =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 los= t in > >>>>>>> translation, or is that just me? =20 > >>>>>> O yes, the Greek character slipped into the comment. =20 > >>>>>>>> + input-debounce =3D <1 1>; =20 > >>>>>>> As mentioned above, I am not so sure this is generic enough to pu= t it > >>>>>>> here for PA. And what is the significance of "1 us", in particula= r? Is > >>>>>>> that just the smallest value? =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 transl= ated > >>>>>> 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 defa= ult > >>>>>> of the board is 0 in the register, translating to lowest divider o= n the > >>>>>> _low_ speed clock. =20 > >>>>> I'd say the "if (!debounce) continue;" code is just to defend again= st > >>>>> the division by zero, which would be the next statement to execute. > >>>>> > >>>>> We might want to change that to interpret 0 as "lowest possible", w= hich > >>>>> would be 24MHz/1. Please feel free to send a patch in this regard, = and > >>>>> CC: Maxime, to get some input on that idea. =20 > >>>> I never had any complaint on that part either, so the default looks = sane > >>>> to me. > >>>> > >>>> If some board needs a higher debouncing rate, then we should obvious= ly > >>>> set it up in the device tree of that board, but changing it for every > >>>> user also introduces the risk of breaking other boards that actually > >>>> require a lower debouncing frequency. =20 > >>> Yeah, we definitely should keep the default at 32KHz/1, as this is al= so > >>> the hardware reset value. > >>> > >>> Not sure if you were actually arguing this, but the change I sketched > >>> above (interpreting 0 as 24MHz/1) is separate though, as the current > >>> default is "no DT property", and not 0. There is no input-debounce > >>> property user in the kernel tree at the moment, so we wouldn't break > >>> anyone. The only thing that would change is if a downstream user was > >>> relying on "0" being interpreted as "skip the setup", which isn't > >>> really documented and could be argued to be an implementation detail. > >>> > >>> So I'd suggest to implement 0 as "lowest possible", and documenting t= hat > >>> and the 32KHz/1 default if no property is given. =20 > >> Ah, my bad. > >> > >> There's another thing to consider: there's already a generic per-pin > >> input-debounce property in pinctrl. > >> > >> Since we can't control it per pin but per bank, we moved it to the > >> controller back then, but there's always been this (implicit) > >> expectation that it was behaving the same way. > >> > >> And the generic, per-pin, input-debounce documentation says: > >> =20 > >>> Takes the debounce time in usec as argument or 0 to disable debouncin= g =20 > >> I agree that silently ignoring it is not great, but interpreting 0 as > >> the lowest possible is breaking that behaviour which, I believe, is a > >> worse outcome. =20 > > Is it really? If I understand the hardware manuals correctly, we cannot > > really turn that feature off, so isn't the lowest possible time period = (24 > > MHz/1 at the moment) the closest we can get to "turn it off"? So > > implementing this would bring us actually closer to the documented > > behaviour? Or did I get the meaning of this time period wrong? > > At least that's my understanding of how it fixed Andreas' problem: 1=C2= =B5s > > is still not "off", but much better than the 31=C2=B5s of the default. = The new > > 0 would then be 0.041=C2=B5s. =20 > I would fully agree. There seems to be no way to turn off the debouncing > filter, and in terms of that filter, the lowest possible time is closest= =20 > to "off". > The SoC default is equivalent to 31 us, far, far away from "off", the=20 > currently > configurable minimum is 1us. >=20 > I did a patch that enables to set "0" in the device tree configuration=20 > and it > takes care not to do a #div0, but to determine the lowest possible time. = As > the patch is done in the driver for a device that cannot switch off=20 > debouncing, > I'd say, the driver patched in that way does its best to come as close=20 > to the > intended outcome as is possible. >=20 > I tested this setting on the Banana M2 Zero board, and it is working (does > the right thing setting the relevant registers to value 0x0001, and the=20 > board > works in general, w/o producing smoke. (I have no idea how to test if > the debouncing filter is actually faster with setting "0" than with=20 > setting "1", > I can only confirm it is not significantly slower). >=20 > If we can agree on a concrete way to go I'm happy to try to produce a new > patch version. My suggestion from the discussion: >=20 > - Change drivers/pinctrl/sunxi/pinctrl-sunxi.c to set the minimum > =C2=A0=C2=A0 possible filter time when input-debounce is configured to "= 0" > =C2=A0=C2=A0 (corresponding to 1 on the affected hardware register). > =C2=A0=C2=A0 What I don't like is the huge gap between configuration 1 a= nd 0, but > =C2=A0=C2=A0 I have no idea what to do about it without breaking all com= patibility. I wouldn't be concerned about this gap, as 0 is supposed to mean off, so there is already an expectation of a fundamentally different behaviour. Plus the interface chose microseconds for a reason, I guess for mechanical debouncing a resolution of 1 microsecond is more than enough. Can you please send this patch, so that we can have any potential discussion there, on the code? And please add a Fixes: tag, so it can be backported to stable kernels. > - in arch/arm/boot/dts/sunxi-h3-h5.dtsi, set input-debounce <31 31> > =C2=A0=C2=A0 corresponding to the default "0" in both affected hardware = registers. > =C2=A0=C2=A0 Note that the clocks hosc and losc that make this 31 map to= 0 are > =C2=A0=C2=A0 configured exactly here. I am not fully decided on that, but there are some good points to it. > - in arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts, set > =C2=A0=C2=A0 input-debounce <31 0> as this board has electronic devices > =C2=A0=C2=A0 attached to bank G and only exposes bank A to its users. > =C2=A0=C2=A0 I'd like to advertise on that one: this board does not requ= ire > =C2=A0=C2=A0 debouncing on bank G. Plus it feels the board got more stab= le > =C2=A0=C2=A0 by this setting: my BananaPi is connected via WiFi (only) a= nd in the > =C2=A0=C2=A0 past it went apparently dead every other day or so. Nothing= like > =C2=A0=C2=A0 this happened after switching off input debounce. Anectdotal > =C2=A0=C2=A0 evidence, I know... I am not convinced of that, for the generic DT in the kernel tree. For a start, I wouldn't use 0, as this does not do the right thing on older kernels. But again, I haven't heard of error reports, so I am a bit reluctant to change that setting. There are reports of unstable WiFi, but IIUC mostly due to the poor WiFi chip design and quality or driver problems. If you can prove this more conclusively, that would be worth considering, though. > - (in my devicetree overlay, I set input-debounce <0 0> to make IRQ > =C2=A0=C2=A0 based drivers like drivers/iio/humidity/dht11.c work on ban= k A) - > =C2=A0=C2=A0 not part of the patch. Yes, but again I'd recommend to use <1 1>, as this is more compatible, in case you happen to load a stable kernel. > Would that appear right? >=20 > Best regards, >=20 > Andreas. >=20 > PS: Perhaps someone can point me to further reading regarding > drivers for electronic devices attached to GPIO. Assuming I want > to attach a device to a GPIO that is not accidentally covered by > hardware support of the pinctrl subsystem, what options do I > have _apart_ from registering edge IRQs to react on a digital > signal from that device? Isn't it called bit-banging and the > usual technique? I am not sure what you mean with "not accidentally covered ...", do you mean using a hardware peripheral interface like an I2C or SPI controller? Yes, there are some examples of bit-banging devices in the kernel, though it's not considered very efficient, but one might not have a choice, mostly. Cheers, Andre 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 070F0C636CC for ; Sat, 11 Feb 2023 15:17:17 +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=Cz+o0lEbFbDXfi1gJ7iL4nSqn4Ejmh6G3kyCa4uZx50=; b=E/8F1fzTIi4vNM iNCqXevoCOuCbhBTsYA93JZVjIRUK0nIyj4I+fUeoTueTrj3vAvs4EP1k7XHf8d8ymkGN9rQ60DIu ht0O1/rMED9IxpB/W6F8BFoPNIcIMC5pma/otglNcLaSOFDBKvboyV7TA0V3l0kMyK4G6m/Gocpw4 g3+ThwMSE6DLSSP0zRBaFtbOO5kmzcpSbtKJ1DoUKIUDDuvrWxf6YfX3skFkBijmwVh/UQgJzebD3 NBJ0A1s6Ah7Xhwl/3iZV9ha1ojHamfyyzT8Scdcsgs3i9iG2vKwsKa0RsTYkuEzlXbBAY+yH557NI 6UzVmiiI4rkEnlQwMhQg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pQrbn-009iu7-O9; Sat, 11 Feb 2023 15:16:11 +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 1pQrbh-009isc-S9 for linux-arm-kernel@lists.infradead.org; Sat, 11 Feb 2023 15:16:10 +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 5EA3D4B3; Sat, 11 Feb 2023 07:16:41 -0800 (PST) Received: from slackpad.lan (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 2C2873F71E; Sat, 11 Feb 2023 07:15:57 -0800 (PST) Date: Sat, 11 Feb 2023 15:13:58 +0000 From: Andre Przywara To: pelzi@flying-snail.de Cc: Maxime Ripard , 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 Subject: Re: [PATCH] ARM: dts: allwinner: minimize irq debounce filter per default Message-ID: <20230211151358.3467b4f9@slackpad.lan> In-Reply-To: References: <20230207011608.2ce24d17@slackpad.lan> <20230209202952.673d5a60@slackpad.lan> <20230210082936.qefzz4fsp3jpalvp@houat> <20230210094425.474cfba5@donnerap.cambridge.arm.com> <20230210100620.z6j7rvkiwyu7paij@houat> <20230210101814.2d36ae57@donnerap.cambridge.arm.com> 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-20230211_071607_736856_01D6F20F X-CRM114-Status: GOOD ( 74.30 ) 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 T24gU2F0LCAxMSBGZWIgMjAyMyAxMzo1MDo1NCArMDEwMApwZWx6aUBmbHlpbmctc25haWwuZGUg d3JvdGU6CgpIaSwKCj4gQW0gMTAuMDIuMjMgdW0gMTE6MTggc2NocmllYiBBbmRyZSBQcnp5d2Fy YToKPiA+IE9uIEZyaSwgMTAgRmViIDIwMjMgMTE6MDY6MjAgKzAxMDAKPiA+IE1heGltZSBSaXBh cmQgPG1heGltZUBjZXJuby50ZWNoPiB3cm90ZToKPiA+ICAKPiA+PiBPbiBGcmksIEZlYiAxMCwg MjAyMyBhdCAwOTo0NDoyNUFNICswMDAwLCBBbmRyZSBQcnp5d2FyYSB3cm90ZTogIAo+ID4+PiBP biBGcmksIDEwIEZlYiAyMDIzIDA5OjI5OjM2ICswMTAwCj4gPj4+IE1heGltZSBSaXBhcmQgPG1h eGltZUBjZXJuby50ZWNoPiB3cm90ZToKPiA+Pj4KPiA+Pj4gSGkgTWF4aW1lLAo+ID4+Pgo+ID4+ PiB0aGFua3MgZm9yIHRoZSByZXBseSEKPiA+Pj4gICAgICAKPiA+Pj4+IE9uIFRodSwgRmViIDA5 LCAyMDIzIGF0IDA4OjI5OjUyUE0gKzAwMDAsIEFuZHJlIFByenl3YXJhIHdyb3RlOiAgCj4gPj4+ Pj4+Pj4gICAgJnBpbyB7Cj4gPj4+Pj4+Pj4gKwkvKiAxw6/Cv8K9cyBkZWJvdW5jZSBmaWx0ZXIg b24gYm90aCBJUlEgYmFua3MgKi8gIAo+ID4+Pj4+Pj4gSXMgdGhhdCBzdXBwb3NlZCB0byBiZSA8 bWljcm8+IGluIFVURi04PyBJdCBzZWVtcyB0byBoYXZlIGdvdCBsb3N0IGluCj4gPj4+Pj4+PiB0 cmFuc2xhdGlvbiwgb3IgaXMgdGhhdCBqdXN0IG1lPyAgCj4gPj4+Pj4+IE8geWVzLCB0aGUgR3Jl ZWsgY2hhcmFjdGVyIHNsaXBwZWQgaW50byB0aGUgY29tbWVudC4gIAo+ID4+Pj4+Pj4+ICsJaW5w dXQtZGVib3VuY2UgPSA8MSAxPjsgIAo+ID4+Pj4+Pj4gQXMgbWVudGlvbmVkIGFib3ZlLCBJIGFt IG5vdCBzbyBzdXJlIHRoaXMgaXMgZ2VuZXJpYyBlbm91Z2ggdG8gcHV0IGl0Cj4gPj4+Pj4+PiBo ZXJlIGZvciBQQS4gQW5kIHdoYXQgaXMgdGhlIHNpZ25pZmljYW5jZSBvZiAiMSB1cyIsIGluIHBh cnRpY3VsYXI/IElzCj4gPj4+Pj4+PiB0aGF0IGp1c3QgdGhlIHNtYWxsZXN0IHZhbHVlPyAgCj4g Pj4+Pj4+IFllcyBpbmRlZWQgaXQncyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gSSBmZWVs IGl0IG5lZWRzIHRvIGJlLiBUaGUKPiA+Pj4+Pj4gY29uZmlndXJhdGlvbiBpcyB0YWtlbiBhcyBt aWNyb3NlY29uZHMgYW5kIHRyYW5zbGF0ZWQgaW50byB0aGUgYmVzdAo+ID4+Pj4+PiBtYXRjaGlu ZyBjbG9jayBhbmQgZGl2aWRlciBieSB0aGUgZHJpdmVyLiBIb3dldmVyLCAwIGlzIG5vdCB0cmFu c2xhdGVkCj4gPj4+Pj4+IHRvIHRoZSBsb3dlc3QgZGl2aWRlciBvZiB0aGUgaGlnaCBzcGVlZCBj bG9jayBhcyB3b3VsZCBiZSBsb2dpY2FsIGlmCj4gPj4+Pj4+IHlvdSBhc2sgZm9yIHplcm8gbWlj cm9zZWNvbmRzLCBidXQgdG8gImxlYXZlIGF0IGRlZmF1bHQiLiBUaGUgZGVmYXVsdAo+ID4+Pj4+ PiBvZiB0aGUgYm9hcmQgaXMgMCBpbiB0aGUgcmVnaXN0ZXIsIHRyYW5zbGF0aW5nIHRvIGxvd2Vz dCBkaXZpZGVyIG9uIHRoZQo+ID4+Pj4+PiBfbG93XyBzcGVlZCBjbG9jay4gIAo+ID4+Pj4+IEkn ZCBzYXkgdGhlICJpZiAoIWRlYm91bmNlKSBjb250aW51ZTsiIGNvZGUgaXMganVzdCB0byBkZWZl bmQgYWdhaW5zdAo+ID4+Pj4+IHRoZSBkaXZpc2lvbiBieSB6ZXJvLCB3aGljaCB3b3VsZCBiZSB0 aGUgbmV4dCBzdGF0ZW1lbnQgdG8gZXhlY3V0ZS4KPiA+Pj4+Pgo+ID4+Pj4+IFdlIG1pZ2h0IHdh bnQgdG8gY2hhbmdlIHRoYXQgdG8gaW50ZXJwcmV0IDAgYXMgImxvd2VzdCBwb3NzaWJsZSIsIHdo aWNoCj4gPj4+Pj4gd291bGQgYmUgMjRNSHovMS4gUGxlYXNlIGZlZWwgZnJlZSB0byBzZW5kIGEg cGF0Y2ggaW4gdGhpcyByZWdhcmQsIGFuZAo+ID4+Pj4+IENDOiBNYXhpbWUsIHRvIGdldCBzb21l IGlucHV0IG9uIHRoYXQgaWRlYS4gIAo+ID4+Pj4gSSBuZXZlciBoYWQgYW55IGNvbXBsYWludCBv biB0aGF0IHBhcnQgZWl0aGVyLCBzbyB0aGUgZGVmYXVsdCBsb29rcyBzYW5lCj4gPj4+PiB0byBt ZS4KPiA+Pj4+Cj4gPj4+PiBJZiBzb21lIGJvYXJkIG5lZWRzIGEgaGlnaGVyIGRlYm91bmNpbmcg cmF0ZSwgdGhlbiB3ZSBzaG91bGQgb2J2aW91c2x5Cj4gPj4+PiBzZXQgaXQgdXAgaW4gdGhlIGRl dmljZSB0cmVlIG9mIHRoYXQgYm9hcmQsIGJ1dCBjaGFuZ2luZyBpdCBmb3IgZXZlcnkKPiA+Pj4+ IHVzZXIgYWxzbyBpbnRyb2R1Y2VzIHRoZSByaXNrIG9mIGJyZWFraW5nIG90aGVyIGJvYXJkcyB0 aGF0IGFjdHVhbGx5Cj4gPj4+PiByZXF1aXJlIGEgbG93ZXIgZGVib3VuY2luZyBmcmVxdWVuY3ku ICAKPiA+Pj4gWWVhaCwgd2UgZGVmaW5pdGVseSBzaG91bGQga2VlcCB0aGUgZGVmYXVsdCBhdCAz MktIei8xLCBhcyB0aGlzIGlzIGFsc28KPiA+Pj4gdGhlIGhhcmR3YXJlIHJlc2V0IHZhbHVlLgo+ ID4+Pgo+ID4+PiBOb3Qgc3VyZSBpZiB5b3Ugd2VyZSBhY3R1YWxseSBhcmd1aW5nIHRoaXMsIGJ1 dCB0aGUgY2hhbmdlIEkgc2tldGNoZWQKPiA+Pj4gYWJvdmUgKGludGVycHJldGluZyAwIGFzIDI0 TUh6LzEpIGlzIHNlcGFyYXRlIHRob3VnaCwgYXMgdGhlIGN1cnJlbnQKPiA+Pj4gZGVmYXVsdCBp cyAibm8gRFQgcHJvcGVydHkiLCBhbmQgbm90IDAuIFRoZXJlIGlzIG5vIGlucHV0LWRlYm91bmNl Cj4gPj4+IHByb3BlcnR5IHVzZXIgaW4gdGhlIGtlcm5lbCB0cmVlIGF0IHRoZSBtb21lbnQsIHNv IHdlIHdvdWxkbid0IGJyZWFrCj4gPj4+IGFueW9uZS4gVGhlIG9ubHkgdGhpbmcgdGhhdCB3b3Vs ZCBjaGFuZ2UgaXMgaWYgYSBkb3duc3RyZWFtIHVzZXIgd2FzCj4gPj4+IHJlbHlpbmcgb24gIjAi IGJlaW5nIGludGVycHJldGVkIGFzICJza2lwIHRoZSBzZXR1cCIsIHdoaWNoIGlzbid0Cj4gPj4+ IHJlYWxseSBkb2N1bWVudGVkIGFuZCBjb3VsZCBiZSBhcmd1ZWQgdG8gYmUgYW4gaW1wbGVtZW50 YXRpb24gZGV0YWlsLgo+ID4+Pgo+ID4+PiBTbyBJJ2Qgc3VnZ2VzdCB0byBpbXBsZW1lbnQgMCBh cyAibG93ZXN0IHBvc3NpYmxlIiwgYW5kIGRvY3VtZW50aW5nIHRoYXQKPiA+Pj4gYW5kIHRoZSAz MktIei8xIGRlZmF1bHQgaWYgbm8gcHJvcGVydHkgaXMgZ2l2ZW4uICAKPiA+PiBBaCwgbXkgYmFk Lgo+ID4+Cj4gPj4gVGhlcmUncyBhbm90aGVyIHRoaW5nIHRvIGNvbnNpZGVyOiB0aGVyZSdzIGFs cmVhZHkgYSBnZW5lcmljIHBlci1waW4KPiA+PiBpbnB1dC1kZWJvdW5jZSBwcm9wZXJ0eSBpbiBw aW5jdHJsLgo+ID4+Cj4gPj4gU2luY2Ugd2UgY2FuJ3QgY29udHJvbCBpdCBwZXIgcGluIGJ1dCBw ZXIgYmFuaywgd2UgbW92ZWQgaXQgdG8gdGhlCj4gPj4gY29udHJvbGxlciBiYWNrIHRoZW4sIGJ1 dCB0aGVyZSdzIGFsd2F5cyBiZWVuIHRoaXMgKGltcGxpY2l0KQo+ID4+IGV4cGVjdGF0aW9uIHRo YXQgaXQgd2FzIGJlaGF2aW5nIHRoZSBzYW1lIHdheS4KPiA+Pgo+ID4+IEFuZCB0aGUgZ2VuZXJp YywgcGVyLXBpbiwgaW5wdXQtZGVib3VuY2UgZG9jdW1lbnRhdGlvbiBzYXlzOgo+ID4+ICAKPiA+ Pj4gVGFrZXMgdGhlIGRlYm91bmNlIHRpbWUgaW4gdXNlYyBhcyBhcmd1bWVudCBvciAwIHRvIGRp c2FibGUgZGVib3VuY2luZyAgCj4gPj4gSSBhZ3JlZSB0aGF0IHNpbGVudGx5IGlnbm9yaW5nIGl0 IGlzIG5vdCBncmVhdCwgYnV0IGludGVycHJldGluZyAwIGFzCj4gPj4gdGhlIGxvd2VzdCBwb3Nz aWJsZSBpcyBicmVha2luZyB0aGF0IGJlaGF2aW91ciB3aGljaCwgSSBiZWxpZXZlLCBpcyBhCj4g Pj4gd29yc2Ugb3V0Y29tZS4gIAo+ID4gSXMgaXQgcmVhbGx5PyBJZiBJIHVuZGVyc3RhbmQgdGhl IGhhcmR3YXJlIG1hbnVhbHMgY29ycmVjdGx5LCB3ZSBjYW5ub3QKPiA+IHJlYWxseSB0dXJuIHRo YXQgZmVhdHVyZSBvZmYsIHNvIGlzbid0IHRoZSBsb3dlc3QgcG9zc2libGUgdGltZSBwZXJpb2Qg KDI0Cj4gPiBNSHovMSBhdCB0aGUgbW9tZW50KSB0aGUgY2xvc2VzdCB3ZSBjYW4gZ2V0IHRvICJ0 dXJuIGl0IG9mZiI/IFNvCj4gPiBpbXBsZW1lbnRpbmcgdGhpcyB3b3VsZCBicmluZyB1cyBhY3R1 YWxseSBjbG9zZXIgdG8gdGhlIGRvY3VtZW50ZWQKPiA+IGJlaGF2aW91cj8gT3IgZGlkIEkgZ2V0 IHRoZSBtZWFuaW5nIG9mIHRoaXMgdGltZSBwZXJpb2Qgd3Jvbmc/Cj4gPiBBdCBsZWFzdCB0aGF0 J3MgbXkgdW5kZXJzdGFuZGluZyBvZiBob3cgaXQgZml4ZWQgQW5kcmVhcycgcHJvYmxlbTogMcK1 cwo+ID4gaXMgc3RpbGwgbm90ICJvZmYiLCBidXQgbXVjaCBiZXR0ZXIgdGhhbiB0aGUgMzHCtXMg b2YgdGhlIGRlZmF1bHQuIFRoZSBuZXcKPiA+IDAgd291bGQgdGhlbiBiZSAwLjA0McK1cy4gIAo+ IEkgd291bGQgZnVsbHkgYWdyZWUuIFRoZXJlIHNlZW1zIHRvIGJlIG5vIHdheSB0byB0dXJuIG9m ZiB0aGUgZGVib3VuY2luZwo+IGZpbHRlciwgYW5kIGluIHRlcm1zIG9mIHRoYXQgZmlsdGVyLCB0 aGUgbG93ZXN0IHBvc3NpYmxlIHRpbWUgaXMgY2xvc2VzdCAKPiB0byAib2ZmIi4KPiBUaGUgU29D IGRlZmF1bHQgaXMgZXF1aXZhbGVudCB0byAzMSB1cywgZmFyLCBmYXIgYXdheSBmcm9tICJvZmYi LCB0aGUgCj4gY3VycmVudGx5Cj4gY29uZmlndXJhYmxlIG1pbmltdW0gaXMgMXVzLgo+IAo+IEkg ZGlkIGEgcGF0Y2ggdGhhdCBlbmFibGVzIHRvIHNldCAiMCIgaW4gdGhlIGRldmljZSB0cmVlIGNv bmZpZ3VyYXRpb24gCj4gYW5kIGl0Cj4gdGFrZXMgY2FyZSBub3QgdG8gZG8gYSAjZGl2MCwgYnV0 IHRvIGRldGVybWluZSB0aGUgbG93ZXN0IHBvc3NpYmxlIHRpbWUuIEFzCj4gdGhlIHBhdGNoIGlz IGRvbmUgaW4gdGhlIGRyaXZlciBmb3IgYSBkZXZpY2UgdGhhdCBjYW5ub3Qgc3dpdGNoIG9mZiAK PiBkZWJvdW5jaW5nLAo+IEknZCBzYXksIHRoZSBkcml2ZXIgcGF0Y2hlZCBpbiB0aGF0IHdheSBk b2VzIGl0cyBiZXN0IHRvIGNvbWUgYXMgY2xvc2UgCj4gdG8gdGhlCj4gaW50ZW5kZWQgb3V0Y29t ZSBhcyBpcyBwb3NzaWJsZS4KPiAKPiBJIHRlc3RlZCB0aGlzIHNldHRpbmcgb24gdGhlIEJhbmFu YSBNMiBaZXJvIGJvYXJkLCBhbmQgaXQgaXMgd29ya2luZyAoZG9lcwo+IHRoZSByaWdodCB0aGlu ZyBzZXR0aW5nIHRoZSByZWxldmFudCByZWdpc3RlcnMgdG8gdmFsdWUgMHgwMDAxLCBhbmQgdGhl IAo+IGJvYXJkCj4gd29ya3MgaW4gZ2VuZXJhbCwgdy9vIHByb2R1Y2luZyBzbW9rZS4gKEkgaGF2 ZSBubyBpZGVhIGhvdyB0byB0ZXN0IGlmCj4gdGhlIGRlYm91bmNpbmcgZmlsdGVyIGlzIGFjdHVh bGx5IGZhc3RlciB3aXRoIHNldHRpbmcgIjAiIHRoYW4gd2l0aCAKPiBzZXR0aW5nICIxIiwKPiBJ IGNhbiBvbmx5IGNvbmZpcm0gaXQgaXMgbm90IHNpZ25pZmljYW50bHkgc2xvd2VyKS4KPiAKPiBJ ZiB3ZSBjYW4gYWdyZWUgb24gYSBjb25jcmV0ZSB3YXkgdG8gZ28gSSdtIGhhcHB5IHRvIHRyeSB0 byBwcm9kdWNlIGEgbmV3Cj4gcGF0Y2ggdmVyc2lvbi4gTXkgc3VnZ2VzdGlvbiBmcm9tIHRoZSBk aXNjdXNzaW9uOgo+IAo+IC0gQ2hhbmdlIGRyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1 bnhpLmMgdG8gc2V0IHRoZSBtaW5pbXVtCj4gIMKgwqAgcG9zc2libGUgZmlsdGVyIHRpbWUgd2hl biBpbnB1dC1kZWJvdW5jZSBpcyBjb25maWd1cmVkIHRvICIwIgo+ICDCoMKgIChjb3JyZXNwb25k aW5nIHRvIDEgb24gdGhlIGFmZmVjdGVkIGhhcmR3YXJlIHJlZ2lzdGVyKS4KPiAgwqDCoCBXaGF0 IEkgZG9uJ3QgbGlrZSBpcyB0aGUgaHVnZSBnYXAgYmV0d2VlbiBjb25maWd1cmF0aW9uIDEgYW5k IDAsIGJ1dAo+ICDCoMKgIEkgaGF2ZSBubyBpZGVhIHdoYXQgdG8gZG8gYWJvdXQgaXQgd2l0aG91 dCBicmVha2luZyBhbGwgY29tcGF0aWJpbGl0eS4KCkkgd291bGRuJ3QgYmUgY29uY2VybmVkIGFi b3V0IHRoaXMgZ2FwLCBhcyAwIGlzIHN1cHBvc2VkIHRvIG1lYW4gb2ZmLApzbyB0aGVyZSBpcyBh bHJlYWR5IGFuIGV4cGVjdGF0aW9uIG9mIGEgZnVuZGFtZW50YWxseSBkaWZmZXJlbnQKYmVoYXZp b3VyLiBQbHVzIHRoZSBpbnRlcmZhY2UgY2hvc2UgbWljcm9zZWNvbmRzIGZvciBhIHJlYXNvbiwg SSBndWVzcwpmb3IgbWVjaGFuaWNhbCBkZWJvdW5jaW5nIGEgcmVzb2x1dGlvbiBvZiAxIG1pY3Jv c2Vjb25kIGlzIG1vcmUgdGhhbgplbm91Z2guCkNhbiB5b3UgcGxlYXNlIHNlbmQgdGhpcyBwYXRj aCwgc28gdGhhdCB3ZSBjYW4gaGF2ZSBhbnkgcG90ZW50aWFsCmRpc2N1c3Npb24gdGhlcmUsIG9u IHRoZSBjb2RlPyBBbmQgcGxlYXNlIGFkZCBhIEZpeGVzOiB0YWcsIHNvIGl0IGNhbgpiZSBiYWNr cG9ydGVkIHRvIHN0YWJsZSBrZXJuZWxzLgoKPiAtIGluIGFyY2gvYXJtL2Jvb3QvZHRzL3N1bnhp LWgzLWg1LmR0c2ksIHNldCBpbnB1dC1kZWJvdW5jZSA8MzEgMzE+Cj4gIMKgwqAgY29ycmVzcG9u ZGluZyB0byB0aGUgZGVmYXVsdCAiMCIgaW4gYm90aCBhZmZlY3RlZCBoYXJkd2FyZSByZWdpc3Rl cnMuCj4gIMKgwqAgTm90ZSB0aGF0IHRoZSBjbG9ja3MgaG9zYyBhbmQgbG9zYyB0aGF0IG1ha2Ug dGhpcyAzMSBtYXAgdG8gMCBhcmUKPiAgwqDCoCBjb25maWd1cmVkIGV4YWN0bHkgaGVyZS4KCkkg YW0gbm90IGZ1bGx5IGRlY2lkZWQgb24gdGhhdCwgYnV0IHRoZXJlIGFyZSBzb21lIGdvb2QgcG9p bnRzIHRvIGl0LgoKPiAtIGluIGFyY2gvYXJtL2Jvb3QvZHRzL3N1bjhpLWgyLXBsdXMtYmFuYW5h cGktbTItemVyby5kdHMsIHNldAo+ICDCoMKgIGlucHV0LWRlYm91bmNlIDwzMSAwPiBhcyB0aGlz IGJvYXJkIGhhcyBlbGVjdHJvbmljIGRldmljZXMKPiAgwqDCoCBhdHRhY2hlZCB0byBiYW5rIEcg YW5kIG9ubHkgZXhwb3NlcyBiYW5rIEEgdG8gaXRzIHVzZXJzLgo+ICDCoMKgIEknZCBsaWtlIHRv IGFkdmVydGlzZSBvbiB0aGF0IG9uZTogdGhpcyBib2FyZCBkb2VzIG5vdCByZXF1aXJlCj4gIMKg wqAgZGVib3VuY2luZyBvbiBiYW5rIEcuIFBsdXMgaXQgZmVlbHMgdGhlIGJvYXJkIGdvdCBtb3Jl IHN0YWJsZQo+ICDCoMKgIGJ5IHRoaXMgc2V0dGluZzogbXkgQmFuYW5hUGkgaXMgY29ubmVjdGVk IHZpYSBXaUZpIChvbmx5KSBhbmQgaW4gdGhlCj4gIMKgwqAgcGFzdCBpdCB3ZW50IGFwcGFyZW50 bHkgZGVhZCBldmVyeSBvdGhlciBkYXkgb3Igc28uIE5vdGhpbmcgbGlrZQo+ICDCoMKgIHRoaXMg aGFwcGVuZWQgYWZ0ZXIgc3dpdGNoaW5nIG9mZiBpbnB1dCBkZWJvdW5jZS4gQW5lY3Rkb3RhbAo+ ICDCoMKgIGV2aWRlbmNlLCBJIGtub3cuLi4KCkkgYW0gbm90IGNvbnZpbmNlZCBvZiB0aGF0LCBm b3IgdGhlIGdlbmVyaWMgRFQgaW4gdGhlIGtlcm5lbCB0cmVlLiBGb3IKYSBzdGFydCwgSSB3b3Vs ZG4ndCB1c2UgMCwgYXMgdGhpcyBkb2VzIG5vdCBkbyB0aGUgcmlnaHQgdGhpbmcgb24gb2xkZXIK a2VybmVscy4gQnV0IGFnYWluLCBJIGhhdmVuJ3QgaGVhcmQgb2YgZXJyb3IgcmVwb3J0cywgc28g SSBhbSBhIGJpdApyZWx1Y3RhbnQgdG8gY2hhbmdlIHRoYXQgc2V0dGluZy4KVGhlcmUgYXJlIHJl cG9ydHMgb2YgdW5zdGFibGUgV2lGaSwgYnV0IElJVUMgbW9zdGx5IGR1ZSB0byB0aGUgcG9vcgpX aUZpIGNoaXAgZGVzaWduIGFuZCBxdWFsaXR5IG9yIGRyaXZlciBwcm9ibGVtcy4KCklmIHlvdSBj YW4gcHJvdmUgdGhpcyBtb3JlIGNvbmNsdXNpdmVseSwgdGhhdCB3b3VsZCBiZSB3b3J0aApjb25z aWRlcmluZywgdGhvdWdoLgoKPiAtIChpbiBteSBkZXZpY2V0cmVlIG92ZXJsYXksIEkgc2V0IGlu cHV0LWRlYm91bmNlIDwwIDA+IHRvIG1ha2UgSVJRCj4gIMKgwqAgYmFzZWQgZHJpdmVycyBsaWtl IGRyaXZlcnMvaWlvL2h1bWlkaXR5L2RodDExLmMgd29yayBvbiBiYW5rIEEpIC0KPiAgwqDCoCBu b3QgcGFydCBvZiB0aGUgcGF0Y2guCgpZZXMsIGJ1dCBhZ2FpbiBJJ2QgcmVjb21tZW5kIHRvIHVz ZSA8MSAxPiwgYXMgdGhpcyBpcyBtb3JlIGNvbXBhdGlibGUsCmluIGNhc2UgeW91IGhhcHBlbiB0 byBsb2FkIGEgc3RhYmxlIGtlcm5lbC4KCj4gV291bGQgdGhhdCBhcHBlYXIgcmlnaHQ/Cj4gCj4g QmVzdCByZWdhcmRzLAo+IAo+IEFuZHJlYXMuCj4gCj4gUFM6IFBlcmhhcHMgc29tZW9uZSBjYW4g cG9pbnQgbWUgdG8gZnVydGhlciByZWFkaW5nIHJlZ2FyZGluZwo+IGRyaXZlcnMgZm9yIGVsZWN0 cm9uaWMgZGV2aWNlcyBhdHRhY2hlZCB0byBHUElPLiBBc3N1bWluZyBJIHdhbnQKPiB0byBhdHRh Y2ggYSBkZXZpY2UgdG8gYSBHUElPIHRoYXQgaXMgbm90IGFjY2lkZW50YWxseSBjb3ZlcmVkIGJ5 Cj4gaGFyZHdhcmUgc3VwcG9ydCBvZiB0aGUgcGluY3RybCBzdWJzeXN0ZW0sIHdoYXQgb3B0aW9u cyBkbyBJCj4gaGF2ZSBfYXBhcnRfIGZyb20gcmVnaXN0ZXJpbmcgZWRnZSBJUlFzIHRvIHJlYWN0 IG9uIGEgZGlnaXRhbAo+IHNpZ25hbCBmcm9tIHRoYXQgZGV2aWNlPyBJc24ndCBpdCBjYWxsZWQg Yml0LWJhbmdpbmcgYW5kIHRoZQo+IHVzdWFsIHRlY2huaXF1ZT8KCkkgYW0gbm90IHN1cmUgd2hh dCB5b3UgbWVhbiB3aXRoICJub3QgYWNjaWRlbnRhbGx5IGNvdmVyZWQgLi4uIiwgZG8geW91Cm1l YW4gdXNpbmcgYSBoYXJkd2FyZSBwZXJpcGhlcmFsIGludGVyZmFjZSBsaWtlIGFuIEkyQyBvciBT UEkKY29udHJvbGxlcj8KWWVzLCB0aGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBiaXQtYmFuZ2lu ZyBkZXZpY2VzIGluIHRoZSBrZXJuZWwsCnRob3VnaCBpdCdzIG5vdCBjb25zaWRlcmVkIHZlcnkg ZWZmaWNpZW50LCBidXQgb25lIG1pZ2h0IG5vdCBoYXZlIGEKY2hvaWNlLCBtb3N0bHkuCgpDaGVl cnMsCkFuZHJlCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmlu ZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9s aW51eC1hcm0ta2VybmVsCg==