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 38325C77B72 for ; Mon, 17 Apr 2023 11:39:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:In-Reply-To: Content-Transfer-Encoding:Content-Type:MIME-Version:References: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=Dz9xfrLEwYGZhZvD4TwpBjibWfuTUq28xye0DSj9/HA=; b=T4qwrMNuZXG2fhheuJgk29jPRo aAI4dtw9gB7h5VfrBCCwlWjxsJHhGE6rkDZ5GOvTBa1JXekExpy6uHXpAvPPcyIwZSMQra2tFoHNJ Z8SUHFq8qXyxNB1E0zfQRG0eq8Edt9I34ZSHdT3oTLiQOPF8s5NogrmMwwl2brUxsFMsyujqtEG1O 7CI4NFk5iKzLRQW3T5oJK83NPMDvb+Ge95naE5kmIZ9l4jprT8+WAfXJ4bRnfVY95uJhBz93wDk9U 991hNVmrObSgHTR4qmLCgYgPoDHpD6gFiTtQIEBCC7N7Hu0mp/qeTUzL+JUq5Ben3Ul8fyngJOIFh zTimR+7A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1poNCn-00G0OK-1u; Mon, 17 Apr 2023 11:39:33 +0000 Received: from fudo.makrotopia.org ([2a07:2ec0:3002::71]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1poNCj-00G0NO-2x; Mon, 17 Apr 2023 11:39:32 +0000 Received: from local by fudo.makrotopia.org with esmtpsa (TLS1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.96) (envelope-from ) id 1poNCU-00049u-2O; Mon, 17 Apr 2023 13:39:14 +0200 Date: Mon, 17 Apr 2023 12:39:09 +0100 From: Daniel Golle To: =?utf-8?B?QXLEsW7DpyDDnE5BTA==?= Cc: netdev@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Sean Wang , Landen Chao , DENG Qingfang , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , AngeloGioacchino Del Regno , Matthias Brugger , Jesse Brandeburg Subject: Re: [PATCH net-next v2] net: dsa: mt7530: fix support for MT7531BE Message-ID: References: <8d36ff3b-e084-9f79-4c00-ec832f2cdbb3@arinc9.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230417_043930_124248_F0194128 X-CRM114-Status: GOOD ( 64.60 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org On Mon, Apr 17, 2023 at 12:28:57AM +0300, Arınç ÜNAL wrote: > On 16/04/2023 17:18, Daniel Golle wrote: > > On Sun, Apr 16, 2023 at 04:48:23PM +0300, Arınç ÜNAL wrote: > > > On 16.04.2023 15:08, Daniel Golle wrote: > > > > [...] > > > > * It doesn't move PCS creation to mt7530.c, hence PCS_MTK_LYNXI is > > > > only required for MDIO-connected switches > > > > (with your patch we would have to move the dependency on PCS_MTK_LYNXI > > > > from NET_DSA_MT7530_MDIO to NET_DSA_MT7530) > > > > > > Maybe this is what should happen. Maybe the PCS creation (and therefore > > > mt7530_regmap_bus) should be on the core driver. Both are on the MDIO driver > > > for the sole reason of only the devices on the MDIO driver currently using > > > it. It's not an MDIO-specific operation as far as I can tell. Having it on > > > the core driver would make more sense in the long run. > > > > Which "long run" are you talking about? > > regmap creation is bus-specific, and so is the existence of LynxI PCS. > > There simply aren't any MMIO-connected switches which come with that IP. > > And I strongly doubt there ever will be. And even if, why should we now > > prepare for an entirely speculative future? If it actually happens, ie. > > in case there is going to be a new SoC with MMIO-connected switch which > > does comes with LynxI PCS (e.g. for port 5 only) we can still move the > > code. > > Makes sense. > > > [...] > > > > > > A similar logic is already there on the U-Boot MediaTek ethernet driver. > > > > > > https://github.com/u-boot/u-boot/blob/a94ab561e2f49a80d8579930e840b810ab1a1330/drivers/net/mtk_eth.c#L903 > > > > > > So this patch fixes the issue with the only consideration being changing as > > > less lines of code as possible. > > > > You are ignore two more important arguments: > > * It doesn't requrire additional export of mt7530_regmap_bus > > (which would imply significantly more storage overhead compared to > > an additional function pointer in a priv struct) > > > > * It doesn't move PCS creation to mt7530.c, hence PCS_MTK_LYNXI is > > only required for MDIO-connected switches > > (with your patch we would have to move the dependency on PCS_MTK_LYNXI > > from NET_DSA_MT7530_MDIO to NET_DSA_MT7530) > > Understood. > > > And that's okay. We can make the least > > > amount of changes to fix the issue first, then improve the driver. But > > > there's nothing new made on the driver after the commit that caused this > > > issue, backportability to the stable trees is a non-issue. So why not do it > > > properly the first time? > > > > Most of all I'd rather have it fixed before net-next is merged to Linus' > > tree and also before net-next will close again. > > > > However, I also simply don't see what would be more "proper" about your > > solution. > > Nothing. Your patch here is perfectly fine after reading your points. One > thing I'd like to ask is, if I understand correctly, instead of exporting > mt7531_create_sgmii(), defining a pointer that points to it causes less > overhead? Yes. Depending on build configuration and debugging options an exported function or constant will require different amounts of storage, ie. function name and parameter prototypes need to be stored in the kernel symbol table, any module calling the exporting functions and in the exporting modules ELF header, the latter being the most significant. Even if kernel modules aren't used and it's all built-in the overhead is still more than a few bytes for the struct member definition as well as the growth of the per-instance allocated struct member itself -- especially given that I have only heard about one board using two MT7531AE, most boards use exactly one of them. > > The current patch looks very similar to exporting a function. Instead of > putting EXPORT_SYMBOL_GPL and declaring the function prototype on the header > file, you declare a function pointer on the priv structure, then assign it > to the function. The effect is similar, just limited in scope as a caller needs to have access to the priv struct (opposed to an EXPORT_SYMBOL* which will make the function or const available globally). Also note that exporting mt7531_create_sgmii() would not work equally well as the result would be a hard dependency of NET_DSA_MT7530 on NET_DSA_MT7530_MDIO for the exported function being linkable. The function pointer has the advantage that it can be set to NULL and in that way we can model a weak dependency. > > > > > > > > > Whatever the outcome with this patch is, on my upcoming patch series, I > > > intend to move mt7531_create_sgmii to mt7530.c. Then introduce > > > priv->p5_sgmii to get rid of mt7531_dual_sgmii_supported(). > > > > What is the argument for that? > > Nothing for moving mt7531_create_sgmii() but I think introducing > priv->p5_sgmii with later patches is in the clear? Yes, I agree that introducing priv->p5_sgmii can make sense, given that it would prevent having to export mt7531_dual_sgmii_supported() or passing its return value as a function parameter, or even just having to call it many times. Regarding this current patch (see subject), do you still agree that we should apply it as-is and then either you or me will prepare another series further refactoring the driver? > > > > > There is not a single MMIO-connected switch which comes with LynxI PCS. > > (see above) > > > > Imho we should rather try to work into the opposite direction and move > > more code only used on either MDIO or MMIO from core to the > > bus-specific drivers. If needed we can even split them more, eg. have > > different modules for MT7530 and MT7531, so that even the driver for > > MDIO-connected MT7530 would not require MTK_PCS_LYNXI. > > Interesting, I may work on this in the future. This could benefit my folks > too. > > > > > In that sense I'm a big fan of the structure of the mt76 wireless > > driver: Have a core module for shared helper functions and then > > device-specific driver modules. Unfortunately many if not most drivers > > are doing the exact opposite approach, ie. having some abstration layer > > which will always need to be extended and changed with every > > unforeseeable new hardware to be supported which just results in lots > > of overhead and is a burden to maintain. You can see that in the rt2x00 > > wireless driver which I also worked on a lot: Most of the abstractions > > aren't even useful with any of the latest hardware generations. > > > > tl;dr: What's wrong with moving functions specific to either variant > > (MMIO vs. MDIO) into the corresponding modules and keeping the core > > slim and really only cover shared functionality? This is also why I > > originally wanted the names of files and Kconfig symbols to reflect the > > supported hardware rather than the supported bus-type -- I've changed > > that upon your request and now believe I should have argued more > > clearly why I made my choice like I did... > > Ah that makes sense. I'd like to address this. I was already planning to to > do some renaming on the driver. Please, allow me to do the work. Sure, your efforts are appreciated, and I'll happily review and test your suggestions. > > I intend to do this slightly different than your initial patch series > though. Like calling the core driver core, instead of common, and making it > selectable, and only imply the MT7530 MDIO driver. > > We could split the core and mdio/mmio drivers in a way that there's just the > core, then the device-specific driver modules. This would mean splitting the > MT7530 MDIO driver to MT7530 and MT7531 along with moving code from core to > these two drivers. I believe this would apply for MT7988 too. There would be > a bit of reused code but it should follow the idea of what you say above. > Then we can configure the kconfig accordingly. > > Arınç 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 7F84AC77B70 for ; Mon, 17 Apr 2023 11:40:37 +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:In-Reply-To:MIME-Version:References: 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=0FPCUo9dLsomio9pGPOuodt7cJ7abGcd27odq3DLD3E=; b=Mu3RUV+bJIVWE+ nj4ku0/BuHqgLeKx4IDrILYQmX5Z3ilRKCXF0uiMCBumCiELxfwnmZlBcpxdlFDSget4tyAw4hDtC SNQrT6kw4pnkE2poXgZTmmNUKxXbIVN5gfxGXkrGzpm11TmKGsRlC16kyIyNGz0lT2Ywxk81/1bNn dymec37gTCD2SqrER73k1DNG7FG4UW8T73RE5wOrCNg3RaadjwTFirLBYC8b59WmpyAK3jMFFVJC4 uUSCwkBEM7YdoXyKcQiLU11gpG4uK5xc7ANModRlBCVaN5xcQlmR3sVavvBFgpgOsMYW9LYEbAwxg 96L8cOXunFS/axOz2giQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1poNCo-00G0OQ-0N; Mon, 17 Apr 2023 11:39:34 +0000 Received: from fudo.makrotopia.org ([2a07:2ec0:3002::71]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1poNCj-00G0NO-2x; Mon, 17 Apr 2023 11:39:32 +0000 Received: from local by fudo.makrotopia.org with esmtpsa (TLS1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.96) (envelope-from ) id 1poNCU-00049u-2O; Mon, 17 Apr 2023 13:39:14 +0200 Date: Mon, 17 Apr 2023 12:39:09 +0100 From: Daniel Golle To: =?utf-8?B?QXLEsW7DpyDDnE5BTA==?= Cc: netdev@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Sean Wang , Landen Chao , DENG Qingfang , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , AngeloGioacchino Del Regno , Matthias Brugger , Jesse Brandeburg Subject: Re: [PATCH net-next v2] net: dsa: mt7530: fix support for MT7531BE Message-ID: References: <8d36ff3b-e084-9f79-4c00-ec832f2cdbb3@arinc9.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230417_043930_124248_F0194128 X-CRM114-Status: GOOD ( 64.60 ) 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 T24gTW9uLCBBcHIgMTcsIDIwMjMgYXQgMTI6Mjg6NTdBTSArMDMwMCwgQXLEsW7DpyDDnE5BTCB3 cm90ZToKPiBPbiAxNi8wNC8yMDIzIDE3OjE4LCBEYW5pZWwgR29sbGUgd3JvdGU6Cj4gPiBPbiBT dW4sIEFwciAxNiwgMjAyMyBhdCAwNDo0ODoyM1BNICswMzAwLCBBcsSxbsOnIMOcTkFMIHdyb3Rl Ogo+ID4gPiBPbiAxNi4wNC4yMDIzIDE1OjA4LCBEYW5pZWwgR29sbGUgd3JvdGU6Cj4gPiA+ID4g Wy4uLl0KPiA+ID4gPiAgICogSXQgZG9lc24ndCBtb3ZlIFBDUyBjcmVhdGlvbiB0byBtdDc1MzAu YywgaGVuY2UgUENTX01US19MWU5YSSBpcwo+ID4gPiA+ICAgICBvbmx5IHJlcXVpcmVkIGZvciBN RElPLWNvbm5lY3RlZCBzd2l0Y2hlcwo+ID4gPiA+ICAgICAod2l0aCB5b3VyIHBhdGNoIHdlIHdv dWxkIGhhdmUgdG8gbW92ZSB0aGUgZGVwZW5kZW5jeSBvbiBQQ1NfTVRLX0xZTlhJCj4gPiA+ID4g ICAgIGZyb20gTkVUX0RTQV9NVDc1MzBfTURJTyB0byBORVRfRFNBX01UNzUzMCkKPiA+ID4gCj4g PiA+IE1heWJlIHRoaXMgaXMgd2hhdCBzaG91bGQgaGFwcGVuLiBNYXliZSB0aGUgUENTIGNyZWF0 aW9uIChhbmQgdGhlcmVmb3JlCj4gPiA+IG10NzUzMF9yZWdtYXBfYnVzKSBzaG91bGQgYmUgb24g dGhlIGNvcmUgZHJpdmVyLiBCb3RoIGFyZSBvbiB0aGUgTURJTyBkcml2ZXIKPiA+ID4gZm9yIHRo ZSBzb2xlIHJlYXNvbiBvZiBvbmx5IHRoZSBkZXZpY2VzIG9uIHRoZSBNRElPIGRyaXZlciBjdXJy ZW50bHkgdXNpbmcKPiA+ID4gaXQuIEl0J3Mgbm90IGFuIE1ESU8tc3BlY2lmaWMgb3BlcmF0aW9u IGFzIGZhciBhcyBJIGNhbiB0ZWxsLiBIYXZpbmcgaXQgb24KPiA+ID4gdGhlIGNvcmUgZHJpdmVy IHdvdWxkIG1ha2UgbW9yZSBzZW5zZSBpbiB0aGUgbG9uZyBydW4uCj4gPiAKPiA+IFdoaWNoICJs b25nIHJ1biIgYXJlIHlvdSB0YWxraW5nIGFib3V0Pwo+ID4gcmVnbWFwIGNyZWF0aW9uIGlzIGJ1 cy1zcGVjaWZpYywgYW5kIHNvIGlzIHRoZSBleGlzdGVuY2Ugb2YgTHlueEkgUENTLgo+ID4gVGhl cmUgc2ltcGx5IGFyZW4ndCBhbnkgTU1JTy1jb25uZWN0ZWQgc3dpdGNoZXMgd2hpY2ggY29tZSB3 aXRoIHRoYXQgSVAuCj4gPiBBbmQgSSBzdHJvbmdseSBkb3VidCB0aGVyZSBldmVyIHdpbGwgYmUu IEFuZCBldmVuIGlmLCB3aHkgc2hvdWxkIHdlIG5vdwo+ID4gcHJlcGFyZSBmb3IgYW4gZW50aXJl bHkgc3BlY3VsYXRpdmUgZnV0dXJlPyBJZiBpdCBhY3R1YWxseSBoYXBwZW5zLCBpZS4KPiA+IGlu IGNhc2UgdGhlcmUgaXMgZ29pbmcgdG8gYmUgYSBuZXcgU29DIHdpdGggTU1JTy1jb25uZWN0ZWQg c3dpdGNoIHdoaWNoCj4gPiBkb2VzIGNvbWVzIHdpdGggTHlueEkgUENTIChlLmcuIGZvciBwb3J0 IDUgb25seSkgd2UgY2FuIHN0aWxsIG1vdmUgdGhlCj4gPiBjb2RlLgo+IAo+IE1ha2VzIHNlbnNl LgoKCj4gPiA+IFsuLi5dCj4gPiA+IAo+ID4gPiBBIHNpbWlsYXIgbG9naWMgaXMgYWxyZWFkeSB0 aGVyZSBvbiB0aGUgVS1Cb290IE1lZGlhVGVrIGV0aGVybmV0IGRyaXZlci4KPiA+ID4gCj4gPiA+ IGh0dHBzOi8vZ2l0aHViLmNvbS91LWJvb3QvdS1ib290L2Jsb2IvYTk0YWI1NjFlMmY0OWE4MGQ4 NTc5OTMwZTg0MGI4MTBhYjFhMTMzMC9kcml2ZXJzL25ldC9tdGtfZXRoLmMjTDkwMwo+ID4gPiAK PiA+ID4gU28gdGhpcyBwYXRjaCBmaXhlcyB0aGUgaXNzdWUgd2l0aCB0aGUgb25seSBjb25zaWRl cmF0aW9uIGJlaW5nIGNoYW5naW5nIGFzCj4gPiA+IGxlc3MgbGluZXMgb2YgY29kZSBhcyBwb3Nz aWJsZS4KPiA+IAo+ID4gWW91IGFyZSBpZ25vcmUgdHdvIG1vcmUgaW1wb3J0YW50IGFyZ3VtZW50 czoKPiA+ICAgKiBJdCBkb2Vzbid0IHJlcXVyaXJlIGFkZGl0aW9uYWwgZXhwb3J0IG9mIG10NzUz MF9yZWdtYXBfYnVzCj4gPiAgICAgKHdoaWNoIHdvdWxkIGltcGx5IHNpZ25pZmljYW50bHkgbW9y ZSBzdG9yYWdlIG92ZXJoZWFkIGNvbXBhcmVkIHRvCj4gPiAgICAgYW4gYWRkaXRpb25hbCBmdW5j dGlvbiBwb2ludGVyIGluIGEgcHJpdiBzdHJ1Y3QpCj4gPiAKPiA+ICAgKiBJdCBkb2Vzbid0IG1v dmUgUENTIGNyZWF0aW9uIHRvIG10NzUzMC5jLCBoZW5jZSBQQ1NfTVRLX0xZTlhJIGlzCj4gPiAg ICAgb25seSByZXF1aXJlZCBmb3IgTURJTy1jb25uZWN0ZWQgc3dpdGNoZXMKPiA+ICAgICAod2l0 aCB5b3VyIHBhdGNoIHdlIHdvdWxkIGhhdmUgdG8gbW92ZSB0aGUgZGVwZW5kZW5jeSBvbiBQQ1Nf TVRLX0xZTlhJCj4gPiAgICAgZnJvbSBORVRfRFNBX01UNzUzMF9NRElPIHRvIE5FVF9EU0FfTVQ3 NTMwKQo+IAo+IFVuZGVyc3Rvb2QuCgo+ID4gPiBBbmQgdGhhdCdzIG9rYXkuIFdlIGNhbiBtYWtl IHRoZSBsZWFzdAo+ID4gPiBhbW91bnQgb2YgY2hhbmdlcyB0byBmaXggdGhlIGlzc3VlIGZpcnN0 LCB0aGVuIGltcHJvdmUgdGhlIGRyaXZlci4gQnV0Cj4gPiA+IHRoZXJlJ3Mgbm90aGluZyBuZXcg bWFkZSBvbiB0aGUgZHJpdmVyIGFmdGVyIHRoZSBjb21taXQgdGhhdCBjYXVzZWQgdGhpcwo+ID4g PiBpc3N1ZSwgYmFja3BvcnRhYmlsaXR5IHRvIHRoZSBzdGFibGUgdHJlZXMgaXMgYSBub24taXNz dWUuIFNvIHdoeSBub3QgZG8gaXQKPiA+ID4gcHJvcGVybHkgdGhlIGZpcnN0IHRpbWU/Cj4gPiAK PiA+IE1vc3Qgb2YgYWxsIEknZCByYXRoZXIgaGF2ZSBpdCBmaXhlZCBiZWZvcmUgbmV0LW5leHQg aXMgbWVyZ2VkIHRvIExpbnVzJwo+ID4gdHJlZSBhbmQgYWxzbyBiZWZvcmUgbmV0LW5leHQgd2ls bCBjbG9zZSBhZ2Fpbi4KPiA+IAo+ID4gSG93ZXZlciwgSSBhbHNvIHNpbXBseSBkb24ndCBzZWUg d2hhdCB3b3VsZCBiZSBtb3JlICJwcm9wZXIiIGFib3V0IHlvdXIKPiA+IHNvbHV0aW9uLgo+IAo+ IE5vdGhpbmcuIFlvdXIgcGF0Y2ggaGVyZSBpcyBwZXJmZWN0bHkgZmluZSBhZnRlciByZWFkaW5n IHlvdXIgcG9pbnRzLiBPbmUKPiB0aGluZyBJJ2QgbGlrZSB0byBhc2sgaXMsIGlmIEkgdW5kZXJz dGFuZCBjb3JyZWN0bHksIGluc3RlYWQgb2YgZXhwb3J0aW5nCj4gbXQ3NTMxX2NyZWF0ZV9zZ21p aSgpLCBkZWZpbmluZyBhIHBvaW50ZXIgdGhhdCBwb2ludHMgdG8gaXQgY2F1c2VzIGxlc3MKPiBv dmVyaGVhZD8KClllcy4gRGVwZW5kaW5nIG9uIGJ1aWxkIGNvbmZpZ3VyYXRpb24gYW5kIGRlYnVn Z2luZyBvcHRpb25zIGFuIGV4cG9ydGVkCmZ1bmN0aW9uIG9yIGNvbnN0YW50IHdpbGwgcmVxdWly ZSBkaWZmZXJlbnQgYW1vdW50cyBvZiBzdG9yYWdlLCBpZS4KZnVuY3Rpb24gbmFtZSBhbmQgcGFy YW1ldGVyIHByb3RvdHlwZXMgbmVlZCB0byBiZSBzdG9yZWQgaW4gdGhlIGtlcm5lbApzeW1ib2wg dGFibGUsIGFueSBtb2R1bGUgY2FsbGluZyB0aGUgZXhwb3J0aW5nIGZ1bmN0aW9ucyBhbmQgaW4g dGhlCmV4cG9ydGluZyBtb2R1bGVzIEVMRiBoZWFkZXIsIHRoZSBsYXR0ZXIgYmVpbmcgdGhlIG1v c3Qgc2lnbmlmaWNhbnQuCkV2ZW4gaWYga2VybmVsIG1vZHVsZXMgYXJlbid0IHVzZWQgYW5kIGl0 J3MgYWxsIGJ1aWx0LWluIHRoZSBvdmVyaGVhZAppcyBzdGlsbCBtb3JlIHRoYW4gYSBmZXcgYnl0 ZXMgZm9yIHRoZSBzdHJ1Y3QgbWVtYmVyIGRlZmluaXRpb24gYXMgd2VsbAphcyB0aGUgZ3Jvd3Ro IG9mIHRoZSBwZXItaW5zdGFuY2UgYWxsb2NhdGVkIHN0cnVjdCBtZW1iZXIgaXRzZWxmIC0tCmVz cGVjaWFsbHkgZ2l2ZW4gdGhhdCBJIGhhdmUgb25seSBoZWFyZCBhYm91dCBvbmUgYm9hcmQgdXNp bmcgdHdvCk1UNzUzMUFFLCBtb3N0IGJvYXJkcyB1c2UgZXhhY3RseSBvbmUgb2YgdGhlbS4KCj4g Cj4gVGhlIGN1cnJlbnQgcGF0Y2ggbG9va3MgdmVyeSBzaW1pbGFyIHRvIGV4cG9ydGluZyBhIGZ1 bmN0aW9uLiBJbnN0ZWFkIG9mCj4gcHV0dGluZyBFWFBPUlRfU1lNQk9MX0dQTCBhbmQgZGVjbGFy aW5nIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUgb24gdGhlIGhlYWRlcgo+IGZpbGUsIHlvdSBkZWNs YXJlIGEgZnVuY3Rpb24gcG9pbnRlciBvbiB0aGUgcHJpdiBzdHJ1Y3R1cmUsIHRoZW4gYXNzaWdu IGl0Cj4gdG8gdGhlIGZ1bmN0aW9uLgoKVGhlIGVmZmVjdCBpcyBzaW1pbGFyLCBqdXN0IGxpbWl0 ZWQgaW4gc2NvcGUgYXMgYSBjYWxsZXIgbmVlZHMgdG8gaGF2ZQphY2Nlc3MgdG8gdGhlIHByaXYg c3RydWN0IChvcHBvc2VkIHRvIGFuIEVYUE9SVF9TWU1CT0wqIHdoaWNoIHdpbGwKbWFrZSB0aGUg ZnVuY3Rpb24gb3IgY29uc3QgYXZhaWxhYmxlIGdsb2JhbGx5KS4KCkFsc28gbm90ZSB0aGF0IGV4 cG9ydGluZyBtdDc1MzFfY3JlYXRlX3NnbWlpKCkgd291bGQgbm90IHdvcmsgZXF1YWxseQp3ZWxs IGFzIHRoZSByZXN1bHQgd291bGQgYmUgYSBoYXJkIGRlcGVuZGVuY3kgb2YgTkVUX0RTQV9NVDc1 MzAgb24KTkVUX0RTQV9NVDc1MzBfTURJTyBmb3IgdGhlIGV4cG9ydGVkIGZ1bmN0aW9uIGJlaW5n IGxpbmthYmxlLgpUaGUgZnVuY3Rpb24gcG9pbnRlciBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IGl0 IGNhbiBiZSBzZXQgdG8gTlVMTCBhbmQKaW4gdGhhdCB3YXkgd2UgY2FuIG1vZGVsIGEgd2VhayBk ZXBlbmRlbmN5LgoKPiAKPiA+IAo+ID4gPiAKPiA+ID4gV2hhdGV2ZXIgdGhlIG91dGNvbWUgd2l0 aCB0aGlzIHBhdGNoIGlzLCBvbiBteSB1cGNvbWluZyBwYXRjaCBzZXJpZXMsIEkKPiA+ID4gaW50 ZW5kIHRvIG1vdmUgbXQ3NTMxX2NyZWF0ZV9zZ21paSB0byBtdDc1MzAuYy4gVGhlbiBpbnRyb2R1 Y2UKPiA+ID4gcHJpdi0+cDVfc2dtaWkgdG8gZ2V0IHJpZCBvZiBtdDc1MzFfZHVhbF9zZ21paV9z dXBwb3J0ZWQoKS4KPiA+IAo+ID4gV2hhdCBpcyB0aGUgYXJndW1lbnQgZm9yIHRoYXQ/Cj4gCj4g Tm90aGluZyBmb3IgbW92aW5nIG10NzUzMV9jcmVhdGVfc2dtaWkoKSBidXQgSSB0aGluayBpbnRy b2R1Y2luZwo+IHByaXYtPnA1X3NnbWlpIHdpdGggbGF0ZXIgcGF0Y2hlcyBpcyBpbiB0aGUgY2xl YXI/CgpZZXMsIEkgYWdyZWUgdGhhdCBpbnRyb2R1Y2luZyBwcml2LT5wNV9zZ21paSBjYW4gbWFr ZSBzZW5zZSwgZ2l2ZW4gdGhhdAppdCB3b3VsZCBwcmV2ZW50IGhhdmluZyB0byBleHBvcnQgbXQ3 NTMxX2R1YWxfc2dtaWlfc3VwcG9ydGVkKCkgb3IKcGFzc2luZyBpdHMgcmV0dXJuIHZhbHVlIGFz IGEgZnVuY3Rpb24gcGFyYW1ldGVyLCBvciBldmVuIGp1c3QgaGF2aW5nCnRvIGNhbGwgaXQgbWFu eSB0aW1lcy4KClJlZ2FyZGluZyB0aGlzIGN1cnJlbnQgcGF0Y2ggKHNlZSBzdWJqZWN0KSwgZG8g eW91IHN0aWxsIGFncmVlIHRoYXQgd2UKc2hvdWxkIGFwcGx5IGl0IGFzLWlzIGFuZCB0aGVuIGVp dGhlciB5b3Ugb3IgbWUgd2lsbCBwcmVwYXJlIGFub3RoZXIKc2VyaWVzIGZ1cnRoZXIgcmVmYWN0 b3JpbmcgdGhlIGRyaXZlcj8KCgo+IAo+ID4gCj4gPiBUaGVyZSBpcyBub3QgYSBzaW5nbGUgTU1J Ty1jb25uZWN0ZWQgc3dpdGNoIHdoaWNoIGNvbWVzIHdpdGggTHlueEkgUENTLgo+ID4gKHNlZSBh Ym92ZSkKPiA+IAo+ID4gSW1obyB3ZSBzaG91bGQgcmF0aGVyIHRyeSB0byB3b3JrIGludG8gdGhl IG9wcG9zaXRlIGRpcmVjdGlvbiBhbmQgbW92ZQo+ID4gbW9yZSBjb2RlIG9ubHkgdXNlZCBvbiBl aXRoZXIgTURJTyBvciBNTUlPIGZyb20gY29yZSB0byB0aGUKPiA+IGJ1cy1zcGVjaWZpYyBkcml2 ZXJzLiBJZiBuZWVkZWQgd2UgY2FuIGV2ZW4gc3BsaXQgdGhlbSBtb3JlLCBlZy4gaGF2ZQo+ID4g ZGlmZmVyZW50IG1vZHVsZXMgZm9yIE1UNzUzMCBhbmQgTVQ3NTMxLCBzbyB0aGF0IGV2ZW4gdGhl IGRyaXZlciBmb3IKPiA+IE1ESU8tY29ubmVjdGVkIE1UNzUzMCB3b3VsZCBub3QgcmVxdWlyZSBN VEtfUENTX0xZTlhJLgo+IAo+IEludGVyZXN0aW5nLCBJIG1heSB3b3JrIG9uIHRoaXMgaW4gdGhl IGZ1dHVyZS4gVGhpcyBjb3VsZCBiZW5lZml0IG15IGZvbGtzCj4gdG9vLgo+IAo+ID4gCj4gPiBJ biB0aGF0IHNlbnNlIEknbSBhIGJpZyBmYW4gb2YgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbXQ3NiB3 aXJlbGVzcwo+ID4gZHJpdmVyOiBIYXZlIGEgY29yZSBtb2R1bGUgZm9yIHNoYXJlZCBoZWxwZXIg ZnVuY3Rpb25zIGFuZCB0aGVuCj4gPiBkZXZpY2Utc3BlY2lmaWMgZHJpdmVyIG1vZHVsZXMuIFVu Zm9ydHVuYXRlbHkgbWFueSBpZiBub3QgbW9zdCBkcml2ZXJzCj4gPiBhcmUgZG9pbmcgdGhlIGV4 YWN0IG9wcG9zaXRlIGFwcHJvYWNoLCBpZS4gaGF2aW5nIHNvbWUgYWJzdHJhdGlvbiBsYXllcgo+ ID4gd2hpY2ggd2lsbCBhbHdheXMgbmVlZCB0byBiZSBleHRlbmRlZCBhbmQgY2hhbmdlZCB3aXRo IGV2ZXJ5Cj4gPiB1bmZvcmVzZWVhYmxlIG5ldyBoYXJkd2FyZSB0byBiZSBzdXBwb3J0ZWQgd2hp Y2gganVzdCByZXN1bHRzIGluIGxvdHMKPiA+IG9mIG92ZXJoZWFkIGFuZCBpcyBhIGJ1cmRlbiB0 byBtYWludGFpbi4gWW91IGNhbiBzZWUgdGhhdCBpbiB0aGUgcnQyeDAwCj4gPiB3aXJlbGVzcyBk cml2ZXIgd2hpY2ggSSBhbHNvIHdvcmtlZCBvbiBhIGxvdDogTW9zdCBvZiB0aGUgYWJzdHJhY3Rp b25zCj4gPiBhcmVuJ3QgZXZlbiB1c2VmdWwgd2l0aCBhbnkgb2YgdGhlIGxhdGVzdCBoYXJkd2Fy ZSBnZW5lcmF0aW9ucy4KPiA+IAo+ID4gdGw7ZHI6IFdoYXQncyB3cm9uZyB3aXRoIG1vdmluZyBm dW5jdGlvbnMgc3BlY2lmaWMgdG8gZWl0aGVyIHZhcmlhbnQKPiA+IChNTUlPIHZzLiBNRElPKSBp bnRvIHRoZSBjb3JyZXNwb25kaW5nIG1vZHVsZXMgYW5kIGtlZXBpbmcgdGhlIGNvcmUKPiA+IHNs aW0gYW5kIHJlYWxseSBvbmx5IGNvdmVyIHNoYXJlZCBmdW5jdGlvbmFsaXR5PyBUaGlzIGlzIGFs c28gd2h5IEkKPiA+IG9yaWdpbmFsbHkgd2FudGVkIHRoZSBuYW1lcyBvZiBmaWxlcyBhbmQgS2Nv bmZpZyBzeW1ib2xzIHRvIHJlZmxlY3QgdGhlCj4gPiBzdXBwb3J0ZWQgaGFyZHdhcmUgcmF0aGVy IHRoYW4gdGhlIHN1cHBvcnRlZCBidXMtdHlwZSAtLSBJJ3ZlIGNoYW5nZWQKPiA+IHRoYXQgdXBv biB5b3VyIHJlcXVlc3QgYW5kIG5vdyBiZWxpZXZlIEkgc2hvdWxkIGhhdmUgYXJndWVkIG1vcmUK PiA+IGNsZWFybHkgd2h5IEkgbWFkZSBteSBjaG9pY2UgbGlrZSBJIGRpZC4uLgo+IAo+IEFoIHRo YXQgbWFrZXMgc2Vuc2UuIEknZCBsaWtlIHRvIGFkZHJlc3MgdGhpcy4gSSB3YXMgYWxyZWFkeSBw bGFubmluZyB0byB0bwo+IGRvIHNvbWUgcmVuYW1pbmcgb24gdGhlIGRyaXZlci4gUGxlYXNlLCBh bGxvdyBtZSB0byBkbyB0aGUgd29yay4KClN1cmUsIHlvdXIgZWZmb3J0cyBhcmUgYXBwcmVjaWF0 ZWQsIGFuZCBJJ2xsIGhhcHBpbHkgcmV2aWV3IGFuZCB0ZXN0CnlvdXIgc3VnZ2VzdGlvbnMuCgo+ IAo+IEkgaW50ZW5kIHRvIGRvIHRoaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4geW91ciBpbml0 aWFsIHBhdGNoIHNlcmllcwo+IHRob3VnaC4gTGlrZSBjYWxsaW5nIHRoZSBjb3JlIGRyaXZlciBj b3JlLCBpbnN0ZWFkIG9mIGNvbW1vbiwgYW5kIG1ha2luZyBpdAo+IHNlbGVjdGFibGUsIGFuZCBv bmx5IGltcGx5IHRoZSBNVDc1MzAgTURJTyBkcml2ZXIuCj4gCj4gV2UgY291bGQgc3BsaXQgdGhl IGNvcmUgYW5kIG1kaW8vbW1pbyBkcml2ZXJzIGluIGEgd2F5IHRoYXQgdGhlcmUncyBqdXN0IHRo ZQo+IGNvcmUsIHRoZW4gdGhlIGRldmljZS1zcGVjaWZpYyBkcml2ZXIgbW9kdWxlcy4gVGhpcyB3 b3VsZCBtZWFuIHNwbGl0dGluZyB0aGUKPiBNVDc1MzAgTURJTyBkcml2ZXIgdG8gTVQ3NTMwIGFu ZCBNVDc1MzEgYWxvbmcgd2l0aCBtb3ZpbmcgY29kZSBmcm9tIGNvcmUgdG8KPiB0aGVzZSB0d28g ZHJpdmVycy4gSSBiZWxpZXZlIHRoaXMgd291bGQgYXBwbHkgZm9yIE1UNzk4OCB0b28uIFRoZXJl IHdvdWxkIGJlCj4gYSBiaXQgb2YgcmV1c2VkIGNvZGUgYnV0IGl0IHNob3VsZCBmb2xsb3cgdGhl IGlkZWEgb2Ygd2hhdCB5b3Ugc2F5IGFib3ZlLgo+IFRoZW4gd2UgY2FuIGNvbmZpZ3VyZSB0aGUg a2NvbmZpZyBhY2NvcmRpbmdseS4KPiAKPiBBcsSxbsOnCgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdAps aW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVh ZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==