From mboxrd@z Thu Jan 1 00:00:00 1970 From: florian@openwrt.org (Florian Fainelli) Date: Fri, 05 Apr 2013 16:23:17 +0200 Subject: [PATCH 1/5 v2] mv643xx_eth: add Device Tree bindings In-Reply-To: References: <1365071235-11611-1-git-send-email-florian@openwrt.org> <1365071235-11611-2-git-send-email-florian@openwrt.org> <20130404212906.GA25904@schnuecks.de> <515E9FE0.8050402@openwrt.org> Message-ID: <515EDE55.9030609@openwrt.org> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hello Sebastian, Le 04/05/13 15:58, Sebastian Hesselbarth a ?crit : > On Fri, Apr 5, 2013 at 11:56 AM, Florian Fainelli wrote: >> [snip] > > Florian, > > took me a while to try you patches out on Dove but now I fixed all > issues. I will > comment on all related patches but first I want to comment here. > > One general note for Dove related patches: You didn't remove the registration of > ge platform_device from mach-dove/board-dt.c. That will lead to double > registration > of mdio and mv643xx_eth/shared, so you'll never be sure if DT or non-DT code is > executed. I haven't checked mach-kirkwood/board-dt.c or orion5x code. This was intentional, this patchset is just preparatory in the sense that it does no conversion of the existing users of the mv643xx_eth platform driver over DT (have some patches to that though). I wanted to resume the discussion on these bindings first, then proceed with the conversion. > >>>> if (!mv643xx_eth_version_printed++) >>>> pr_notice("MV-643xx 10/100/1000 ethernet driver version >>>> %s\n", >>> >>> >>> This is not related to your change, but there is a problem in this >>> function that has already been discussed in the past if I remember >>> correctly: The respective clock needs to be enabled here (at least >>> on Kirkwood), since accesses to the hardware are done below. >>> Enabling the clock only in mv643xx_eth_probe() is too late. >>> >>> As said, this is not a problem introduced by your changes (and which >>> is currently circumvented by enabling the respective clocks in >>> kirkwood_legacy_clk_init() and kirkwood_ge0x_init()), but we might >>> want to fix this now to get rid of unconditionally enabling the GE >>> clocks in the DT case. >> >> >> I think there may have been some confusion between the "ethernet-group" >> clock and the actual Ethernet port inside the "ethernet-group". The >> mv643xx_eth driver assumes we have a per-port clock gating scheme, while I >> think we have a per "ethernet-group" clock gating scheme instead. Like you >> said, I think this should be addressed separately. > > IMHO, there should be a clocks property where ever you try to access registers, > i.e. in all three "parts" mv643xx_eth_shared (group), mv643xx_eth > (port) and mdio. > Since port depends on shared it would be ok to have it per group but that may > collide with other SoCs than Dove/Kirkwood that have per port clocks. Ok, which means that we should also teach mv643xx_eth_shared_probe() about it, as well as the orion-mdio driver. I don't have any particular objections since it should just make things safer with respect to clocking. > > Is that separation (group/port) really required for any SoC? Probably not, it was not clear when I looked at mv78xx0 if it uses two ports per group or 4 groups and 1 port. Anyway, since we are re-using the existing Device Tree binding definition and that the hardware present itself as ethernet groups and ports, I don't see any problem with keeping that difference since it allows for fine-grained representation of the hardware. > >> >> [snip] >>> >>> You don't change the clk initialization here: >>> >>> #if defined(CONFIG_HAVE_CLK) >>> mp->clk = clk_get(&pdev->dev, (pdev->id ? "1" : "0")); >>> if (!IS_ERR(mp->clk)) { >>> clk_prepare_enable(mp->clk); >>> mp->t_clk = clk_get_rate(mp->clk); >>> } >>> #endif >>> >>> Which, if I understand correctly, works in the DT case because you >>> assign "clock-names" to the clocks in the DTS. However, I wonder >>> whether this works for any but the first Ethernet device. > > Yes, it does. Assigned clocks from clocks property get a clock alias for > that device name (node name). Using anything else than NULL here is > IMHO just wrong. We should rather provide proper clock aliases for non-DT case. > >>> In the old platform device setup, the pdev->id was set when >>> initialiazing the platform_device structure in common.c. Where is >>> this done in the DT case? >> >> Looks like you are right, in the DT case, I assume that we should lookup the >> clock using NULL instead of "1" or "0" so we match any clock instead of a >> specific one. > > Yes. > >> [snip] >>> >>> >>> In phy_scan(), the phy is searched like this: >>> >>> snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, >>> "orion-mdio-mii", addr); >>> >>> phydev = phy_connect(mp->dev, phy_id, >>> mv643xx_eth_adjust_link, >>> PHY_INTERFACE_MODE_GMII); >>> >>> But "orion-mdio-mii:xx" is the name of the PHY if MDIO is setup via a >>> platform_device. I could not get this to work if the MDIO device is >>> setup via DT. Am I doing something wrong? >> >> I just missed updating this part of the code to probe for PHYs. The board I >> tested with uses a "PHY_NONE" configuration. I will add the missing bits for >> of_phy_connect() to be called here. > > I don't think that the ethernet controller should probe the PHY's on mdio-bus > at all. At least not for DT enabled platforms. I had a look at DT and non-DT > mdio-bus sources, and realized that there is a bus scan for non-DT only. > of_mdiobus_register requires you to set (and know) the PHY address. One reason the Ethernet controller could do the probing is in the case we need to apply quirks (e.g: using phydev->flags) for instance. This can be done even after the MDIO bus driver did probe PHY devices though. > > I prepared a patch for of_mdio_register that will allow you to probe mdio and > assign phy addresses to each node found. Currently, the heuristic for probing > is: assign each phy node the next probed phy_addr starting with 0. But that > will not allow to e.g. set some PHY addresses and probe the rest. Ok, we just need to make sure that this does not break any specific use case, I don't think it does, since it seems to be more accurate or equivalent to Ethernet driver doing the probing. > > We had a similar discussion whether to probe or not for DT nodes, and I guess > there also will be some discussion about the above patch. OTOH we could just > (again) ask users of every kirkwood/orion5x/dove board to tell their > phy addresses > and fail to probe the phy for new boards... > > I will prepare a proper patch soon and post it on the corresponding lists. Cool, thanks! > >>> Additionally, in phy_scan() there is this: >>> >>> if (phy_addr == MV643XX_ETH_PHY_ADDR_DEFAULT) { >>> start = phy_addr_get(mp) & 0x1f; >>> num = 32; >>> } else { >>> ... >>> >>> MV643XX_ETH_PHY_ADDR_DEFAULT is defined as 0. However, many Kirkwood >>> devices use "MV643XX_ETH_PHY_ADDR(0)". If the module probe is >>> deferred in mv643xx_eth because the MDIO driver is not yet loaded, >>> all 32 PHY addresses are scanned without success. This is not needed >>> and clutters the log. >> >> >> Ok, I am not sure how we can circumvent the log cluttering that happens, >> what would be your suggestion? > > My suggestion is to change MV643XX_ETH_PHY_ADDR_DEFAULT from a valid > phy address (0) > to something invalid (32). I understand that using 0 helps if you > don't want to set it in mv643xx's platform_data > but it is always difficult to rely on that if 0 is a valid number. > > Changing the above to 32 should just work because most (all?) boards > using phy_scan should also > already use MV643XX_ETH_PHY_ADDR_DEFAULT. I also suggest to rename > current define to a > better name, e.g. MV643XX_ETH_PHY_ADDR_AUTOSCAN. Sounds good to me. -- Florian From mboxrd@z Thu Jan 1 00:00:00 1970 From: Florian Fainelli Subject: Re: [PATCH 1/5 v2] mv643xx_eth: add Device Tree bindings Date: Fri, 05 Apr 2013 16:23:17 +0200 Message-ID: <515EDE55.9030609@openwrt.org> References: <1365071235-11611-1-git-send-email-florian@openwrt.org> <1365071235-11611-2-git-send-email-florian@openwrt.org> <20130404212906.GA25904@schnuecks.de> <515E9FE0.8050402@openwrt.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: Sebastian Hesselbarth Cc: thomas.petazzoni@free-electrons.com, moinejf@free.fr, Simon Baatz , andrew@lunn.ch, netdev@vger.kernel.org, devicetree-discuss@lists.ozlabs.org, rob.herring@calxeda.com, grant.likely@secretlab.ca, jogo@openwrt.org, linux-arm-kernel@lists.infradead.org, jm@lentin.co.uk, davem@davemloft.net, buytenh@wantstofly.org, jason@lakedaemon.net List-Id: devicetree@vger.kernel.org SGVsbG8gU2ViYXN0aWFuLAoKTGUgMDQvMDUvMTMgMTU6NTgsIFNlYmFzdGlhbiBIZXNzZWxiYXJ0 aCBhIMOpY3JpdCA6Cj4gT24gRnJpLCBBcHIgNSwgMjAxMyBhdCAxMTo1NiBBTSwgRmxvcmlhbiBG YWluZWxsaSA8ZmxvcmlhbkBvcGVud3J0Lm9yZz4gd3JvdGU6Cj4+IFtzbmlwXQo+Cj4gRmxvcmlh biwKPgo+IHRvb2sgbWUgYSB3aGlsZSB0byB0cnkgeW91IHBhdGNoZXMgb3V0IG9uIERvdmUgYnV0 IG5vdyBJIGZpeGVkIGFsbAo+IGlzc3Vlcy4gSSB3aWxsCj4gY29tbWVudCBvbiBhbGwgcmVsYXRl ZCBwYXRjaGVzIGJ1dCBmaXJzdCBJIHdhbnQgdG8gY29tbWVudCBoZXJlLgo+Cj4gT25lIGdlbmVy YWwgbm90ZSBmb3IgRG92ZSByZWxhdGVkIHBhdGNoZXM6IFlvdSBkaWRuJ3QgcmVtb3ZlIHRoZSBy ZWdpc3RyYXRpb24gb2YKPiBnZSBwbGF0Zm9ybV9kZXZpY2UgZnJvbSBtYWNoLWRvdmUvYm9hcmQt ZHQuYy4gVGhhdCB3aWxsIGxlYWQgdG8gZG91YmxlCj4gcmVnaXN0cmF0aW9uCj4gb2YgbWRpbyBh bmQgbXY2NDN4eF9ldGgvc2hhcmVkLCBzbyB5b3UnbGwgbmV2ZXIgYmUgc3VyZSBpZiBEVCBvciBu b24tRFQgY29kZSBpcwo+IGV4ZWN1dGVkLiBJIGhhdmVuJ3QgY2hlY2tlZCBtYWNoLWtpcmt3b29k L2JvYXJkLWR0LmMgb3Igb3Jpb241eCBjb2RlLgoKVGhpcyB3YXMgaW50ZW50aW9uYWwsIHRoaXMg cGF0Y2hzZXQgaXMganVzdCBwcmVwYXJhdG9yeSBpbiB0aGUgc2Vuc2UgCnRoYXQgaXQgZG9lcyBu byBjb252ZXJzaW9uIG9mIHRoZSBleGlzdGluZyB1c2VycyBvZiB0aGUgbXY2NDN4eF9ldGggCnBs YXRmb3JtIGRyaXZlciBvdmVyIERUIChoYXZlIHNvbWUgcGF0Y2hlcyB0byB0aGF0IHRob3VnaCku IEkgd2FudGVkIHRvIApyZXN1bWUgdGhlIGRpc2N1c3Npb24gb24gdGhlc2UgYmluZGluZ3MgZmly c3QsIHRoZW4gcHJvY2VlZCB3aXRoIHRoZSAKY29udmVyc2lvbi4KCj4KPj4+PiAgICAgICAgICBp ZiAoIW12NjQzeHhfZXRoX3ZlcnNpb25fcHJpbnRlZCsrKQo+Pj4+ICAgICAgICAgICAgICAgICAg cHJfbm90aWNlKCJNVi02NDN4eCAxMC8xMDAvMTAwMCBldGhlcm5ldCBkcml2ZXIgdmVyc2lvbgo+ Pj4+ICVzXG4iLAo+Pj4KPj4+Cj4+PiBUaGlzIGlzIG5vdCByZWxhdGVkIHRvIHlvdXIgY2hhbmdl LCBidXQgdGhlcmUgaXMgYSBwcm9ibGVtIGluIHRoaXMKPj4+IGZ1bmN0aW9uIHRoYXQgaGFzIGFs cmVhZHkgYmVlbiBkaXNjdXNzZWQgaW4gdGhlIHBhc3QgaWYgSSByZW1lbWJlcgo+Pj4gY29ycmVj dGx5OiBUaGUgcmVzcGVjdGl2ZSBjbG9jayBuZWVkcyB0byBiZSBlbmFibGVkIGhlcmUgKGF0IGxl YXN0Cj4+PiBvbiBLaXJrd29vZCksIHNpbmNlIGFjY2Vzc2VzIHRvIHRoZSBoYXJkd2FyZSBhcmUg ZG9uZSBiZWxvdy4KPj4+IEVuYWJsaW5nIHRoZSBjbG9jayBvbmx5IGluIG12NjQzeHhfZXRoX3By b2JlKCkgaXMgdG9vIGxhdGUuCj4+Pgo+Pj4gQXMgc2FpZCwgdGhpcyBpcyBub3QgYSBwcm9ibGVt IGludHJvZHVjZWQgYnkgeW91ciBjaGFuZ2VzIChhbmQgd2hpY2gKPj4+IGlzIGN1cnJlbnRseSBj aXJjdW12ZW50ZWQgYnkgZW5hYmxpbmcgdGhlIHJlc3BlY3RpdmUgY2xvY2tzIGluCj4+PiBraXJr d29vZF9sZWdhY3lfY2xrX2luaXQoKSBhbmQga2lya3dvb2RfZ2UweF9pbml0KCkpLCBidXQgd2Ug bWlnaHQKPj4+IHdhbnQgdG8gZml4IHRoaXMgbm93IHRvIGdldCByaWQgb2YgdW5jb25kaXRpb25h bGx5IGVuYWJsaW5nIHRoZSBHRQo+Pj4gY2xvY2tzIGluIHRoZSBEVCBjYXNlLgo+Pgo+Pgo+PiBJ IHRoaW5rIHRoZXJlIG1heSBoYXZlIGJlZW4gc29tZSBjb25mdXNpb24gYmV0d2VlbiB0aGUgImV0 aGVybmV0LWdyb3VwIgo+PiBjbG9jayBhbmQgdGhlIGFjdHVhbCBFdGhlcm5ldCBwb3J0IGluc2lk ZSB0aGUgImV0aGVybmV0LWdyb3VwIi4gVGhlCj4+IG12NjQzeHhfZXRoIGRyaXZlciBhc3N1bWVz IHdlIGhhdmUgYSBwZXItcG9ydCBjbG9jayBnYXRpbmcgc2NoZW1lLCB3aGlsZSBJCj4+IHRoaW5r IHdlIGhhdmUgYSBwZXIgImV0aGVybmV0LWdyb3VwIiBjbG9jayBnYXRpbmcgc2NoZW1lIGluc3Rl YWQuIExpa2UgeW91Cj4+IHNhaWQsIEkgdGhpbmsgdGhpcyBzaG91bGQgYmUgYWRkcmVzc2VkIHNl cGFyYXRlbHkuCj4KPiBJTUhPLCB0aGVyZSBzaG91bGQgYmUgYSBjbG9ja3MgcHJvcGVydHkgd2hl cmUgZXZlciB5b3UgdHJ5IHRvIGFjY2VzcyByZWdpc3RlcnMsCj4gaS5lLiBpbiBhbGwgdGhyZWUg InBhcnRzIiBtdjY0M3h4X2V0aF9zaGFyZWQgKGdyb3VwKSwgbXY2NDN4eF9ldGgKPiAocG9ydCkg YW5kIG1kaW8uCj4gU2luY2UgcG9ydCBkZXBlbmRzIG9uIHNoYXJlZCBpdCB3b3VsZCBiZSBvayB0 byBoYXZlIGl0IHBlciBncm91cCBidXQgdGhhdCBtYXkKPiBjb2xsaWRlIHdpdGggb3RoZXIgU29D cyB0aGFuIERvdmUvS2lya3dvb2QgdGhhdCBoYXZlIHBlciBwb3J0IGNsb2Nrcy4KCk9rLCB3aGlj aCBtZWFucyB0aGF0IHdlIHNob3VsZCBhbHNvIHRlYWNoIG12NjQzeHhfZXRoX3NoYXJlZF9wcm9i ZSgpIAphYm91dCBpdCwgYXMgd2VsbCBhcyB0aGUgb3Jpb24tbWRpbyBkcml2ZXIuIEkgZG9uJ3Qg aGF2ZSBhbnkgcGFydGljdWxhciAKb2JqZWN0aW9ucyBzaW5jZSBpdCBzaG91bGQganVzdCBtYWtl IHRoaW5ncyBzYWZlciB3aXRoIHJlc3BlY3QgdG8gY2xvY2tpbmcuCgo+Cj4gSXMgdGhhdCBzZXBh cmF0aW9uIChncm91cC9wb3J0KSByZWFsbHkgcmVxdWlyZWQgZm9yIGFueSBTb0M/CgpQcm9iYWJs eSBub3QsIGl0IHdhcyBub3QgY2xlYXIgd2hlbiBJIGxvb2tlZCBhdCBtdjc4eHgwIGlmIGl0IHVz ZXMgdHdvIApwb3J0cyBwZXIgZ3JvdXAgb3IgNCBncm91cHMgYW5kIDEgcG9ydC4gQW55d2F5LCBz aW5jZSB3ZSBhcmUgcmUtdXNpbmcgCnRoZSBleGlzdGluZyBEZXZpY2UgVHJlZSBiaW5kaW5nIGRl ZmluaXRpb24gYW5kIHRoYXQgdGhlIGhhcmR3YXJlIApwcmVzZW50IGl0c2VsZiBhcyBldGhlcm5l dCBncm91cHMgYW5kIHBvcnRzLCBJIGRvbid0IHNlZSBhbnkgcHJvYmxlbSAKd2l0aCBrZWVwaW5n IHRoYXQgZGlmZmVyZW5jZSBzaW5jZSBpdCBhbGxvd3MgZm9yIGZpbmUtZ3JhaW5lZCAKcmVwcmVz ZW50YXRpb24gb2YgdGhlIGhhcmR3YXJlLgoKPgo+Pgo+PiBbc25pcF0KPj4+Cj4+PiBZb3UgZG9u J3QgY2hhbmdlIHRoZSBjbGsgaW5pdGlhbGl6YXRpb24gaGVyZToKPj4+Cj4+PiAjaWYgZGVmaW5l ZChDT05GSUdfSEFWRV9DTEspCj4+PiAgICAgICAgICBtcC0+Y2xrID0gY2xrX2dldCgmcGRldi0+ ZGV2LCAocGRldi0+aWQgPyAiMSIgOiAiMCIpKTsKPj4+ICAgICAgICAgIGlmICghSVNfRVJSKG1w LT5jbGspKSB7Cj4+PiAgICAgICAgICAgICAgICAgIGNsa19wcmVwYXJlX2VuYWJsZShtcC0+Y2xr KTsKPj4+ICAgICAgICAgICAgICAgICAgbXAtPnRfY2xrID0gY2xrX2dldF9yYXRlKG1wLT5jbGsp Owo+Pj4gICAgICAgICAgfQo+Pj4gI2VuZGlmCj4+Pgo+Pj4gV2hpY2gsIGlmIEkgdW5kZXJzdGFu ZCBjb3JyZWN0bHksIHdvcmtzIGluIHRoZSBEVCBjYXNlIGJlY2F1c2UgeW91Cj4+PiBhc3NpZ24g ImNsb2NrLW5hbWVzIiB0byB0aGUgY2xvY2tzIGluIHRoZSBEVFMuIEhvd2V2ZXIsIEkgd29uZGVy Cj4+PiB3aGV0aGVyIHRoaXMgd29ya3MgZm9yIGFueSBidXQgdGhlIGZpcnN0IEV0aGVybmV0IGRl dmljZS4KPgo+IFllcywgaXQgZG9lcy4gQXNzaWduZWQgY2xvY2tzIGZyb20gY2xvY2tzIHByb3Bl cnR5IGdldCBhIGNsb2NrIGFsaWFzIGZvcgo+IHRoYXQgZGV2aWNlIG5hbWUgKG5vZGUgbmFtZSku IFVzaW5nIGFueXRoaW5nIGVsc2UgdGhhbiBOVUxMIGhlcmUgaXMKPiBJTUhPIGp1c3Qgd3Jvbmcu IFdlIHNob3VsZCByYXRoZXIgcHJvdmlkZSBwcm9wZXIgY2xvY2sgYWxpYXNlcyBmb3Igbm9uLURU IGNhc2UuCj4KPj4+IEluIHRoZSBvbGQgcGxhdGZvcm0gZGV2aWNlIHNldHVwLCB0aGUgcGRldi0+ aWQgd2FzIHNldCB3aGVuCj4+PiBpbml0aWFsaWF6aW5nIHRoZSBwbGF0Zm9ybV9kZXZpY2Ugc3Ry dWN0dXJlIGluIGNvbW1vbi5jLiAgV2hlcmUgaXMKPj4+IHRoaXMgZG9uZSBpbiB0aGUgRFQgY2Fz ZT8KPj4KPj4gTG9va3MgbGlrZSB5b3UgYXJlIHJpZ2h0LCBpbiB0aGUgRFQgY2FzZSwgSSBhc3N1 bWUgdGhhdCB3ZSBzaG91bGQgbG9va3VwIHRoZQo+PiBjbG9jayB1c2luZyBOVUxMIGluc3RlYWQg b2YgIjEiIG9yICIwIiBzbyB3ZSBtYXRjaCBhbnkgY2xvY2sgaW5zdGVhZCBvZiBhCj4+IHNwZWNp ZmljIG9uZS4KPgo+IFllcy4KPgo+PiBbc25pcF0KPj4+Cj4+Pgo+Pj4gSW4gcGh5X3NjYW4oKSwg dGhlIHBoeSBpcyBzZWFyY2hlZCBsaWtlIHRoaXM6Cj4+Pgo+Pj4gICAgICAgICAgICAgICAgICBz bnByaW50ZihwaHlfaWQsIHNpemVvZihwaHlfaWQpLCBQSFlfSURfRk1ULAo+Pj4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIm9yaW9uLW1kaW8tbWlpIiwgYWRkcik7Cj4+Pgo+Pj4g ICAgICAgICAgICAgICAgICBwaHlkZXYgPSBwaHlfY29ubmVjdChtcC0+ZGV2LCBwaHlfaWQsCj4+ PiBtdjY0M3h4X2V0aF9hZGp1c3RfbGluaywKPj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFBIWV9JTlRFUkZBQ0VfTU9ERV9HTUlJKTsKPj4+Cj4+PiBCdXQgIm9yaW9uLW1kaW8t bWlpOnh4IiBpcyB0aGUgbmFtZSBvZiB0aGUgUEhZIGlmIE1ESU8gaXMgc2V0dXAgdmlhIGEKPj4+ IHBsYXRmb3JtX2RldmljZS4gSSBjb3VsZCBub3QgZ2V0IHRoaXMgdG8gd29yayBpZiB0aGUgTURJ TyBkZXZpY2UgaXMKPj4+IHNldHVwIHZpYSBEVC4gQW0gSSBkb2luZyBzb21ldGhpbmcgd3Jvbmc/ Cj4+Cj4+IEkganVzdCBtaXNzZWQgdXBkYXRpbmcgdGhpcyBwYXJ0IG9mIHRoZSBjb2RlIHRvIHBy b2JlIGZvciBQSFlzLiBUaGUgYm9hcmQgSQo+PiB0ZXN0ZWQgd2l0aCB1c2VzIGEgIlBIWV9OT05F IiBjb25maWd1cmF0aW9uLiBJIHdpbGwgYWRkIHRoZSBtaXNzaW5nIGJpdHMgZm9yCj4+IG9mX3Bo eV9jb25uZWN0KCkgdG8gYmUgY2FsbGVkIGhlcmUuCj4KPiBJIGRvbid0IHRoaW5rIHRoYXQgdGhl IGV0aGVybmV0IGNvbnRyb2xsZXIgc2hvdWxkIHByb2JlIHRoZSBQSFkncyBvbiBtZGlvLWJ1cwo+ IGF0IGFsbC4gQXQgbGVhc3Qgbm90IGZvciBEVCBlbmFibGVkIHBsYXRmb3Jtcy4gSSBoYWQgYSBs b29rIGF0IERUIGFuZCBub24tRFQKPiBtZGlvLWJ1cyBzb3VyY2VzLCBhbmQgcmVhbGl6ZWQgdGhh dCB0aGVyZSBpcyBhIGJ1cyBzY2FuIGZvciBub24tRFQgb25seS4KPiBvZl9tZGlvYnVzX3JlZ2lz dGVyIHJlcXVpcmVzIHlvdSB0byBzZXQgKGFuZCBrbm93KSB0aGUgUEhZIGFkZHJlc3MuCgpPbmUg cmVhc29uIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyIGNvdWxkIGRvIHRoZSBwcm9iaW5nIGlzIGlu IHRoZSBjYXNlIAp3ZSBuZWVkIHRvIGFwcGx5IHF1aXJrcyAoZS5nOiB1c2luZyBwaHlkZXYtPmZs YWdzKSBmb3IgaW5zdGFuY2UuIFRoaXMgCmNhbiBiZSBkb25lIGV2ZW4gYWZ0ZXIgdGhlIE1ESU8g YnVzIGRyaXZlciBkaWQgcHJvYmUgUEhZIGRldmljZXMgdGhvdWdoLgoKPgo+IEkgcHJlcGFyZWQg YSBwYXRjaCBmb3Igb2ZfbWRpb19yZWdpc3RlciB0aGF0IHdpbGwgYWxsb3cgeW91IHRvIHByb2Jl IG1kaW8gYW5kCj4gYXNzaWduIHBoeSBhZGRyZXNzZXMgdG8gZWFjaCBub2RlIGZvdW5kLiBDdXJy ZW50bHksIHRoZSBoZXVyaXN0aWMgZm9yIHByb2JpbmcKPiBpczogYXNzaWduIGVhY2ggcGh5IG5v ZGUgdGhlIG5leHQgcHJvYmVkIHBoeV9hZGRyIHN0YXJ0aW5nIHdpdGggMC4gQnV0IHRoYXQKPiB3 aWxsIG5vdCBhbGxvdyB0byBlLmcuIHNldCBzb21lIFBIWSBhZGRyZXNzZXMgYW5kIHByb2JlIHRo ZSByZXN0LgoKT2ssIHdlIGp1c3QgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIGRvZXMgbm90 IGJyZWFrIGFueSBzcGVjaWZpYyB1c2UgCmNhc2UsIEkgZG9uJ3QgdGhpbmsgaXQgZG9lcywgc2lu Y2UgaXQgc2VlbXMgdG8gYmUgbW9yZSBhY2N1cmF0ZSBvciAKZXF1aXZhbGVudCB0byBFdGhlcm5l dCBkcml2ZXIgZG9pbmcgdGhlIHByb2JpbmcuCgo+Cj4gV2UgaGFkIGEgc2ltaWxhciBkaXNjdXNz aW9uIHdoZXRoZXIgdG8gcHJvYmUgb3Igbm90IGZvciBEVCBub2RlcywgYW5kIEkgZ3Vlc3MKPiB0 aGVyZSBhbHNvIHdpbGwgYmUgc29tZSBkaXNjdXNzaW9uIGFib3V0IHRoZSBhYm92ZSBwYXRjaC4g T1RPSCB3ZSBjb3VsZCBqdXN0Cj4gKGFnYWluKSBhc2sgdXNlcnMgb2YgZXZlcnkga2lya3dvb2Qv b3Jpb241eC9kb3ZlIGJvYXJkIHRvIHRlbGwgdGhlaXIKPiBwaHkgYWRkcmVzc2VzCj4gYW5kIGZh aWwgdG8gcHJvYmUgdGhlIHBoeSBmb3IgbmV3IGJvYXJkcy4uLgo+Cj4gSSB3aWxsIHByZXBhcmUg YSBwcm9wZXIgcGF0Y2ggc29vbiBhbmQgcG9zdCBpdCBvbiB0aGUgY29ycmVzcG9uZGluZyBsaXN0 cy4KCkNvb2wsIHRoYW5rcyEKCj4KPj4+IEFkZGl0aW9uYWxseSwgaW4gcGh5X3NjYW4oKSB0aGVy ZSBpcyB0aGlzOgo+Pj4KPj4+ICAgICAgICAgIGlmIChwaHlfYWRkciA9PSBNVjY0M1hYX0VUSF9Q SFlfQUREUl9ERUZBVUxUKSB7Cj4+PiAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcGh5X2FkZHJf Z2V0KG1wKSAmIDB4MWY7Cj4+PiAgICAgICAgICAgICAgICAgIG51bSA9IDMyOwo+Pj4gICAgICAg ICAgfSBlbHNlIHsKPj4+ICAgICAgICAgIC4uLgo+Pj4KPj4+IE1WNjQzWFhfRVRIX1BIWV9BRERS X0RFRkFVTFQgaXMgZGVmaW5lZCBhcyAwLiBIb3dldmVyLCBtYW55IEtpcmt3b29kCj4+PiBkZXZp Y2VzIHVzZSAiTVY2NDNYWF9FVEhfUEhZX0FERFIoMCkiLiAgSWYgdGhlIG1vZHVsZSBwcm9iZSBp cwo+Pj4gZGVmZXJyZWQgaW4gbXY2NDN4eF9ldGggYmVjYXVzZSB0aGUgTURJTyBkcml2ZXIgaXMg bm90IHlldCBsb2FkZWQsCj4+PiBhbGwgMzIgUEhZIGFkZHJlc3NlcyBhcmUgc2Nhbm5lZCB3aXRo b3V0IHN1Y2Nlc3MuICBUaGlzIGlzIG5vdCBuZWVkZWQKPj4+IGFuZCBjbHV0dGVycyB0aGUgbG9n Lgo+Pgo+Pgo+PiBPaywgSSBhbSBub3Qgc3VyZSBob3cgd2UgY2FuIGNpcmN1bXZlbnQgdGhlIGxv ZyBjbHV0dGVyaW5nIHRoYXQgaGFwcGVucywKPj4gd2hhdCB3b3VsZCBiZSB5b3VyIHN1Z2dlc3Rp b24/Cj4KPiBNeSBzdWdnZXN0aW9uIGlzIHRvIGNoYW5nZSBNVjY0M1hYX0VUSF9QSFlfQUREUl9E RUZBVUxUIGZyb20gYSB2YWxpZAo+IHBoeSBhZGRyZXNzICgwKQo+IHRvIHNvbWV0aGluZyBpbnZh bGlkICgzMikuIEkgdW5kZXJzdGFuZCB0aGF0IHVzaW5nIDAgaGVscHMgaWYgeW91Cj4gZG9uJ3Qg d2FudCB0byBzZXQgaXQgaW4gbXY2NDN4eCdzIHBsYXRmb3JtX2RhdGEKPiBidXQgaXQgaXMgYWx3 YXlzIGRpZmZpY3VsdCB0byByZWx5IG9uIHRoYXQgaWYgMCBpcyBhIHZhbGlkIG51bWJlci4KPgo+ IENoYW5naW5nIHRoZSBhYm92ZSB0byAzMiBzaG91bGQganVzdCB3b3JrIGJlY2F1c2UgbW9zdCAo YWxsPykgYm9hcmRzCj4gdXNpbmcgcGh5X3NjYW4gc2hvdWxkIGFsc28KPiBhbHJlYWR5IHVzZSBN VjY0M1hYX0VUSF9QSFlfQUREUl9ERUZBVUxULiBJIGFsc28gc3VnZ2VzdCB0byByZW5hbWUKPiBj dXJyZW50IGRlZmluZSB0byBhCj4gYmV0dGVyIG5hbWUsIGUuZy4gTVY2NDNYWF9FVEhfUEhZX0FE RFJfQVVUT1NDQU4uCgpTb3VuZHMgZ29vZCB0byBtZS4KLS0KRmxvcmlhbgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWls aW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0 cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=