From mboxrd@z Thu Jan 1 00:00:00 1970 From: saeedb@amazon.com (BSHARA, Said) Date: Sun, 5 Nov 2017 12:29:06 +0000 Subject: [PATCH net-next 4/8] net: ethernet: add the Alpine Ethernet driver In-Reply-To: <723d35ce-aaa2-9011-19d6-99e77eed846f@gmail.com> References: <20170203181216.30214-1-antoine.tenart@free-electrons.com> <20170203181216.30214-5-antoine.tenart@free-electrons.com> <20170203205823.GA22572@lunn.ch> <1503841641816.62526@amazon.com> <20170828180932.GG10418@lunn.ch> <8023db8c8218450fb6c97049db054989@EX13D13UWA001.ant.amazon.com> <723d35ce-aaa2-9011-19d6-99e77eed846f@gmail.com> Message-ID: <1509884946.21689.10.camel@amazon.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Thu, 2017-11-02 at 11:19 -0700, Florian Fainelli wrote: > On 11/02/2017 09:05 AM, Chocron, Jonathan wrote: > > > > ?-----Original Message----- > > > > > > From: Andrew Lunn [mailto:andrew at lunn.ch] > > > Sent: Monday, August 28, 2017 9:10 PM > > > To: Chocron, Jonathan > > > Cc: Antoine Tenart ; > > > netdev at vger.kernel.org; davem at davemloft.net; linux-arm- > > > kernel at lists.infradead.org; thomas.petazzoni at free-electrons.com; > > > arnd at arndb.de > > > Subject: Re: [PATCH net-next 4/8] net: ethernet: add the Alpine > > > Ethernet > > > driver > > > > > > On Sun, Aug 27, 2017 at 01:47:19PM +0000, Chocron, Jonathan > > > wrote: > > > > > > > > This is a fixed version of my previous response (using proper > > > > indentation > > > and leaving only the specific questions responded to). > > > > > > Wow, this is old.??3 Feb 2017. I had to go dig into the archive > > > to refresh my > > > memory. > > > > > > > > > > > > > > > > > > > > > > > > +/* MDIO */ > > > > > > +#define AL_ETH_MDIO_C45_DEV_MASK?????0x1f0000 > > > > > > +#define AL_ETH_MDIO_C45_DEV_SHIFT????16 > > > > > > +#define AL_ETH_MDIO_C45_REG_MASK?????0xffff > > > > > > + > > > > > > +static int al_mdio_read(struct mii_bus *bp, int mii_id, > > > > > > int reg) > > > > > > +{ > > > > > > +?????struct al_eth_adapter *adapter = bp->priv; > > > > > > +?????u16 value = 0; > > > > > > +?????int rc; > > > > > > +?????int timeout = MDIO_TIMEOUT_MSEC; > > > > > > + > > > > > > +?????while (timeout > 0) { > > > > > > +?????????????if (reg & MII_ADDR_C45) { > > > > > > +?????????????????????netdev_dbg(adapter->netdev, "[c45]: > > > > > > dev %x reg %x val > > > %x\n", > > > > > > > > > > > > > > > > > > > > > +????????????????????????????????((reg & > > > > > > AL_ETH_MDIO_C45_DEV_MASK) >> > > > AL_ETH_MDIO_C45_DEV_SHIFT), > > > > > > > > > > > > > > > > > > > > > +????????????????????????????????(reg & > > > > > > AL_ETH_MDIO_C45_REG_MASK), value); > > > > > > +?????????????????????rc = al_eth_mdio_read(&adapter- > > > > > > >hw_adapter, adapter- > > > > phy_addr, > > > > > > > > > > > > > > > > > +?????????????????????????????((reg & > > > > > > AL_ETH_MDIO_C45_DEV_MASK) >> > > > AL_ETH_MDIO_C45_DEV_SHIFT), > > > > > > > > > > > > > > > > > > > > > +?????????????????????????????(reg & > > > > > > AL_ETH_MDIO_C45_REG_MASK), &value); > > > > > > +?????????????} else { > > > > > > +?????????????????????rc = al_eth_mdio_read(&adapter- > > > > > > >hw_adapter, adapter- > > > > phy_addr, > > > > > > > > > > > > > > > > > +???????????????????????????????????????????MDIO_DEVAD_NONE > > > > > > , reg, &value); > > > > > > +?????????????} > > > > > > + > > > > > > +?????????????if (rc == 0) > > > > > > +?????????????????????return value; > > > > > > + > > > > > > +?????????????netdev_dbg(adapter->netdev, > > > > > > +????????????????????????"mdio read failed. try again in 10 > > > > > > + msec\n"); > > > > > > + > > > > > > +?????????????timeout -= 10; > > > > > > +?????????????msleep(10); > > > > > > +?????} > > > > > This is rather unusual, retrying MDIO operations. Are you > > > > > working > > > > > around a hardware bug? I suspect this also opens up race > > > > > conditions, > > > > > in particular with PHY interrupts, which can be clear on > > > > > read. > > > > The MDIO bus is shared between the ethernet units. There is a > > > > HW lock > > > > used to arbitrate between different interfaces trying to access > > > > the > > > > bus, therefore there is a retry loop. The reg isn't accessed > > > > before > > > > obtaining the lock, so there shouldn't be any clear on read > > > > issues. > > > > > > > > > > > > > > > > > > > > > +/* al_eth_mdiobus_setup - initialize mdiobus and register > > > > > > to > > > > > > +kernel */ static int al_eth_mdiobus_setup(struct > > > > > > al_eth_adapter > > > > > > +*adapter) { > > > > > > +?????struct phy_device *phydev; > > > > > > +?????int i; > > > > > > +?????int ret = 0; > > > > > > + > > > > > > +?????adapter->mdio_bus = mdiobus_alloc(); > > > > > > +?????if (!adapter->mdio_bus) > > > > > > +?????????????return -ENOMEM; > > > > > > + > > > > > > +?????adapter->mdio_bus->name?????= "al mdio bus"; > > > > > > +?????snprintf(adapter->mdio_bus->id, MII_BUS_ID_SIZE, > > > > > > "%x", > > > > > > +??????????????(adapter->pdev->bus->number << 8) | adapter- > > > > > > >pdev- > > > > devfn); > > > > > > > > > > > > > > > > > +?????adapter->mdio_bus->priv?????= adapter; > > > > > > +?????adapter->mdio_bus->parent???= &adapter->pdev->dev; > > > > > > +?????adapter->mdio_bus->read?????= &al_mdio_read; > > > > > > +?????adapter->mdio_bus->write????= &al_mdio_write; > > > > > > +?????adapter->mdio_bus->phy_mask = ~BIT(adapter- > > > > > > >phy_addr); > > > > > Why do this? > > > > Since the MDIO bus is shared, we want each interface to probe > > > > only for the > > > PHY associated with it. > > > > > > So i think this is the core of the problem. You have one physical > > > MDIO bus, > > > yet you register it twice with the MDIO framework. > > > > > > How about you only register it once? A lot of the complexity then > > > goes away. > > > The mutex in the mdio core per bus means you don't need your > > > hardware > > > locking. All that code goes away. All the retry code goes away. > > > Life is simple. > > > > > > Andrew > > We indeed have one physical MDIO bus, but have multiple masters on > > it, > > each "behind" a different internal PCIe device. Since the accesses > > to the bus > > are done "indirectly" through each master, we can't register the > > bus only once. > How do your multiple masters get arbitrated on the unique MDIO bus? > Is > there hardware automatically doing that, or do you have to semaphore > those accesses at the software level? hardware level. > > > > > Think of the scenario that we register it in the driver context of > > PCIe device A, > > and then the driver is unbound from just this device. Device B > > won't be able > > to access the bus since it was registered with callbacks that use a > > PCIe BAR of > > device A, which is no longer valid. > You can have one single physical MDIO bus that you register once > throughout the SoC's power on lifecycle, and then you can create > "virtual" MDIO bus instances which map 1:1 with the PCIe > device/function > and are nested from that single MDIO bus, this also gives you > serialization of accesses and arbitration for free. the problem is that physical MDIO controller actually belongs to one of the pcie devices and it's not independent interface, as the registers address belongs to that pcie device, also, a reset to that pcie device will reset the "shared" mdio controller. > > > > > > > Is it possible to register the mdio_bus struct as a global instance > > at driver load, > > and someway pass the offset to the specific device's MDIO master, > > as part of > > each read/write transaction towards the MDIO bus? > You can register how many instances of the MDIO bus you want in a > system, it can be a singleton for the purpose of supporting your > specific hardware, or you can build a layer on top like I just > suggested > above. > > > > > Or perhaps you have another suggestion which takes into account the > > issues I've described? > Considering that binding to a MDIO bus is done by MDIO bus name > (bus->id) and/or Device Tree parent/child hierarchy, if there is only > one, just have all instances reference the same MDIO bus when they > want > to bind to their devices (pure mdio_device, or phy_device) on that > MDIO bus. From mboxrd@z Thu Jan 1 00:00:00 1970 From: "BSHARA, Said" Subject: Re: [PATCH net-next 4/8] net: ethernet: add the Alpine Ethernet driver Date: Sun, 5 Nov 2017 12:29:06 +0000 Message-ID: <1509884946.21689.10.camel@amazon.com> References: <20170203181216.30214-1-antoine.tenart@free-electrons.com> <20170203181216.30214-5-antoine.tenart@free-electrons.com> <20170203205823.GA22572@lunn.ch> <1503841641816.62526@amazon.com> <20170828180932.GG10418@lunn.ch> <8023db8c8218450fb6c97049db054989@EX13D13UWA001.ant.amazon.com> <723d35ce-aaa2-9011-19d6-99e77eed846f@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Cc: "thomas.petazzoni@free-electrons.com" , "arnd@arndb.de" , "netdev@vger.kernel.org" , "antoine.tenart@free-electrons.com" , "davem@davemloft.net" , "linux-arm-kernel@lists.infradead.org" To: "f.fainelli@gmail.com" , "Chocron, Jonathan" , "andrew@lunn.ch" Return-path: In-Reply-To: <723d35ce-aaa2-9011-19d6-99e77eed846f@gmail.com> Content-Language: en-US Content-ID: 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 List-Id: netdev.vger.kernel.org T24gVGh1LCAyMDE3LTExLTAyIGF0IDExOjE5IC0wNzAwLCBGbG9yaWFuIEZhaW5lbGxpIHdyb3Rl Og0KPiBPbiAxMS8wMi8yMDE3IDA5OjA1IEFNLCBDaG9jcm9uLCBKb25hdGhhbiB3cm90ZToNCj4g PiANCj4gPiDCoC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ID4gPiANCj4gPiA+IEZyb206 IEFuZHJldyBMdW5uIFttYWlsdG86YW5kcmV3QGx1bm4uY2hdDQo+ID4gPiBTZW50OiBNb25kYXks IEF1Z3VzdCAyOCwgMjAxNyA5OjEwIFBNDQo+ID4gPiBUbzogQ2hvY3JvbiwgSm9uYXRoYW4gPGpv bm55Y0BhbWF6b24uY29tPg0KPiA+ID4gQ2M6IEFudG9pbmUgVGVuYXJ0IDxhbnRvaW5lLnRlbmFy dEBmcmVlLWVsZWN0cm9ucy5jb20+Ow0KPiA+ID4gbmV0ZGV2QHZnZXIua2VybmVsLm9yZzsgZGF2 ZW1AZGF2ZW1sb2Z0Lm5ldDsgbGludXgtYXJtLQ0KPiA+ID4ga2VybmVsQGxpc3RzLmluZnJhZGVh ZC5vcmc7IHRob21hcy5wZXRhenpvbmlAZnJlZS1lbGVjdHJvbnMuY29tOw0KPiA+ID4gYXJuZEBh cm5kYi5kZQ0KPiA+ID4gU3ViamVjdDogUmU6IFtQQVRDSCBuZXQtbmV4dCA0LzhdIG5ldDogZXRo ZXJuZXQ6IGFkZCB0aGUgQWxwaW5lDQo+ID4gPiBFdGhlcm5ldA0KPiA+ID4gZHJpdmVyDQo+ID4g PiANCj4gPiA+IE9uIFN1biwgQXVnIDI3LCAyMDE3IGF0IDAxOjQ3OjE5UE0gKzAwMDAsIENob2Ny b24sIEpvbmF0aGFuDQo+ID4gPiB3cm90ZToNCj4gPiA+ID4gDQo+ID4gPiA+IFRoaXMgaXMgYSBm aXhlZCB2ZXJzaW9uIG9mIG15IHByZXZpb3VzIHJlc3BvbnNlICh1c2luZyBwcm9wZXINCj4gPiA+ ID4gaW5kZW50YXRpb24NCj4gPiA+IGFuZCBsZWF2aW5nIG9ubHkgdGhlIHNwZWNpZmljIHF1ZXN0 aW9ucyByZXNwb25kZWQgdG8pLg0KPiA+ID4gDQo+ID4gPiBXb3csIHRoaXMgaXMgb2xkLsKgwqAz IEZlYiAyMDE3LiBJIGhhZCB0byBnbyBkaWcgaW50byB0aGUgYXJjaGl2ZQ0KPiA+ID4gdG8gcmVm cmVzaCBteQ0KPiA+ID4gbWVtb3J5Lg0KPiA+ID4gDQo+ID4gPiA+IA0KPiA+ID4gPiA+IA0KPiA+ ID4gPiA+ID4gDQo+ID4gPiA+ID4gPiArLyogTURJTyAqLw0KPiA+ID4gPiA+ID4gKyNkZWZpbmUg QUxfRVRIX01ESU9fQzQ1X0RFVl9NQVNLwqDCoMKgwqDCoDB4MWYwMDAwDQo+ID4gPiA+ID4gPiAr I2RlZmluZSBBTF9FVEhfTURJT19DNDVfREVWX1NISUZUwqDCoMKgwqAxNg0KPiA+ID4gPiA+ID4g KyNkZWZpbmUgQUxfRVRIX01ESU9fQzQ1X1JFR19NQVNLwqDCoMKgwqDCoDB4ZmZmZg0KPiA+ID4g PiA+ID4gKw0KPiA+ID4gPiA+ID4gK3N0YXRpYyBpbnQgYWxfbWRpb19yZWFkKHN0cnVjdCBtaWlf YnVzICpicCwgaW50IG1paV9pZCwNCj4gPiA+ID4gPiA+IGludCByZWcpDQo+ID4gPiA+ID4gPiAr ew0KPiA+ID4gPiA+ID4gK8KgwqDCoMKgwqBzdHJ1Y3QgYWxfZXRoX2FkYXB0ZXIgKmFkYXB0ZXIg PSBicC0+cHJpdjsNCj4gPiA+ID4gPiA+ICvCoMKgwqDCoMKgdTE2IHZhbHVlID0gMDsNCj4gPiA+ ID4gPiA+ICvCoMKgwqDCoMKgaW50IHJjOw0KPiA+ID4gPiA+ID4gK8KgwqDCoMKgwqBpbnQgdGlt ZW91dCA9IE1ESU9fVElNRU9VVF9NU0VDOw0KPiA+ID4gPiA+ID4gKw0KPiA+ID4gPiA+ID4gK8Kg wqDCoMKgwqB3aGlsZSAodGltZW91dCA+IDApIHsNCj4gPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGlmIChyZWcgJiBNSUlfQUREUl9DNDUpIHsNCj4gPiA+ID4gPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBuZXRkZXZfZGJnKGFkYXB0ZXIt Pm5ldGRldiwgIltjNDVdOg0KPiA+ID4gPiA+ID4gZGV2ICV4IHJlZyAleCB2YWwNCj4gPiA+ICV4 XG4iLA0KPiA+ID4gPiANCj4gPiA+ID4gPiANCj4gPiA+ID4gPiA+IA0KPiA+ID4gPiA+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAoKHJlZyAmDQo+ID4gPiA+ID4gPiBBTF9FVEhfTURJT19DNDVfREVWX01BU0spID4+DQo+ ID4gPiBBTF9FVEhfTURJT19DNDVfREVWX1NISUZUKSwNCj4gPiA+ID4gDQo+ID4gPiA+ID4gDQo+ ID4gPiA+ID4gPiANCj4gPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgKHJlZyAmDQo+ID4gPiA+ID4gPiBBTF9F VEhfTURJT19DNDVfUkVHX01BU0spLCB2YWx1ZSk7DQo+ID4gPiA+ID4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmMgPSBhbF9ldGhfbWRpb19yZWFkKCZhZGFw dGVyLQ0KPiA+ID4gPiA+ID4gPmh3X2FkYXB0ZXIsIGFkYXB0ZXItDQo+ID4gPiA+IHBoeV9hZGRy LA0KPiA+ID4gPiA+IA0KPiA+ID4gPiA+ID4gDQo+ID4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCgocmVnICYNCj4gPiA+ ID4gPiA+IEFMX0VUSF9NRElPX0M0NV9ERVZfTUFTSykgPj4NCj4gPiA+IEFMX0VUSF9NRElPX0M0 NV9ERVZfU0hJRlQpLA0KPiA+ID4gPiANCj4gPiA+ID4gPiANCj4gPiA+ID4gPiA+IA0KPiA+ID4g PiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAocmVnICYNCj4gPiA+ID4gPiA+IEFMX0VUSF9NRElPX0M0NV9SRUdfTUFTSyksICZ2 YWx1ZSk7DQo+ID4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9IGVsc2Ugew0K PiA+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJj ID0gYWxfZXRoX21kaW9fcmVhZCgmYWRhcHRlci0NCj4gPiA+ID4gPiA+ID5od19hZGFwdGVyLCBh ZGFwdGVyLQ0KPiA+ID4gPiBwaHlfYWRkciwNCj4gPiA+ID4gPiANCj4gPiA+ID4gPiA+IA0KPiA+ ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgTURJT19ERVZBRF9OT05FDQo+ ID4gPiA+ID4gPiAsIHJlZywgJnZhbHVlKTsNCj4gPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoH0NCj4gPiA+ID4gPiA+ICsNCj4gPiA+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlmIChyYyA9PSAwKQ0KPiA+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiB2YWx1ZTsNCj4gPiA+ID4gPiA+ICsNCj4gPiA+ ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG5ldGRldl9kYmcoYWRhcHRlci0+bmV0 ZGV2LA0KPiA+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCJtZGlvIHJlYWQgZmFpbGVkLiB0cnkgYWdhaW4gaW4gMTANCj4gPiA+ID4gPiA+ ICsgbXNlY1xuIik7DQo+ID4gPiA+ID4gPiArDQo+ID4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqB0aW1lb3V0IC09IDEwOw0KPiA+ID4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgbXNsZWVwKDEwKTsNCj4gPiA+ID4gPiA+ICvCoMKgwqDCoMKgfQ0KPiA+ID4gPiA+ IFRoaXMgaXMgcmF0aGVyIHVudXN1YWwsIHJldHJ5aW5nIE1ESU8gb3BlcmF0aW9ucy4gQXJlIHlv dQ0KPiA+ID4gPiA+IHdvcmtpbmcNCj4gPiA+ID4gPiBhcm91bmQgYSBoYXJkd2FyZSBidWc/IEkg c3VzcGVjdCB0aGlzIGFsc28gb3BlbnMgdXAgcmFjZQ0KPiA+ID4gPiA+IGNvbmRpdGlvbnMsDQo+ ID4gPiA+ID4gaW4gcGFydGljdWxhciB3aXRoIFBIWSBpbnRlcnJ1cHRzLCB3aGljaCBjYW4gYmUg Y2xlYXIgb24NCj4gPiA+ID4gPiByZWFkLg0KPiA+ID4gPiBUaGUgTURJTyBidXMgaXMgc2hhcmVk IGJldHdlZW4gdGhlIGV0aGVybmV0IHVuaXRzLiBUaGVyZSBpcyBhDQo+ID4gPiA+IEhXIGxvY2sN Cj4gPiA+ID4gdXNlZCB0byBhcmJpdHJhdGUgYmV0d2VlbiBkaWZmZXJlbnQgaW50ZXJmYWNlcyB0 cnlpbmcgdG8gYWNjZXNzDQo+ID4gPiA+IHRoZQ0KPiA+ID4gPiBidXMsIHRoZXJlZm9yZSB0aGVy ZSBpcyBhIHJldHJ5IGxvb3AuIFRoZSByZWcgaXNuJ3QgYWNjZXNzZWQNCj4gPiA+ID4gYmVmb3Jl DQo+ID4gPiA+IG9idGFpbmluZyB0aGUgbG9jaywgc28gdGhlcmUgc2hvdWxkbid0IGJlIGFueSBj bGVhciBvbiByZWFkDQo+ID4gPiA+IGlzc3Vlcy4NCj4gPiA+ID4gDQo+ID4gPiA+ID4gDQo+ID4g PiA+ID4gPiANCj4gPiA+ID4gPiA+ICsvKiBhbF9ldGhfbWRpb2J1c19zZXR1cCAtIGluaXRpYWxp emUgbWRpb2J1cyBhbmQgcmVnaXN0ZXINCj4gPiA+ID4gPiA+IHRvDQo+ID4gPiA+ID4gPiAra2Vy bmVsICovIHN0YXRpYyBpbnQgYWxfZXRoX21kaW9idXNfc2V0dXAoc3RydWN0DQo+ID4gPiA+ID4g PiBhbF9ldGhfYWRhcHRlcg0KPiA+ID4gPiA+ID4gKyphZGFwdGVyKSB7DQo+ID4gPiA+ID4gPiAr wqDCoMKgwqDCoHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7DQo+ID4gPiA+ID4gPiArwqDCoMKg wqDCoGludCBpOw0KPiA+ID4gPiA+ID4gK8KgwqDCoMKgwqBpbnQgcmV0ID0gMDsNCj4gPiA+ID4g PiA+ICsNCj4gPiA+ID4gPiA+ICvCoMKgwqDCoMKgYWRhcHRlci0+bWRpb19idXMgPSBtZGlvYnVz X2FsbG9jKCk7DQo+ID4gPiA+ID4gPiArwqDCoMKgwqDCoGlmICghYWRhcHRlci0+bWRpb19idXMp DQo+ID4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLUVOT01FTTsN Cj4gPiA+ID4gPiA+ICsNCj4gPiA+ID4gPiA+ICvCoMKgwqDCoMKgYWRhcHRlci0+bWRpb19idXMt Pm5hbWXCoMKgwqDCoMKgPSAiYWwgbWRpbyBidXMiOw0KPiA+ID4gPiA+ID4gK8KgwqDCoMKgwqBz bnByaW50ZihhZGFwdGVyLT5tZGlvX2J1cy0+aWQsIE1JSV9CVVNfSURfU0laRSwNCj4gPiA+ID4g PiA+ICIleCIsDQo+ID4gPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoChhZGFw dGVyLT5wZGV2LT5idXMtPm51bWJlciA8PCA4KSB8IGFkYXB0ZXItDQo+ID4gPiA+ID4gPiA+cGRl di0NCj4gPiA+ID4gZGV2Zm4pOw0KPiA+ID4gPiA+IA0KPiA+ID4gPiA+ID4gDQo+ID4gPiA+ID4g PiArwqDCoMKgwqDCoGFkYXB0ZXItPm1kaW9fYnVzLT5wcml2wqDCoMKgwqDCoD0gYWRhcHRlcjsN Cj4gPiA+ID4gPiA+ICvCoMKgwqDCoMKgYWRhcHRlci0+bWRpb19idXMtPnBhcmVudMKgwqDCoD0g JmFkYXB0ZXItPnBkZXYtPmRldjsNCj4gPiA+ID4gPiA+ICvCoMKgwqDCoMKgYWRhcHRlci0+bWRp b19idXMtPnJlYWTCoMKgwqDCoMKgPSAmYWxfbWRpb19yZWFkOw0KPiA+ID4gPiA+ID4gK8KgwqDC oMKgwqBhZGFwdGVyLT5tZGlvX2J1cy0+d3JpdGXCoMKgwqDCoD0gJmFsX21kaW9fd3JpdGU7DQo+ ID4gPiA+ID4gPiArwqDCoMKgwqDCoGFkYXB0ZXItPm1kaW9fYnVzLT5waHlfbWFzayA9IH5CSVQo YWRhcHRlci0NCj4gPiA+ID4gPiA+ID5waHlfYWRkcik7DQo+ID4gPiA+ID4gV2h5IGRvIHRoaXM/ DQo+ID4gPiA+IFNpbmNlIHRoZSBNRElPIGJ1cyBpcyBzaGFyZWQsIHdlIHdhbnQgZWFjaCBpbnRl cmZhY2UgdG8gcHJvYmUNCj4gPiA+ID4gb25seSBmb3IgdGhlDQo+ID4gPiBQSFkgYXNzb2NpYXRl ZCB3aXRoIGl0Lg0KPiA+ID4gDQo+ID4gPiBTbyBpIHRoaW5rIHRoaXMgaXMgdGhlIGNvcmUgb2Yg dGhlIHByb2JsZW0uIFlvdSBoYXZlIG9uZSBwaHlzaWNhbA0KPiA+ID4gTURJTyBidXMsDQo+ID4g PiB5ZXQgeW91IHJlZ2lzdGVyIGl0IHR3aWNlIHdpdGggdGhlIE1ESU8gZnJhbWV3b3JrLg0KPiA+ ID4gDQo+ID4gPiBIb3cgYWJvdXQgeW91IG9ubHkgcmVnaXN0ZXIgaXQgb25jZT8gQSBsb3Qgb2Yg dGhlIGNvbXBsZXhpdHkgdGhlbg0KPiA+ID4gZ29lcyBhd2F5Lg0KPiA+ID4gVGhlIG11dGV4IGlu IHRoZSBtZGlvIGNvcmUgcGVyIGJ1cyBtZWFucyB5b3UgZG9uJ3QgbmVlZCB5b3VyDQo+ID4gPiBo YXJkd2FyZQ0KPiA+ID4gbG9ja2luZy4gQWxsIHRoYXQgY29kZSBnb2VzIGF3YXkuIEFsbCB0aGUg cmV0cnkgY29kZSBnb2VzIGF3YXkuDQo+ID4gPiBMaWZlIGlzIHNpbXBsZS4NCj4gPiA+IA0KPiA+ ID4gCUFuZHJldw0KPiA+IFdlIGluZGVlZCBoYXZlIG9uZSBwaHlzaWNhbCBNRElPIGJ1cywgYnV0 IGhhdmUgbXVsdGlwbGUgbWFzdGVycyBvbg0KPiA+IGl0LA0KPiA+IGVhY2ggImJlaGluZCIgYSBk aWZmZXJlbnQgaW50ZXJuYWwgUENJZSBkZXZpY2UuIFNpbmNlIHRoZSBhY2Nlc3Nlcw0KPiA+IHRv IHRoZSBidXMNCj4gPiBhcmUgZG9uZSAiaW5kaXJlY3RseSIgdGhyb3VnaCBlYWNoIG1hc3Rlciwg d2UgY2FuJ3QgcmVnaXN0ZXIgdGhlDQo+ID4gYnVzIG9ubHkgb25jZS4NCj4gSG93IGRvIHlvdXIg bXVsdGlwbGUgbWFzdGVycyBnZXQgYXJiaXRyYXRlZCBvbiB0aGUgdW5pcXVlIE1ESU8gYnVzPw0K PiBJcw0KPiB0aGVyZSBoYXJkd2FyZSBhdXRvbWF0aWNhbGx5IGRvaW5nIHRoYXQsIG9yIGRvIHlv dSBoYXZlIHRvIHNlbWFwaG9yZQ0KPiB0aG9zZSBhY2Nlc3NlcyBhdCB0aGUgc29mdHdhcmUgbGV2 ZWw/DQpoYXJkd2FyZSBsZXZlbC4NCj4gDQo+ID4gDQo+ID4gVGhpbmsgb2YgdGhlIHNjZW5hcmlv IHRoYXQgd2UgcmVnaXN0ZXIgaXQgaW4gdGhlIGRyaXZlciBjb250ZXh0IG9mDQo+ID4gUENJZSBk ZXZpY2UgQSwNCj4gPiBhbmQgdGhlbiB0aGUgZHJpdmVyIGlzIHVuYm91bmQgZnJvbSBqdXN0IHRo aXMgZGV2aWNlLiBEZXZpY2UgQg0KPiA+IHdvbid0IGJlIGFibGUNCj4gPiB0byBhY2Nlc3MgdGhl IGJ1cyBzaW5jZSBpdCB3YXMgcmVnaXN0ZXJlZCB3aXRoIGNhbGxiYWNrcyB0aGF0IHVzZSBhDQo+ ID4gUENJZSBCQVIgb2YNCj4gPiBkZXZpY2UgQSwgd2hpY2ggaXMgbm8gbG9uZ2VyIHZhbGlkLg0K PiBZb3UgY2FuIGhhdmUgb25lIHNpbmdsZSBwaHlzaWNhbCBNRElPIGJ1cyB0aGF0IHlvdSByZWdp c3RlciBvbmNlDQo+IHRocm91Z2hvdXQgdGhlIFNvQydzIHBvd2VyIG9uIGxpZmVjeWNsZSwgYW5k IHRoZW4geW91IGNhbiBjcmVhdGUNCj4gInZpcnR1YWwiIE1ESU8gYnVzIGluc3RhbmNlcyB3aGlj aCBtYXAgMToxIHdpdGggdGhlIFBDSWUNCj4gZGV2aWNlL2Z1bmN0aW9uDQo+IGFuZCBhcmUgbmVz dGVkIGZyb20gdGhhdCBzaW5nbGUgTURJTyBidXMsIHRoaXMgYWxzbyBnaXZlcyB5b3UNCj4gc2Vy aWFsaXphdGlvbiBvZiBhY2Nlc3NlcyBhbmQgYXJiaXRyYXRpb24gZm9yIGZyZWUuDQp0aGUgcHJv YmxlbSBpcyB0aGF0IHBoeXNpY2FsIE1ESU8gY29udHJvbGxlciBhY3R1YWxseSBiZWxvbmdzIHRv IG9uZSBvZg0KdGhlIHBjaWUgZGV2aWNlcyBhbmQgaXQncyBub3QgaW5kZXBlbmRlbnQgaW50ZXJm YWNlLCBhcyB0aGUgcmVnaXN0ZXJzDQphZGRyZXNzIGJlbG9uZ3MgdG8gdGhhdCBwY2llIGRldmlj ZSwgYWxzbywgYSByZXNldCB0byB0aGF0IHBjaWUgZGV2aWNlDQp3aWxsIHJlc2V0IHRoZSAic2hh cmVkIiBtZGlvIGNvbnRyb2xsZXIuDQo+IA0KPiA+IA0KPiA+IA0KPiA+IElzIGl0IHBvc3NpYmxl IHRvIHJlZ2lzdGVyIHRoZSBtZGlvX2J1cyBzdHJ1Y3QgYXMgYSBnbG9iYWwgaW5zdGFuY2UNCj4g PiBhdCBkcml2ZXIgbG9hZCwNCj4gPiBhbmQgc29tZXdheSBwYXNzIHRoZSBvZmZzZXQgdG8gdGhl IHNwZWNpZmljIGRldmljZSdzIE1ESU8gbWFzdGVyLA0KPiA+IGFzIHBhcnQgb2YNCj4gPiBlYWNo IHJlYWQvd3JpdGUgdHJhbnNhY3Rpb24gdG93YXJkcyB0aGUgTURJTyBidXM/DQo+IFlvdSBjYW4g cmVnaXN0ZXIgaG93IG1hbnkgaW5zdGFuY2VzIG9mIHRoZSBNRElPIGJ1cyB5b3Ugd2FudCBpbiBh DQo+IHN5c3RlbSwgaXQgY2FuIGJlIGEgc2luZ2xldG9uIGZvciB0aGUgcHVycG9zZSBvZiBzdXBw b3J0aW5nIHlvdXINCj4gc3BlY2lmaWMgaGFyZHdhcmUsIG9yIHlvdSBjYW4gYnVpbGQgYSBsYXll ciBvbiB0b3AgbGlrZSBJIGp1c3QNCj4gc3VnZ2VzdGVkDQo+IGFib3ZlLg0KPiANCj4gPiANCj4g PiBPciBwZXJoYXBzIHlvdSBoYXZlIGFub3RoZXIgc3VnZ2VzdGlvbiB3aGljaCB0YWtlcyBpbnRv IGFjY291bnQgdGhlDQo+ID4gaXNzdWVzIEkndmUgZGVzY3JpYmVkPw0KPiBDb25zaWRlcmluZyB0 aGF0IGJpbmRpbmcgdG8gYSBNRElPIGJ1cyBpcyBkb25lIGJ5IE1ESU8gYnVzIG5hbWUNCj4gKGJ1 cy0+aWQpIGFuZC9vciBEZXZpY2UgVHJlZSBwYXJlbnQvY2hpbGQgaGllcmFyY2h5LCBpZiB0aGVy ZSBpcyBvbmx5DQo+IG9uZSwganVzdCBoYXZlIGFsbCBpbnN0YW5jZXMgcmVmZXJlbmNlIHRoZSBz YW1lIE1ESU8gYnVzIHdoZW4gdGhleQ0KPiB3YW50DQo+IHRvIGJpbmQgdG8gdGhlaXIgZGV2aWNl cyAocHVyZSBtZGlvX2RldmljZSwgb3IgcGh5X2RldmljZSkgb24gdGhhdA0KPiBNRElPIGJ1cy4K X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJt LWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3Jn Cmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtl cm5lbAo=