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 68A09C77B61 for ; Sun, 16 Apr 2023 14:19:00 +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=JAli8YrFvwkzrB5cEXoGtnQxg8FuF8lTjkJct98diUs=; b=DMbJqn09a+ByTFfgWinEwKTSR7 2eJgDjQnj06LglAuENFXcb01QPJ22P4flc0Jvcdev7RK9cgzpFY6gegwe9mTD3cJHn1wnpf2Het8t 40vf3XaJT2QIHbvYxYA+BuQXPa6lZEj9ejmTJ3WrS3HXYM0ZUgbILygSvHaABmiDBL+LVvX/ub8tx Pdu91qnvFvqWmZ00X52ZNEveIee+AtMvGS4BsNCUeC5dTPBsJl9VHvrskQEIIWscaBEI+XxUHF8FG Q2aRD8a0m/TGVUpMWAxVKzhW11b7jdf8uU9GefmNVbfhC1RrgtvXm0foBBSHwk80Cl63smJHi56AU OkJ7Wkgw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1po3DR-00DwlZ-2G; Sun, 16 Apr 2023 14:18:53 +0000 Received: from fudo.makrotopia.org ([2a07:2ec0:3002::71]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1po3DO-00Dwke-0X; Sun, 16 Apr 2023 14:18:52 +0000 Received: from local by fudo.makrotopia.org with esmtpsa (TLS1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.96) (envelope-from ) id 1po3D4-0001gF-2d; Sun, 16 Apr 2023 16:18:30 +0200 Date: Sun, 16 Apr 2023 15:18:27 +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: <8d36ff3b-e084-9f79-4c00-ec832f2cdbb3@arinc9.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230416_071850_359095_AB8A2C9E X-CRM114-Status: GOOD ( 53.61 ) 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 Sun, Apr 16, 2023 at 04:48:23PM +0300, Arınç ÜNAL wrote: > On 16.04.2023 15:08, Daniel Golle wrote: > > There are two variants of the MT7531 switch IC which got different > > features (and pins) regarding port 5: > > * MT7531AE: SGMII/1000Base-X/2500Base-X SerDes PCS > > * MT7531BE: RGMII > > > > Moving the creation of the SerDes PCS from mt753x_setup to mt7530_probe > > with commit 6de285229773 ("net: dsa: mt7530: move SGMII PCS creation > > to mt7530_probe function") works fine for MT7531AE which got two > > instances of mtk-pcs-lynxi, however, MT7531BE requires mt7531_pll_setup > > to setup clocks before the single PCS on port 6 (usually used as CPU > > port) starts to work and hence the PCS creation failed on MT7531BE. > > > > Fix this by introducing a pointer to mt7531_create_sgmii function in > > struct mt7530_priv and call it again at the end of mt753x_setup like it > > was before commit 6de285229773 ("net: dsa: mt7530: move SGMII PCS > > creation to mt7530_probe function"). > > > > Fixes: 6de285229773 ("net: dsa: mt7530: move SGMII PCS creation to mt7530_probe function") > > Signed-off-by: Daniel Golle > > I'll put my 2 cents about the patch along with responding to your points on > the other thread here. > > > Why don't we use my original solution [1] which has some advantages: > > > > * It doesn't requrire additional export of mt7530_regmap_bus > > > > * 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. > > > > > * It doesn't expose the dysfunctional SerDes PCS for port 5 on MT7531BE > > This will still fail and hence result in probing on MT7531 to exit > > prematurely, preventing the switch driver from being loaded. > > Before 9ecc00164dc23 ("net: dsa: mt7530: refactor SGMII PCS creation") > > the return value of mtk_pcs_lynxi_create was ignored, now it isn't... > > Ok, so checking whether port 5 is SGMII or not on the PCS creation code > should be done on the same patch that fixes this issue. > > > > > * It changes much less in terms of LoC > > I'd rather prefer a better logic than the "least amount of changes possible" > approach. > > Let's analyse what this patch does: > > With this patch, mt7531_create_sgmii() is run after mt7530_setup_mdio is > run, under mt753x_setup(). mt7531_pll_setup() and, as the last requirement, > mt7530_setup_mdio() must be run to be able to create the PCS instances. That > also means running mt7530_free_irq_common must be avoided since the device > uses MDIO so mt7530_free_mdio_irq needs to be run too. > > While probing the driver, the priv->create_sgmii pointer will be made to > point to mt7531_create_sgmii, if MT7531 is detected. Why? This pointer won't > be used for any other devices and sgmii will always be created for any > MT7531 variants, so it's always going to point to mt7531_create_sgmii when > priv->id is ID_MT7531. So you're introducing a new pointer just to be able > to call mt7531_create_sgmii() on mt7530-mdio.c from mt7530.c. > > On mt753x_setup(), if priv->create_sgmii is pointing to something it will > now run whatever it points to with two arguments. One being the priv table > and the other being mt7531_dual_sgmii_supported() which returns 1 or 0 by > looking at the very same priv table. That looks bad. What could be done > instead is introduce a new field on the priv table that keeps the > information of whether port 5 on the MT7531 switch is SGMII or not. Yes, and on a 64-bit system that means 8 bytes of memory for each instance. Exporting a function or const implies significantly more overhead, and it would not be as nicely limited in scope as a function pointer would be. There are no other users in the kernel of the const you would export in your variant of the fix, so why have it exported? > > 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) > 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. > > 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? 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. 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... 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 24566C77B61 for ; Sun, 16 Apr 2023 14:19:43 +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=ORZX8sA0ROhqRsgvoy6Dk2377dImHioSGTSnRsUL0zE=; b=e1B+Z+VqVI44BZ 0vug+M8MTOpTLBf7/J5AXD/8uIpOxw+BKGu3wZp3qmM91YZsbuxbSs8/CuEIxEsB44XHIx8cnj61d BPmu0++JEYI2LftJdaziLraw3fLZ4G7SSnHwtqUPEW7GnOLcZnmXWJQXP4nmbYAgkOqndGK/EJQq6 epRacbk9R20VdjQoKOo2Ir7vQBWI8PUEF7P+aYl3SQaHAv+Xah1SDkMeD2bgdePsNZ3DCr8YrpKBE Yl4GwS6oMZEykvTGgwhL5qojEIDVtv9+SFMqapYBvxvqnkKSiiYAv8nrJqv3EvRMvaQiJYRVxLNVB htjpG9qvyzIKLy7Cky3g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1po3DS-00Dwlw-0m; Sun, 16 Apr 2023 14:18:54 +0000 Received: from fudo.makrotopia.org ([2a07:2ec0:3002::71]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1po3DO-00Dwke-0X; Sun, 16 Apr 2023 14:18:52 +0000 Received: from local by fudo.makrotopia.org with esmtpsa (TLS1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.96) (envelope-from ) id 1po3D4-0001gF-2d; Sun, 16 Apr 2023 16:18:30 +0200 Date: Sun, 16 Apr 2023 15:18:27 +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: <8d36ff3b-e084-9f79-4c00-ec832f2cdbb3@arinc9.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230416_071850_359095_AB8A2C9E X-CRM114-Status: GOOD ( 53.61 ) 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 T24gU3VuLCBBcHIgMTYsIDIwMjMgYXQgMDQ6NDg6MjNQTSArMDMwMCwgQXLEsW7DpyDDnE5BTCB3 cm90ZToKPiBPbiAxNi4wNC4yMDIzIDE1OjA4LCBEYW5pZWwgR29sbGUgd3JvdGU6Cj4gPiBUaGVy ZSBhcmUgdHdvIHZhcmlhbnRzIG9mIHRoZSBNVDc1MzEgc3dpdGNoIElDIHdoaWNoIGdvdCBkaWZm ZXJlbnQKPiA+IGZlYXR1cmVzIChhbmQgcGlucykgcmVnYXJkaW5nIHBvcnQgNToKPiA+ICAgKiBN VDc1MzFBRTogU0dNSUkvMTAwMEJhc2UtWC8yNTAwQmFzZS1YIFNlckRlcyBQQ1MKPiA+ICAgKiBN VDc1MzFCRTogUkdNSUkKPiA+IAo+ID4gTW92aW5nIHRoZSBjcmVhdGlvbiBvZiB0aGUgU2VyRGVz IFBDUyBmcm9tIG10NzUzeF9zZXR1cCB0byBtdDc1MzBfcHJvYmUKPiA+IHdpdGggY29tbWl0IDZk ZTI4NTIyOTc3MyAoIm5ldDogZHNhOiBtdDc1MzA6IG1vdmUgU0dNSUkgUENTIGNyZWF0aW9uCj4g PiB0byBtdDc1MzBfcHJvYmUgZnVuY3Rpb24iKSB3b3JrcyBmaW5lIGZvciBNVDc1MzFBRSB3aGlj aCBnb3QgdHdvCj4gPiBpbnN0YW5jZXMgb2YgbXRrLXBjcy1seW54aSwgaG93ZXZlciwgTVQ3NTMx QkUgcmVxdWlyZXMgbXQ3NTMxX3BsbF9zZXR1cAo+ID4gdG8gc2V0dXAgY2xvY2tzIGJlZm9yZSB0 aGUgc2luZ2xlIFBDUyBvbiBwb3J0IDYgKHVzdWFsbHkgdXNlZCBhcyBDUFUKPiA+IHBvcnQpIHN0 YXJ0cyB0byB3b3JrIGFuZCBoZW5jZSB0aGUgUENTIGNyZWF0aW9uIGZhaWxlZCBvbiBNVDc1MzFC RS4KPiA+IAo+ID4gRml4IHRoaXMgYnkgaW50cm9kdWNpbmcgYSBwb2ludGVyIHRvIG10NzUzMV9j cmVhdGVfc2dtaWkgZnVuY3Rpb24gaW4KPiA+IHN0cnVjdCBtdDc1MzBfcHJpdiBhbmQgY2FsbCBp dCBhZ2FpbiBhdCB0aGUgZW5kIG9mIG10NzUzeF9zZXR1cCBsaWtlIGl0Cj4gPiB3YXMgYmVmb3Jl IGNvbW1pdCA2ZGUyODUyMjk3NzMgKCJuZXQ6IGRzYTogbXQ3NTMwOiBtb3ZlIFNHTUlJIFBDUwo+ ID4gY3JlYXRpb24gdG8gbXQ3NTMwX3Byb2JlIGZ1bmN0aW9uIikuCj4gPiAKPiA+IEZpeGVzOiA2 ZGUyODUyMjk3NzMgKCJuZXQ6IGRzYTogbXQ3NTMwOiBtb3ZlIFNHTUlJIFBDUyBjcmVhdGlvbiB0 byBtdDc1MzBfcHJvYmUgZnVuY3Rpb24iKQo+ID4gU2lnbmVkLW9mZi1ieTogRGFuaWVsIEdvbGxl IDxkYW5pZWxAbWFrcm90b3BpYS5vcmc+Cj4gCj4gSSdsbCBwdXQgbXkgMiBjZW50cyBhYm91dCB0 aGUgcGF0Y2ggYWxvbmcgd2l0aCByZXNwb25kaW5nIHRvIHlvdXIgcG9pbnRzIG9uCj4gdGhlIG90 aGVyIHRocmVhZCBoZXJlLgo+IAo+ID4gV2h5IGRvbid0IHdlIHVzZSBteSBvcmlnaW5hbCBzb2x1 dGlvbiBbMV0gd2hpY2ggaGFzIHNvbWUgYWR2YW50YWdlczoKPiA+IAo+ID4gICogSXQgZG9lc24n dCByZXF1cmlyZSBhZGRpdGlvbmFsIGV4cG9ydCBvZiBtdDc1MzBfcmVnbWFwX2J1cwo+ID4gCj4g PiAgKiBJdCBkb2Vzbid0IG1vdmUgUENTIGNyZWF0aW9uIHRvIG10NzUzMC5jLCBoZW5jZSBQQ1Nf TVRLX0xZTlhJIGlzCj4gPiAgICBvbmx5IHJlcXVpcmVkIGZvciBNRElPLWNvbm5lY3RlZCBzd2l0 Y2hlcwo+ID4gICAgKHdpdGggeW91ciBwYXRjaCB3ZSB3b3VsZCBoYXZlIHRvIG1vdmUgdGhlIGRl cGVuZGVuY3kgb24gUENTX01US19MWU5YSQo+ID4gICAgZnJvbSBORVRfRFNBX01UNzUzMF9NRElP IHRvIE5FVF9EU0FfTVQ3NTMwKQo+IAo+IE1heWJlIHRoaXMgaXMgd2hhdCBzaG91bGQgaGFwcGVu LiBNYXliZSB0aGUgUENTIGNyZWF0aW9uIChhbmQgdGhlcmVmb3JlCj4gbXQ3NTMwX3JlZ21hcF9i dXMpIHNob3VsZCBiZSBvbiB0aGUgY29yZSBkcml2ZXIuIEJvdGggYXJlIG9uIHRoZSBNRElPIGRy aXZlcgo+IGZvciB0aGUgc29sZSByZWFzb24gb2Ygb25seSB0aGUgZGV2aWNlcyBvbiB0aGUgTURJ TyBkcml2ZXIgY3VycmVudGx5IHVzaW5nCj4gaXQuIEl0J3Mgbm90IGFuIE1ESU8tc3BlY2lmaWMg b3BlcmF0aW9uIGFzIGZhciBhcyBJIGNhbiB0ZWxsLiBIYXZpbmcgaXQgb24KPiB0aGUgY29yZSBk cml2ZXIgd291bGQgbWFrZSBtb3JlIHNlbnNlIGluIHRoZSBsb25nIHJ1bi4KCldoaWNoICJsb25n IHJ1biIgYXJlIHlvdSB0YWxraW5nIGFib3V0PwpyZWdtYXAgY3JlYXRpb24gaXMgYnVzLXNwZWNp ZmljLCBhbmQgc28gaXMgdGhlIGV4aXN0ZW5jZSBvZiBMeW54SSBQQ1MuClRoZXJlIHNpbXBseSBh cmVuJ3QgYW55IE1NSU8tY29ubmVjdGVkIHN3aXRjaGVzIHdoaWNoIGNvbWUgd2l0aCB0aGF0IElQ LgpBbmQgSSBzdHJvbmdseSBkb3VidCB0aGVyZSBldmVyIHdpbGwgYmUuIEFuZCBldmVuIGlmLCB3 aHkgc2hvdWxkIHdlIG5vdwpwcmVwYXJlIGZvciBhbiBlbnRpcmVseSBzcGVjdWxhdGl2ZSBmdXR1 cmU/IElmIGl0IGFjdHVhbGx5IGhhcHBlbnMsIGllLgppbiBjYXNlIHRoZXJlIGlzIGdvaW5nIHRv IGJlIGEgbmV3IFNvQyB3aXRoIE1NSU8tY29ubmVjdGVkIHN3aXRjaCB3aGljaApkb2VzIGNvbWVz IHdpdGggTHlueEkgUENTIChlLmcuIGZvciBwb3J0IDUgb25seSkgd2UgY2FuIHN0aWxsIG1vdmUg dGhlCmNvZGUuCgo+IAo+ID4gCj4gPiAgKiBJdCBkb2Vzbid0IGV4cG9zZSB0aGUgZHlzZnVuY3Rp b25hbCBTZXJEZXMgUENTIGZvciBwb3J0IDUgb24gTVQ3NTMxQkUKPiA+ICAgIFRoaXMgd2lsbCBz dGlsbCBmYWlsIGFuZCBoZW5jZSByZXN1bHQgaW4gcHJvYmluZyBvbiBNVDc1MzEgdG8gZXhpdAo+ ID4gICAgcHJlbWF0dXJlbHksIHByZXZlbnRpbmcgdGhlIHN3aXRjaCBkcml2ZXIgZnJvbSBiZWlu ZyBsb2FkZWQuCj4gPiAgICBCZWZvcmUgOWVjYzAwMTY0ZGMyMyAoIm5ldDogZHNhOiBtdDc1MzA6 IHJlZmFjdG9yIFNHTUlJIFBDUyBjcmVhdGlvbiIpCj4gPiAgICB0aGUgcmV0dXJuIHZhbHVlIG9m IG10a19wY3NfbHlueGlfY3JlYXRlIHdhcyBpZ25vcmVkLCBub3cgaXQgaXNuJ3QuLi4KPiAKPiBP aywgc28gY2hlY2tpbmcgd2hldGhlciBwb3J0IDUgaXMgU0dNSUkgb3Igbm90IG9uIHRoZSBQQ1Mg Y3JlYXRpb24gY29kZQo+IHNob3VsZCBiZSBkb25lIG9uIHRoZSBzYW1lIHBhdGNoIHRoYXQgZml4 ZXMgdGhpcyBpc3N1ZS4KPiAKPiA+IAo+ID4gICogSXQgY2hhbmdlcyBtdWNoIGxlc3MgaW4gdGVy bXMgb2YgTG9DCj4gCj4gSSdkIHJhdGhlciBwcmVmZXIgYSBiZXR0ZXIgbG9naWMgdGhhbiB0aGUg ImxlYXN0IGFtb3VudCBvZiBjaGFuZ2VzIHBvc3NpYmxlIgo+IGFwcHJvYWNoLgo+IAo+IExldCdz IGFuYWx5c2Ugd2hhdCB0aGlzIHBhdGNoIGRvZXM6Cj4gCj4gV2l0aCB0aGlzIHBhdGNoLCBtdDc1 MzFfY3JlYXRlX3NnbWlpKCkgaXMgcnVuIGFmdGVyIG10NzUzMF9zZXR1cF9tZGlvIGlzCj4gcnVu LCB1bmRlciBtdDc1M3hfc2V0dXAoKS4gbXQ3NTMxX3BsbF9zZXR1cCgpIGFuZCwgYXMgdGhlIGxh c3QgcmVxdWlyZW1lbnQsCj4gbXQ3NTMwX3NldHVwX21kaW8oKSBtdXN0IGJlIHJ1biB0byBiZSBh YmxlIHRvIGNyZWF0ZSB0aGUgUENTIGluc3RhbmNlcy4gVGhhdAo+IGFsc28gbWVhbnMgcnVubmlu ZyBtdDc1MzBfZnJlZV9pcnFfY29tbW9uIG11c3QgYmUgYXZvaWRlZCBzaW5jZSB0aGUgZGV2aWNl Cj4gdXNlcyBNRElPIHNvIG10NzUzMF9mcmVlX21kaW9faXJxIG5lZWRzIHRvIGJlIHJ1biB0b28u Cj4gCj4gV2hpbGUgcHJvYmluZyB0aGUgZHJpdmVyLCB0aGUgcHJpdi0+Y3JlYXRlX3NnbWlpIHBv aW50ZXIgd2lsbCBiZSBtYWRlIHRvCj4gcG9pbnQgdG8gbXQ3NTMxX2NyZWF0ZV9zZ21paSwgaWYg TVQ3NTMxIGlzIGRldGVjdGVkLiBXaHk/IFRoaXMgcG9pbnRlciB3b24ndAo+IGJlIHVzZWQgZm9y IGFueSBvdGhlciBkZXZpY2VzIGFuZCBzZ21paSB3aWxsIGFsd2F5cyBiZSBjcmVhdGVkIGZvciBh bnkKPiBNVDc1MzEgdmFyaWFudHMsIHNvIGl0J3MgYWx3YXlzIGdvaW5nIHRvIHBvaW50IHRvIG10 NzUzMV9jcmVhdGVfc2dtaWkgd2hlbgo+IHByaXYtPmlkIGlzIElEX01UNzUzMS4gU28geW91J3Jl IGludHJvZHVjaW5nIGEgbmV3IHBvaW50ZXIganVzdCB0byBiZSBhYmxlCj4gdG8gY2FsbCBtdDc1 MzFfY3JlYXRlX3NnbWlpKCkgb24gbXQ3NTMwLW1kaW8uYyBmcm9tIG10NzUzMC5jLgo+IAo+IE9u IG10NzUzeF9zZXR1cCgpLCBpZiBwcml2LT5jcmVhdGVfc2dtaWkgaXMgcG9pbnRpbmcgdG8gc29t ZXRoaW5nIGl0IHdpbGwKPiBub3cgcnVuIHdoYXRldmVyIGl0IHBvaW50cyB0byB3aXRoIHR3byBh cmd1bWVudHMuIE9uZSBiZWluZyB0aGUgcHJpdiB0YWJsZQo+IGFuZCB0aGUgb3RoZXIgYmVpbmcg bXQ3NTMxX2R1YWxfc2dtaWlfc3VwcG9ydGVkKCkgd2hpY2ggcmV0dXJucyAxIG9yIDAgYnkKPiBs b29raW5nIGF0IHRoZSB2ZXJ5IHNhbWUgcHJpdiB0YWJsZS4gVGhhdCBsb29rcyBiYWQuIFdoYXQg Y291bGQgYmUgZG9uZQo+IGluc3RlYWQgaXMgaW50cm9kdWNlIGEgbmV3IGZpZWxkIG9uIHRoZSBw cml2IHRhYmxlIHRoYXQga2VlcHMgdGhlCj4gaW5mb3JtYXRpb24gb2Ygd2hldGhlciBwb3J0IDUg b24gdGhlIE1UNzUzMSBzd2l0Y2ggaXMgU0dNSUkgb3Igbm90LgoKWWVzLCBhbmQgb24gYSA2NC1i aXQgc3lzdGVtIHRoYXQgbWVhbnMgOCBieXRlcyBvZiBtZW1vcnkgZm9yIGVhY2ggaW5zdGFuY2Uu CkV4cG9ydGluZyBhIGZ1bmN0aW9uIG9yIGNvbnN0IGltcGxpZXMgc2lnbmlmaWNhbnRseSBtb3Jl IG92ZXJoZWFkLCBhbmQKaXQgd291bGQgbm90IGJlIGFzIG5pY2VseSBsaW1pdGVkIGluIHNjb3Bl IGFzIGEgZnVuY3Rpb24gcG9pbnRlciB3b3VsZCBiZS4KClRoZXJlIGFyZSBubyBvdGhlciB1c2Vy cyBpbiB0aGUga2VybmVsIG9mIHRoZSBjb25zdCB5b3Ugd291bGQgZXhwb3J0IGluCnlvdXIgdmFy aWFudCBvZiB0aGUgZml4LCBzbyB3aHkgaGF2ZSBpdCBleHBvcnRlZD8KCj4gCj4gQSBzaW1pbGFy IGxvZ2ljIGlzIGFscmVhZHkgdGhlcmUgb24gdGhlIFUtQm9vdCBNZWRpYVRlayBldGhlcm5ldCBk cml2ZXIuCj4gCj4gaHR0cHM6Ly9naXRodWIuY29tL3UtYm9vdC91LWJvb3QvYmxvYi9hOTRhYjU2 MWUyZjQ5YTgwZDg1Nzk5MzBlODQwYjgxMGFiMWExMzMwL2RyaXZlcnMvbmV0L210a19ldGguYyNM OTAzCj4gCj4gU28gdGhpcyBwYXRjaCBmaXhlcyB0aGUgaXNzdWUgd2l0aCB0aGUgb25seSBjb25z aWRlcmF0aW9uIGJlaW5nIGNoYW5naW5nIGFzCj4gbGVzcyBsaW5lcyBvZiBjb2RlIGFzIHBvc3Np YmxlLgoKWW91IGFyZSBpZ25vcmUgdHdvIG1vcmUgaW1wb3J0YW50IGFyZ3VtZW50czoKICogSXQg ZG9lc24ndCByZXF1cmlyZSBhZGRpdGlvbmFsIGV4cG9ydCBvZiBtdDc1MzBfcmVnbWFwX2J1cwog ICAod2hpY2ggd291bGQgaW1wbHkgc2lnbmlmaWNhbnRseSBtb3JlIHN0b3JhZ2Ugb3ZlcmhlYWQg Y29tcGFyZWQgdG8KICAgYW4gYWRkaXRpb25hbCBmdW5jdGlvbiBwb2ludGVyIGluIGEgcHJpdiBz dHJ1Y3QpCgogKiBJdCBkb2Vzbid0IG1vdmUgUENTIGNyZWF0aW9uIHRvIG10NzUzMC5jLCBoZW5j ZSBQQ1NfTVRLX0xZTlhJIGlzCiAgIG9ubHkgcmVxdWlyZWQgZm9yIE1ESU8tY29ubmVjdGVkIHN3 aXRjaGVzCiAgICh3aXRoIHlvdXIgcGF0Y2ggd2Ugd291bGQgaGF2ZSB0byBtb3ZlIHRoZSBkZXBl bmRlbmN5IG9uIFBDU19NVEtfTFlOWEkKICAgZnJvbSBORVRfRFNBX01UNzUzMF9NRElPIHRvIE5F VF9EU0FfTVQ3NTMwKQoKPiBBbmQgdGhhdCdzIG9rYXkuIFdlIGNhbiBtYWtlIHRoZSBsZWFzdAo+ IGFtb3VudCBvZiBjaGFuZ2VzIHRvIGZpeCB0aGUgaXNzdWUgZmlyc3QsIHRoZW4gaW1wcm92ZSB0 aGUgZHJpdmVyLiBCdXQKPiB0aGVyZSdzIG5vdGhpbmcgbmV3IG1hZGUgb24gdGhlIGRyaXZlciBh ZnRlciB0aGUgY29tbWl0IHRoYXQgY2F1c2VkIHRoaXMKPiBpc3N1ZSwgYmFja3BvcnRhYmlsaXR5 IHRvIHRoZSBzdGFibGUgdHJlZXMgaXMgYSBub24taXNzdWUuIFNvIHdoeSBub3QgZG8gaXQKPiBw cm9wZXJseSB0aGUgZmlyc3QgdGltZT8KCk1vc3Qgb2YgYWxsIEknZCByYXRoZXIgaGF2ZSBpdCBm aXhlZCBiZWZvcmUgbmV0LW5leHQgaXMgbWVyZ2VkIHRvIExpbnVzJwp0cmVlIGFuZCBhbHNvIGJl Zm9yZSBuZXQtbmV4dCB3aWxsIGNsb3NlIGFnYWluLgoKSG93ZXZlciwgSSBhbHNvIHNpbXBseSBk b24ndCBzZWUgd2hhdCB3b3VsZCBiZSBtb3JlICJwcm9wZXIiIGFib3V0IHlvdXIKc29sdXRpb24u Cgo+IAo+IFdoYXRldmVyIHRoZSBvdXRjb21lIHdpdGggdGhpcyBwYXRjaCBpcywgb24gbXkgdXBj b21pbmcgcGF0Y2ggc2VyaWVzLCBJCj4gaW50ZW5kIHRvIG1vdmUgbXQ3NTMxX2NyZWF0ZV9zZ21p aSB0byBtdDc1MzAuYy4gVGhlbiBpbnRyb2R1Y2UKPiBwcml2LT5wNV9zZ21paSB0byBnZXQgcmlk IG9mIG10NzUzMV9kdWFsX3NnbWlpX3N1cHBvcnRlZCgpLgoKV2hhdCBpcyB0aGUgYXJndW1lbnQg Zm9yIHRoYXQ/CgpUaGVyZSBpcyBub3QgYSBzaW5nbGUgTU1JTy1jb25uZWN0ZWQgc3dpdGNoIHdo aWNoIGNvbWVzIHdpdGggTHlueEkgUENTLgooc2VlIGFib3ZlKQoKSW1obyB3ZSBzaG91bGQgcmF0 aGVyIHRyeSB0byB3b3JrIGludG8gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiBhbmQgbW92ZQptb3Jl IGNvZGUgb25seSB1c2VkIG9uIGVpdGhlciBNRElPIG9yIE1NSU8gZnJvbSBjb3JlIHRvIHRoZQpi dXMtc3BlY2lmaWMgZHJpdmVycy4gSWYgbmVlZGVkIHdlIGNhbiBldmVuIHNwbGl0IHRoZW0gbW9y ZSwgZWcuIGhhdmUKZGlmZmVyZW50IG1vZHVsZXMgZm9yIE1UNzUzMCBhbmQgTVQ3NTMxLCBzbyB0 aGF0IGV2ZW4gdGhlIGRyaXZlciBmb3IKTURJTy1jb25uZWN0ZWQgTVQ3NTMwIHdvdWxkIG5vdCBy ZXF1aXJlIE1US19QQ1NfTFlOWEkuCgpJbiB0aGF0IHNlbnNlIEknbSBhIGJpZyBmYW4gb2YgdGhl IHN0cnVjdHVyZSBvZiB0aGUgbXQ3NiB3aXJlbGVzcwpkcml2ZXI6IEhhdmUgYSBjb3JlIG1vZHVs ZSBmb3Igc2hhcmVkIGhlbHBlciBmdW5jdGlvbnMgYW5kIHRoZW4KZGV2aWNlLXNwZWNpZmljIGRy aXZlciBtb2R1bGVzLiBVbmZvcnR1bmF0ZWx5IG1hbnkgaWYgbm90IG1vc3QgZHJpdmVycwphcmUg ZG9pbmcgdGhlIGV4YWN0IG9wcG9zaXRlIGFwcHJvYWNoLCBpZS4gaGF2aW5nIHNvbWUgYWJzdHJh dGlvbiBsYXllcgp3aGljaCB3aWxsIGFsd2F5cyBuZWVkIHRvIGJlIGV4dGVuZGVkIGFuZCBjaGFu Z2VkIHdpdGggZXZlcnkKdW5mb3Jlc2VlYWJsZSBuZXcgaGFyZHdhcmUgdG8gYmUgc3VwcG9ydGVk IHdoaWNoIGp1c3QgcmVzdWx0cyBpbiBsb3RzCm9mIG92ZXJoZWFkIGFuZCBpcyBhIGJ1cmRlbiB0 byBtYWludGFpbi4gWW91IGNhbiBzZWUgdGhhdCBpbiB0aGUgcnQyeDAwCndpcmVsZXNzIGRyaXZl ciB3aGljaCBJIGFsc28gd29ya2VkIG9uIGEgbG90OiBNb3N0IG9mIHRoZSBhYnN0cmFjdGlvbnMK YXJlbid0IGV2ZW4gdXNlZnVsIHdpdGggYW55IG9mIHRoZSBsYXRlc3QgaGFyZHdhcmUgZ2VuZXJh dGlvbnMuCgp0bDtkcjogV2hhdCdzIHdyb25nIHdpdGggbW92aW5nIGZ1bmN0aW9ucyBzcGVjaWZp YyB0byBlaXRoZXIgdmFyaWFudAooTU1JTyB2cy4gTURJTykgaW50byB0aGUgY29ycmVzcG9uZGlu ZyBtb2R1bGVzIGFuZCBrZWVwaW5nIHRoZSBjb3JlCnNsaW0gYW5kIHJlYWxseSBvbmx5IGNvdmVy IHNoYXJlZCBmdW5jdGlvbmFsaXR5PyBUaGlzIGlzIGFsc28gd2h5IEkKb3JpZ2luYWxseSB3YW50 ZWQgdGhlIG5hbWVzIG9mIGZpbGVzIGFuZCBLY29uZmlnIHN5bWJvbHMgdG8gcmVmbGVjdCB0aGUK c3VwcG9ydGVkIGhhcmR3YXJlIHJhdGhlciB0aGFuIHRoZSBzdXBwb3J0ZWQgYnVzLXR5cGUgLS0g SSd2ZSBjaGFuZ2VkCnRoYXQgdXBvbiB5b3VyIHJlcXVlc3QgYW5kIG5vdyBiZWxpZXZlIEkgc2hv dWxkIGhhdmUgYXJndWVkIG1vcmUKY2xlYXJseSB3aHkgSSBtYWRlIG15IGNob2ljZSBsaWtlIEkg ZGlkLi4uCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwps aW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJh ZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51 eC1hcm0ta2VybmVsCg==