From mboxrd@z Thu Jan 1 00:00:00 1970 From: Herbert Valerio Riedel Subject: Re: RFC: new WIP version of au1000_eth.c phylib conversion (was Re: RFC: au1000_etc.c phylib rewrite) Date: Tue, 09 May 2006 04:04:23 +0200 Message-ID: <1147140263.1328.27.camel@localhost.localdomain> References: <5.1.0.14.2.20060501144633.025e4e20@205.166.54.3> <1146510542.16643.10.camel@localhost.localdomain> <1146510542.16643.10.camel@localhost.localdomain> <5.1.0.14.2.20060501144633.025e4e20@205.166.54.3> <5.1.0.14.2.20060502095256.01fd4210@205.166.54.3> <1146674056.31241.18.camel@localhost.localdomain> <1146734223.31241.44.camel@localhost.localdomain> <6BF86C09-0732-4322-A43E-29705849886D@freescale.com> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=-nXAAkLu6qAytME5Lt43T" Cc: Mark Schank , ppopov@embeddedalley.com, sshtylyov@ru.mvista.com, linux-mips@linux-mips.org, jgarzik@pobox.com, netdev@vger.kernel.org, Ralf Baechle , "Robin H. Johnson" Return-path: Received: from h081217049130.dyn.cm.kabsi.at ([81.217.49.130]:61896 "EHLO phobos.hvrlab.org") by vger.kernel.org with ESMTP id S1751339AbWEICHv (ORCPT ); Mon, 8 May 2006 22:07:51 -0400 To: Andy Fleming In-Reply-To: <6BF86C09-0732-4322-A43E-29705849886D@freescale.com> Sender: netdev-owner@vger.kernel.org List-Id: netdev.vger.kernel.org --=-nXAAkLu6qAytME5Lt43T Content-Type: multipart/mixed; boundary="=-3obsThmJDBZucvHF3QdD" --=-3obsThmJDBZucvHF3QdD Content-Type: text/plain Content-Transfer-Encoding: quoted-printable jfyi, yet another more recent snapshot is attached to this email... On Mon, 2006-05-08 at 17:24 -0500, Andy Fleming wrote: > > I've tried to adapt the PHY detection code to allow for dynamic =20 > > runtime configuration (with fallback to search for the 2nd MAC PHY on t= he 1st > > MAC's MII bus), as well as selectable static PHY configuration through > > Kconfig (e.g. for supporting PHYs w/o MII connection) >=20 > Comments inline, below: > [snip] >=20 > Nothing to say so far, except seeing all those "-" signs was quite =20 > the thrill, since one of the goals of the phylib was to lead to =20 > reduced complexity. That said, it looked like there were about a =20 > dozen PHY-specific code blocks in there. I saw you submit one PHY =20 > driver. Were there others in there that could be ported? could well be, although I hope that most would work with the genphy driver out of the box; but I'm depending on other people here anyway to test it, since I don't have all kinds of evaluation boards available for testing myself... :-) I submitted the SMSC phy driver, because that's a piece of hardware I had to play with... > [snip] >=20 > > +static int mdiobus_read(struct mii_bus *bus, int phy_addr, int =20 > > regnum) > > { > > - int i, val; > > + struct net_device *const dev =3D bus->priv; /* beware: bus->phy_map=20 > > [phy_addr].attached_dev =3D=3D dev does _NOT_ hold always */ > > + enable_mac(dev, 0); /* make sure MAC associated with this mii_bus =20 > > is enabled */ > > + return mdio_read(dev, phy_addr, regnum); > > +} >=20 >=20 > Why is attached_dev not always correct? I'm not sure if I'm not =20 > understanding the hardware (I'm unfamiliar with this NIC), or if =20 > you've misinterpreted the meaning of the attached_dev field. It's =20 > supposed to be a connection between the network device and a PHY, =20 > mainly used for allowing the PHY to signal state changes back to the =20 > ethernet device. Is it actually the case that there is one MAC being =20 > used for two PHYs at the same time?=20 exactly; some au1xxxx based boards have so-called DualPHYs which provide two PHYs, but with only one MII interface... > If so, how do you resolve which =20 > PHY's state gets used at any given moment? the attached_dev points to the net_device for which the PHY state is relevant -- which might not be the net_device whose MII bus the PHY is attached to... it's just that the net_device stored in the mii_bus->priv field points always to the "physical" net_device and finally, each net_device has a pointer to its "logical" phy_dev ...does this answer your question? :-) > The same question applies for the code in mdiobus_write() >=20 > [snip] > > -static int mii_probe (struct net_device * dev) > > +static int mdiobus_reset(struct mii_bus *bus) > > { > > - struct au1000_private *aup =3D (struct au1000_private *) dev->priv; > > - int phy_addr; > > -#ifdef CONFIG_MIPS_BOSPORUS > > - int phy_found=3D0; > > -#endif > > + struct net_device *dev =3D bus->priv; > > - /* search for total of 32 possible mii phy addresses */ > > - for (phy_addr =3D 0; phy_addr < 32; phy_addr++) { > > - u16 mii_status; > > - u16 phy_id0, phy_id1; > > - int i; > > + enable_mac(dev, 0); /* make sure MAC associated with this mii_bus =20 > > is enabled */ > > >=20 > Do you need to call enable_mac() every time? If it needs to be up, =20 > wouldn't it be easier to make sure it's up during bus initialization? it's actually a hack :-/ it's needed for the case where a PHY is attached to a MAC other than the state-associated one... as MAC can be powered down, when the eth is down, this allows to keep the MAC down if it's not needed, and also make sure it get's enabled again, in case something happened between mdiobus_reset and mdiobus_read/write=20 > [snip] > Might want to change that to be "...not 10/100..." or add a case for =20 > 1000. done... > [snip] >=20 > > + spin_unlock_irqrestore(&aup->lock, flags); > > + if (status_change) { > > + phy_print_status(phydev); > > + } > > } >=20 >=20 > Stylistic issue (I've seen it a couple times, at least): don't use =20 > "{" and "}" if your block only has one line. > ie: > if (status_change) > phy_print_status(phydev); you seem to have found one of the very few if(){single-line} cases I introduced... (and that particular one was even a placeholder which got bloated anyway :-)) regards, hvr --=-3obsThmJDBZucvHF3QdD Content-Disposition: attachment; filename=au1000eth_phylib_conversion.patch Content-Transfer-Encoding: base64 Content-Type: text/x-patch; name=au1000eth_phylib_conversion.patch; charset=UTF-8 ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L0tjb25maWcgYi9kcml2ZXJzL25ldC9LY29uZmlnDQpp bmRleCAxZWRjYzBjLi4wZjZhNDFhIDEwMDY0NA0KSW5kZXg6IGd3MTU1MGtlcm5lbC9kcml2ZXJz L25ldC9LY29uZmlnDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gZ3cxNTUwa2VybmVsLm9yaWcvZHJpdmVycy9u ZXQvS2NvbmZpZwkyMDA2LTA1LTA5IDAzOjAxOjM3LjAwMDAwMDAwMCArMDIwMA0KKysrIGd3MTU1 MGtlcm5lbC9kcml2ZXJzL25ldC9LY29uZmlnCTIwMDYtMDUtMDkgMDM6MjA6MTkuMDAwMDAwMDAw ICswMjAwDQpAQCAtNDU1LDExICs0NTUsNTAgQEANCiBjb25maWcgTUlQU19BVTFYMDBfRU5FVA0K IAlib29sICJNSVBTIEFVMTAwMCBFdGhlcm5ldCBzdXBwb3J0Ig0KIAlkZXBlbmRzIG9uIE5FVF9F VEhFUk5FVCAmJiBTT0NfQVUxWDAwDQorCXNlbGVjdCBQSFlMSUINCiAJc2VsZWN0IENSQzMyDQog CWhlbHANCiAJICBJZiB5b3UgaGF2ZSBhbiBBbGNoZW15IFNlbWkgQVUxWDAwIGJhc2VkIHN5c3Rl bQ0KIAkgIHNheSBZLiAgT3RoZXJ3aXNlLCBzYXkgTi4NCiANCitjb25maWcgTUlQU19BVTFYMDBf RU5FVF9TVEFUSUNfUEhZX0NPTkZJRw0KKwlib29sICJTdGF0aWMgUEhZIGNvbmZpZ3VyYXRpb24i DQorCWRlcGVuZHMgb24gTUlQU19BVTFYMDBfRU5FVA0KKwlkZWZhdWx0IG4NCisJaGVscA0KKwkg IFNheSBZIGlmIHlvdSBuZWVkIHRvIHNldCBhIHN0YXRpYyBQSFkgY29uZmlndXJhdGlvbi4gSWYg eW91IHNheSBOLCB0aGUNCisJICBkcml2ZXIgd2lsbCB0cnkgdG8gYXV0b2RldGVjdCB0aGUgUEhZ IGNvbmZpZ3VyYXRpb24uDQorDQorY29uZmlnIE1JUFNfQVUxWDAwX0VORVRfRVRIMF9QSFlfQURE Ug0KKwlpbnQgIjFzdCBFdGhlcm5ldCdzIFBIWSBhZGRyZXNzIHstMSwwLi4zMX0iDQorCWRlcGVu ZHMgb24gTUlQU19BVTFYMDBfRU5FVF9TVEFUSUNfUEhZX0NPTkZJRw0KKwloZWxwDQorCSAgUHJv dmlkZSB0aGUgUEhZIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IER0aGVybmV0IGRldmljZS4NCisJICBJ ZiB0aGUgUEhZIGhhcyBubyBQSFkgYWRkcmVzcywgc2F5ICItMSIuDQorDQorY29uZmlnIE1JUFNf QVUxWDAwX0VORVRfRVRIMF9QSFlfSVJRDQorCWludCAiMXN0IEV0aGVybmV0J3MgUEhZIElSUSIN CisJZGVwZW5kcyBvbiBNSVBTX0FVMVgwMF9FTkVUX1NUQVRJQ19QSFlfQ09ORklHDQorDQorY29u ZmlnIE1JUFNfQVUxWDAwX0VORVRfRVRIMV9QSFlfT05fTUFDMA0KKwlib29sICIybmQgRXRoZXJu ZXQncyBQSFkgaXMgYXR0YWNoZWQgdG8gMXN0IE1BQyINCisJZGVwZW5kcyBvbiBNSVBTX0FVMVgw MF9FTkVUX1NUQVRJQ19QSFlfQ09ORklHDQorCWRlZmF1bHQgbg0KKwloZWxwDQorCSAgU2F5IFkg aGVyZSwgaWYgdGhlIHNlY29uZCBFdGhlcm5ldCdzIFBIWSBpcyBhdHRhY2hlZCB0bw0KKwkgIHRo ZSBNSUkgYnVzIG9mIHRoZSBmaXJzdCBNQUMuDQorDQorY29uZmlnIE1JUFNfQVUxWDAwX0VORVRf RVRIMV9QSFlfQUREUg0KKwlpbnQgIjJuZCBFdGhlcm5ldCdzIFBIWSBhZGRyZXNzIHstMSwwLi4z MX0iDQorCWRlcGVuZHMgb24gTUlQU19BVTFYMDBfRU5FVF9TVEFUSUNfUEhZX0NPTkZJRw0KKwlo ZWxwDQorCSAgUHJvdmlkZSB0aGUgUEhZIGFkZHJlc3Mgb2YgdGhlIHNlY29uZCBFdGhlcm5ldCBk ZXZpY2UuDQorCSAgSWYgdGhlIFBIWSBoYXMgbm8gUEhZIGFkZHJlc3MsIHNheSAiLTEiLg0KKw0K K2NvbmZpZyBNSVBTX0FVMVgwMF9FTkVUX0VUSDFfUEhZX0lSUQ0KKwlpbnQgIjJuZCBFdGhlcm5l dCdzIFBIWSBJUlEiDQorCWRlcGVuZHMgb24gTUlQU19BVTFYMDBfRU5FVF9TVEFUSUNfUEhZX0NP TkZJRw0KKw0KIGNvbmZpZyBTR0lfSU9DM19FVEgNCiAJYm9vbCAiU0dJIElPQzMgRXRoZXJuZXQi DQogCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFBDSSAmJiBTR0lfSVAyNw0KSW5kZXg6IGd3 MTU1MGtlcm5lbC9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmMNCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBndzE1 NTBrZXJuZWwub3JpZy9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmMJMjAwNi0wNS0wOSAwMzowMTo0 NC4wMDAwMDAwMDAgKzAyMDANCisrKyBndzE1NTBrZXJuZWwvZHJpdmVycy9uZXQvYXUxMDAwX2V0 aC5jCTIwMDYtMDUtMDkgMDM6NDU6MDMuMDAwMDAwMDAwICswMjAwDQpAQCAtOSw2ICs5LDkgQEAN CiAgKiBVcGRhdGU6IDIwMDQgQmpvZXJuIFJpZW1lciwgcmllbWVyQGZva3VzLmZyYXVuaG9mZXIu ZGUgDQogICogb3IgcmllbWVyQHJpZW1lci1udC5kZTogZml4ZWQgdGhlIGxpbmsgYmVhdCBkZXRl Y3Rpb24gd2l0aCANCiAgKiBpb2N0bHMgKFNJT0NHTUlJUEhZKQ0KKyAqIENvcHlyaWdodCAyMDA2 IEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPg0KKyAqICBjb252ZXJ0ZWQgdG8g dXNlIGxpbnV4LTIuNi54J3MgUEhZIGZyYW1ld29yaw0KKyAqDQogICogQXV0aG9yOiBNb250YVZp c3RhIFNvZnR3YXJlLCBJbmMuDQogICogICAgICAgICAJcHBvcG92QG12aXN0YS5jb20gb3Igc291 cmNlQG12aXN0YS5jb20NCiAgKg0KQEAgLTUzLDYgKzU2LDcgQEANCiAjaW5jbHVkZSA8bGludXgv c2tidWZmLmg+DQogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+DQogI2luY2x1ZGUgPGxpbnV4L2Ny YzMyLmg+DQorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPg0KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3Mu aD4NCiAjaW5jbHVkZSA8YXNtL2lycS5oPg0KICNpbmNsdWRlIDxhc20vaW8uaD4NCkBAIC04OCwx NyArOTIsMTUgQEANCiBzdGF0aWMgaW50IGF1MTAwMF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqKTsN CiBzdGF0aWMgaXJxcmV0dXJuX3QgYXUxMDAwX2ludGVycnVwdChpbnQsIHZvaWQgKiwgc3RydWN0 IHB0X3JlZ3MgKik7DQogc3RhdGljIHZvaWQgYXUxMDAwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9k ZXZpY2UgKik7DQotc3RhdGljIGludCBhdTEwMDBfc2V0X2NvbmZpZyhzdHJ1Y3QgbmV0X2Rldmlj ZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCk7DQogc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3Ry dWN0IG5ldF9kZXZpY2UgKik7DQogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdTEw MDBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOw0KLXN0YXRpYyB2b2lkIGF1MTAwMF90 aW1lcih1bnNpZ25lZCBsb25nKTsNCiBzdGF0aWMgaW50IGF1MTAwMF9pb2N0bChzdHJ1Y3QgbmV0 X2RldmljZSAqLCBzdHJ1Y3QgaWZyZXEgKiwgaW50KTsNCiBzdGF0aWMgaW50IG1kaW9fcmVhZChz dHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIGludCk7DQogc3RhdGljIHZvaWQgbWRpb193cml0ZShz dHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIGludCwgdTE2KTsNCi1zdGF0aWMgdm9pZCBkdW1wX21p aShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkKTsNCitzdGF0aWMgdm9pZCBhdTEw MDBfYWRqdXN0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKik7DQorc3RhdGljIHZvaWQgZW5hYmxl X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQpOw0KIA0KIC8vIGV4dGVybnMNCi1leHRlcm4g IHZvaWQgYWNrX3Jpc2VfZWRnZV9pcnEodW5zaWduZWQgaW50KTsNCiBleHRlcm4gaW50IGdldF9l dGhlcm5ldF9hZGRyKGNoYXIgKmV0aGVybmV0X2FkZHIpOw0KIGV4dGVybiB2b2lkIHN0cjJlYWRk cih1bnNpZ25lZCBjaGFyICplYSwgdW5zaWduZWQgY2hhciAqc3RyKTsNCiBleHRlcm4gY2hhciAq IF9faW5pdCBwcm9tX2dldGNtZGxpbmUodm9pZCk7DQpAQCAtMTA4LDExICsxMTAsMTEgQEANCiAg Kg0KICAqIFRoZSBBdTEwMDAgTUFDcyB1c2UgYSBzaW1wbGUgcnggYW5kIHR4IGRlc2NyaXB0b3Ig cmluZyBzY2hlbWUuIA0KICAqIFRoZXJlIGFyZSBmb3VyIHJlY2VpdmUgYW5kIGZvdXIgdHJhbnNt aXQgZGVzY3JpcHRvcnMuICBUaGVzZSANCi0gKiBkZXNjcmlwdG9ycyBhcmUgbm90IGluIG1lbW9y eTsgcmF0aGVyLCB0aGV5IGFyZSBqdXN0IGEgc2V0IG9mIA0KKyAqIGRlc2NyaXB0b3JzIGFyZSBu b3QgaW4gbWVtb3J5OyByYXRoZXIsIHRoZXkgYXJlIGp1c3QgYSBzZXQgb2YNCiAgKiBoYXJkd2Fy ZSByZWdpc3RlcnMuDQogICoNCiAgKiBTaW5jZSB0aGUgQXUxMDAwIGhhcyBhIGNvaGVyZW50IGRh dGEgY2FjaGUsIHRoZSByZWNlaXZlIGFuZA0KLSAqIHRyYW5zbWl0IGJ1ZmZlcnMgYXJlIGFsbG9j YXRlZCBmcm9tIHRoZSBLU0VHMCBzZWdtZW50LiBUaGUgDQorICogdHJhbnNtaXQgYnVmZmVycyBh cmUgYWxsb2NhdGVkIGZyb20gdGhlIEtTRUcwIHNlZ21lbnQuIFRoZQ0KICAqIGhhcmR3YXJlIHJl Z2lzdGVycywgaG93ZXZlciwgYXJlIHN0aWxsIG1hcHBlZCBhdCBLU0VHMSB0bw0KICAqIG1ha2Ug c3VyZSB0aGVyZSdzIG5vIG91dC1vZi1vcmRlciB3cml0ZXMsIGFuZCB0aGF0IGFsbCB3cml0ZXMN CiAgKiBjb21wbGV0ZSBpbW1lZGlhdGVseS4NCkBAIC0xMjIsNzA5ICsxMjQsMjMgQEANCiAgKiB0 aGUgbWFjIGFkZHJlc3MgaXMsIGFuZCB0aGUgbWFjIGFkZHJlc3MgaXMgbm90IHBhc3NlZCBvbiB0 aGUNCiAgKiBjb21tYW5kIGxpbmUuDQogICovDQotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXUxMDAw X21hY19hZGRyWzZdIF9fZGV2aW5pdGRhdGEgPSB7IA0KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF1 MTAwMF9tYWNfYWRkcls2XSBfX2RldmluaXRkYXRhID0gew0KIAkweDAwLCAweDUwLCAweGMyLCAw eDBjLCAweDMwLCAweDAwDQogfTsNCiANCi0jZGVmaW5lIG5pYnN3YXAoeCkgKCgoKHgpID4+IDQp ICYgMHgwZikgfCAoKCh4KSA8PCA0KSAmIDB4ZjApKQ0KLSNkZWZpbmUgUlVOX0FUKHgpIChqaWZm aWVzICsgKHgpKQ0KLQ0KLS8vIEZvciByZWFkaW5nL3dyaXRpbmcgMzItYml0IHdvcmRzIGZyb20v dG8gRE1BIG1lbW9yeQ0KLSNkZWZpbmUgY3B1X3RvX2RtYTMyIGNwdV90b19iZTMyDQotI2RlZmlu ZSBkbWEzMl90b19jcHUgYmUzMl90b19jcHUNCi0NCiBzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1 X21hY3NbTlVNX0VUSF9JTlRFUkZBQ0VTXTsNCiANCi0vKiBGSVhNRSANCi0gKiBBbGwgb2YgdGhl IFBIWSBjb2RlIHJlYWxseSBzaG91bGQgYmUgZGV0YWNoZWQgZnJvbSB0aGUgTUFDIA0KLSAqIGNv ZGUuDQorLyoNCisgKiBNSUkgb3BlcmF0aW9ucw0KICAqLw0KLQ0KLS8qIERlZmF1bHQgYWR2ZXJ0 aXNlICovDQotI2RlZmluZSBHRU5NSUlfREVGQVVMVF9BRFZFUlRJU0UgXA0KLQlBRFZFUlRJU0VE XzEwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwgXA0KLQlBRFZFUlRJU0VE XzEwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfCBcDQotCUFEVkVSVElT RURfQXV0b25lZw0KLQ0KLSNkZWZpbmUgR0VOTUlJX0RFRkFVTFRfRkVBVFVSRVMgXA0KLQlTVVBQ T1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8IFwNCi0JU1VQUE9S VEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8IFwNCi0JU1VQUE9S VEVEX0F1dG9uZWcNCi0NCi1pbnQgYmNtXzUyMDFfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2 LCBpbnQgcGh5X2FkZHIpDQotew0KLQlzMTYgZGF0YTsNCi0JDQotCS8qIFN0b3AgYXV0by1uZWdv dGlhdGlvbiAqLw0KLQlkYXRhID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9M KTsNCi0JbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgZGF0YSAmIH5NSUlf Q05UTF9BVVRPKTsNCi0NCi0JLyogU2V0IGFkdmVydGlzZW1lbnQgdG8gMTAvMTAwIGFuZCBIYWxm L0Z1bGwgZHVwbGV4DQotCSAqIChmdWxsIGNhcGFiaWxpdGllcykgKi8NCi0JZGF0YSA9IG1kaW9f cmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQU5BRFYpOw0KLQlkYXRhIHw9IE1JSV9OV0FZX1RYIHwg TUlJX05XQVlfVFhfRkRYIHwgTUlJX05XQVlfVF9GRFggfCBNSUlfTldBWV9UOw0KLQltZGlvX3dy aXRlKGRldiwgcGh5X2FkZHIsIE1JSV9BTkFEViwgZGF0YSk7DQotCQ0KLQkvKiBSZXN0YXJ0IGF1 dG8tbmVnb3RpYXRpb24gKi8NCi0JZGF0YSA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlf Q09OVFJPTCk7DQotCWRhdGEgfD0gTUlJX0NOVExfUlNUX0FVVE8gfCBNSUlfQ05UTF9BVVRPOw0K LQltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBkYXRhKTsNCi0NCi0JaWYg KGF1MTAwMF9kZWJ1ZyA+IDQpIA0KLQkJZHVtcF9taWkoZGV2LCBwaHlfYWRkcik7DQotCXJldHVy biAwOw0KLX0NCi0NCi1pbnQgYmNtXzUyMDFfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwg aW50IHBoeV9hZGRyKQ0KLXsNCi0JczE2IG1paV9jb250cm9sLCB0aW1lb3V0Ow0KLQkNCi0JbWlp X2NvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOw0KLQltZGlv X3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBtaWlfY29udHJvbCB8IE1JSV9DTlRM X1JFU0VUKTsNCi0JbWRlbGF5KDEpOw0KLQlmb3IgKHRpbWVvdXQgPSAxMDA7IHRpbWVvdXQgPiAw OyAtLXRpbWVvdXQpIHsNCi0JCW1paV9jb250cm9sID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIs IE1JSV9DT05UUk9MKTsNCi0JCWlmICgobWlpX2NvbnRyb2wgJiBNSUlfQ05UTF9SRVNFVCkgPT0g MCkNCi0JCQlicmVhazsNCi0JCW1kZWxheSgxKTsNCi0JfQ0KLQlpZiAobWlpX2NvbnRyb2wgJiBN SUlfQ05UTF9SRVNFVCkgew0KLQkJcHJpbnRrKEtFUk5fRVJSICIlcyBQSFkgcmVzZXQgdGltZW91 dCAhXG4iLCBkZXYtPm5hbWUpOw0KLQkJcmV0dXJuIC0xOw0KLQl9DQotCXJldHVybiAwOw0KLX0N Ci0NCi1pbnQgDQotYmNtXzUyMDFfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBw aHlfYWRkciwgdTE2ICpsaW5rLCB1MTYgKnNwZWVkKQ0KLXsNCi0JdTE2IG1paV9kYXRhOw0KLQlz dHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cDsNCi0NCi0JaWYgKCFkZXYpIHsNCi0JCXByaW50ayhL RVJOX0VSUiAiYmNtXzUyMDFfc3RhdHVzIGVycm9yOiBOVUxMIGRldlxuIik7DQotCQlyZXR1cm4g LTE7DQotCX0NCi0JYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7DQot DQotCW1paV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX1NUQVRVUyk7 DQotCWlmIChtaWlfZGF0YSAmIE1JSV9TVEFUX0xJTkspIHsNCi0JCSpsaW5rID0gMTsNCi0JCW1p aV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX0FVWF9DTlRSTCk7DQot CQlpZiAobWlpX2RhdGEgJiBNSUlfQVVYXzEwMCkgew0KLQkJCWlmIChtaWlfZGF0YSAmIE1JSV9B VVhfRkRYKSB7DQotCQkJCSpzcGVlZCA9IElGX1BPUlRfMTAwQkFTRUZYOw0KLQkJCQlkZXYtPmlm X3BvcnQgPSBJRl9QT1JUXzEwMEJBU0VGWDsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCSpzcGVl ZCA9IElGX1BPUlRfMTAwQkFTRVRYOw0KLQkJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwMEJB U0VUWDsNCi0JCQl9DQotCQl9DQotCQllbHNlICB7DQotCQkJKnNwZWVkID0gSUZfUE9SVF8xMEJB U0VUOw0KLQkJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTBCQVNFVDsNCi0JCX0NCi0NCi0JfQ0K LQllbHNlIHsNCi0JCSpsaW5rID0gMDsNCi0JCSpzcGVlZCA9IDA7DQotCQlkZXYtPmlmX3BvcnQg PSBJRl9QT1JUX1VOS05PV047DQotCX0NCi0JcmV0dXJuIDA7DQotfQ0KLQ0KLWludCBsc2lfODAy MjdfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIpDQotew0KLQlpZiAo YXUxMDAwX2RlYnVnID4gNCkNCi0JCXByaW50aygibHNpXzgwMjI3X2luaXRcbiIpOw0KLQ0KLQkv KiByZXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24gKi8NCi0JbWRpb193cml0ZShkZXYsIHBoeV9hZGRy LCBNSUlfQ09OVFJPTCwNCi0JCSAgIE1JSV9DTlRMX0YxMDAgfCBNSUlfQ05UTF9BVVRPIHwgTUlJ X0NOVExfUlNUX0FVVE8pOyAvLyB8IE1JSV9DTlRMX0ZEWCk7DQotCW1kZWxheSgxKTsNCi0NCi0J Lyogc2V0IHVwIExFRHMgdG8gY29ycmVjdCBkaXNwbGF5ICovDQotI2lmZGVmIENPTkZJR19NSVBT X01UWDENCi0JbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCAxNywgMHhmZjgwKTsNCi0jZWxzZQ0K LQltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIDE3LCAweGZmYzApOw0KLSNlbmRpZg0KLQ0KLQlp ZiAoYXUxMDAwX2RlYnVnID4gNCkNCi0JCWR1bXBfbWlpKGRldiwgcGh5X2FkZHIpOw0KLQlyZXR1 cm4gMDsNCi19DQotDQotaW50IGxzaV84MDIyN19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2 LCBpbnQgcGh5X2FkZHIpDQotew0KLQlzMTYgbWlpX2NvbnRyb2wsIHRpbWVvdXQ7DQotCQ0KLQlp ZiAoYXUxMDAwX2RlYnVnID4gNCkgew0KLQkJcHJpbnRrKCJsc2lfODAyMjdfcmVzZXRcbiIpOw0K LQkJZHVtcF9taWkoZGV2LCBwaHlfYWRkcik7DQotCX0NCi0NCi0JbWlpX2NvbnRyb2wgPSBtZGlv X3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOw0KLQltZGlvX3dyaXRlKGRldiwgcGh5 X2FkZHIsIE1JSV9DT05UUk9MLCBtaWlfY29udHJvbCB8IE1JSV9DTlRMX1JFU0VUKTsNCi0JbWRl bGF5KDEpOw0KLQlmb3IgKHRpbWVvdXQgPSAxMDA7IHRpbWVvdXQgPiAwOyAtLXRpbWVvdXQpIHsN Ci0JCW1paV9jb250cm9sID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsN Ci0JCWlmICgobWlpX2NvbnRyb2wgJiBNSUlfQ05UTF9SRVNFVCkgPT0gMCkNCi0JCQlicmVhazsN Ci0JCW1kZWxheSgxKTsNCi0JfQ0KLQlpZiAobWlpX2NvbnRyb2wgJiBNSUlfQ05UTF9SRVNFVCkg ew0KLQkJcHJpbnRrKEtFUk5fRVJSICIlcyBQSFkgcmVzZXQgdGltZW91dCAhXG4iLCBkZXYtPm5h bWUpOw0KLQkJcmV0dXJuIC0xOw0KLQl9DQotCXJldHVybiAwOw0KLX0NCi0NCi1pbnQNCi1sc2lf ODAyMjdfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkciwgdTE2ICps aW5rLCB1MTYgKnNwZWVkKQ0KLXsNCi0JdTE2IG1paV9kYXRhOw0KLQlzdHJ1Y3QgYXUxMDAwX3By aXZhdGUgKmF1cDsNCi0NCi0JaWYgKCFkZXYpIHsNCi0JCXByaW50ayhLRVJOX0VSUiAibHNpXzgw MjI3X3N0YXR1cyBlcnJvcjogTlVMTCBkZXZcbiIpOw0KLQkJcmV0dXJuIC0xOw0KLQl9DQotCWF1 cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2Ow0KLQ0KLQltaWlfZGF0YSA9 IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9TVEFUVVMpOw0KLQlpZiAobWlpX2Rh dGEgJiBNSUlfU1RBVF9MSU5LKSB7DQotCQkqbGluayA9IDE7DQotCQltaWlfZGF0YSA9IG1kaW9f cmVhZChkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9MU0lfUEhZX1NUQVQpOw0KLQkJaWYgKG1paV9k YXRhICYgTUlJX0xTSV9QSFlfU1RBVF9TUEQpIHsNCi0JCQlpZiAobWlpX2RhdGEgJiBNSUlfTFNJ X1BIWV9TVEFUX0ZEWCkgew0KLQkJCQkqc3BlZWQgPSBJRl9QT1JUXzEwMEJBU0VGWDsNCi0JCQkJ ZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMDBCQVNFRlg7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJ CQkqc3BlZWQgPSBJRl9QT1JUXzEwMEJBU0VUWDsNCi0JCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9S VF8xMDBCQVNFVFg7DQotCQkJfQ0KLQkJfQ0KLQkJZWxzZSAgew0KLQkJCSpzcGVlZCA9IElGX1BP UlRfMTBCQVNFVDsNCi0JCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwQkFTRVQ7DQotCQl9DQot DQotCX0NCi0JZWxzZSB7DQotCQkqbGluayA9IDA7DQotCQkqc3BlZWQgPSAwOw0KLQkJZGV2LT5p Zl9wb3J0ID0gSUZfUE9SVF9VTktOT1dOOw0KLQl9DQotCXJldHVybiAwOw0KLX0NCi0NCi1pbnQg YW03OWM5MDFfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIpDQotew0K LQlwcmludGsoImFtNzljOTAxX2luaXRcbiIpOw0KLQlyZXR1cm4gMDsNCi19DQotDQotaW50IGFt NzljOTAxX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkcikNCi17DQot CXByaW50aygiYW03OWM5MDFfcmVzZXRcbiIpOw0KLQlyZXR1cm4gMDsNCi19DQotDQotaW50IA0K LWFtNzljOTAxX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIHUx NiAqbGluaywgdTE2ICpzcGVlZCkNCi17DQotCXJldHVybiAwOw0KLX0NCi0NCi1pbnQgYW03OWM4 NzRfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIpDQotew0KLQlzMTYg ZGF0YTsNCi0NCi0JLyogNzljODc0IGhhcyBxdWl0IHJlc2VtYmxlZCBiaXQgYXNzaWdubWVudHMg dG8gQkNNNTIwMSAqLw0KLQlpZiAoYXUxMDAwX2RlYnVnID4gNCkNCi0JCXByaW50aygiYW03OWM4 NDdfaW5pdFxuIik7DQotDQotCS8qIFN0b3AgYXV0by1uZWdvdGlhdGlvbiAqLw0KLQlkYXRhID0g bWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsNCi0JbWRpb193cml0ZShkZXYs IHBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgZGF0YSAmIH5NSUlfQ05UTF9BVVRPKTsNCi0NCi0JLyog U2V0IGFkdmVydGlzZW1lbnQgdG8gMTAvMTAwIGFuZCBIYWxmL0Z1bGwgZHVwbGV4DQotCSAqIChm dWxsIGNhcGFiaWxpdGllcykgKi8NCi0JZGF0YSA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBN SUlfQU5BRFYpOw0KLQlkYXRhIHw9IE1JSV9OV0FZX1RYIHwgTUlJX05XQVlfVFhfRkRYIHwgTUlJ X05XQVlfVF9GRFggfCBNSUlfTldBWV9UOw0KLQltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1J SV9BTkFEViwgZGF0YSk7DQotCQ0KLQkvKiBSZXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24gKi8NCi0J ZGF0YSA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7DQotCWRhdGEgfD0g TUlJX0NOVExfUlNUX0FVVE8gfCBNSUlfQ05UTF9BVVRPOw0KLQ0KLQltZGlvX3dyaXRlKGRldiwg cGh5X2FkZHIsIE1JSV9DT05UUk9MLCBkYXRhKTsNCi0NCi0JaWYgKGF1MTAwMF9kZWJ1ZyA+IDQp IGR1bXBfbWlpKGRldiwgcGh5X2FkZHIpOw0KLQlyZXR1cm4gMDsNCi19DQotDQotaW50IGFtNzlj ODc0X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkcikNCi17DQotCXMx NiBtaWlfY29udHJvbCwgdGltZW91dDsNCi0JDQotCWlmIChhdTEwMDBfZGVidWcgPiA0KQ0KLQkJ cHJpbnRrKCJhbTc5Yzg3NF9yZXNldFxuIik7DQotDQotCW1paV9jb250cm9sID0gbWRpb19yZWFk KGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsNCi0JbWRpb193cml0ZShkZXYsIHBoeV9hZGRy LCBNSUlfQ09OVFJPTCwgbWlpX2NvbnRyb2wgfCBNSUlfQ05UTF9SRVNFVCk7DQotCW1kZWxheSgx KTsNCi0JZm9yICh0aW1lb3V0ID0gMTAwOyB0aW1lb3V0ID4gMDsgLS10aW1lb3V0KSB7DQotCQlt aWlfY29udHJvbCA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7DQotCQlp ZiAoKG1paV9jb250cm9sICYgTUlJX0NOVExfUkVTRVQpID09IDApDQotCQkJYnJlYWs7DQotCQlt ZGVsYXkoMSk7DQotCX0NCi0JaWYgKG1paV9jb250cm9sICYgTUlJX0NOVExfUkVTRVQpIHsNCi0J CXByaW50ayhLRVJOX0VSUiAiJXMgUEhZIHJlc2V0IHRpbWVvdXQgIVxuIiwgZGV2LT5uYW1lKTsN Ci0JCXJldHVybiAtMTsNCi0JfQ0KLQlyZXR1cm4gMDsNCi19DQotDQotaW50IA0KLWFtNzljODc0 X3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIHUxNiAqbGluaywg dTE2ICpzcGVlZCkNCi17DQotCXUxNiBtaWlfZGF0YTsNCi0Jc3RydWN0IGF1MTAwMF9wcml2YXRl ICphdXA7DQotDQotCS8vIHByaW50aygiYW03OWM4NzRfc3RhdHVzXG4iKTsNCi0JaWYgKCFkZXYp IHsNCi0JCXByaW50ayhLRVJOX0VSUiAiYW03OWM4NzRfc3RhdHVzIGVycm9yOiBOVUxMIGRldlxu Iik7DQotCQlyZXR1cm4gLTE7DQotCX0NCi0NCi0JYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0 ZSAqKSBkZXYtPnByaXY7DQotCW1paV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRk ciwgTUlJX1NUQVRVUyk7DQotDQotCWlmIChtaWlfZGF0YSAmIE1JSV9TVEFUX0xJTkspIHsNCi0J CSpsaW5rID0gMTsNCi0JCW1paV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwg TUlJX0FNRF9QSFlfU1RBVCk7DQotCQlpZiAobWlpX2RhdGEgJiBNSUlfQU1EX1BIWV9TVEFUX1NQ RCkgew0KLQkJCWlmIChtaWlfZGF0YSAmIE1JSV9BTURfUEhZX1NUQVRfRkRYKSB7DQotCQkJCSpz cGVlZCA9IElGX1BPUlRfMTAwQkFTRUZYOw0KLQkJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEw MEJBU0VGWDsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCSpzcGVlZCA9IElGX1BPUlRfMTAwQkFT RVRYOw0KLQkJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwMEJBU0VUWDsNCi0JCQl9DQotCQl9 DQotCQllbHNlIHsNCi0JCQkqc3BlZWQgPSBJRl9QT1JUXzEwQkFTRVQ7DQotCQkJZGV2LT5pZl9w b3J0ID0gSUZfUE9SVF8xMEJBU0VUOw0KLQkJfQ0KLQ0KLQl9DQotCWVsc2Ugew0KLQkJKmxpbmsg PSAwOw0KLQkJKnNwZWVkID0gMDsNCi0JCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfVU5LTk9XTjsN Ci0JfQ0KLQlyZXR1cm4gMDsNCi19DQotDQotaW50IGx4dDk3MWFfaW5pdChzdHJ1Y3QgbmV0X2Rl dmljZSAqZGV2LCBpbnQgcGh5X2FkZHIpDQotew0KLQlpZiAoYXUxMDAwX2RlYnVnID4gNCkNCi0J CXByaW50aygibHh0OTcxYV9pbml0XG4iKTsNCi0NCi0JLyogcmVzdGFydCBhdXRvLW5lZ290aWF0 aW9uICovDQotCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wsDQotCQkgICBN SUlfQ05UTF9GMTAwIHwgTUlJX0NOVExfQVVUTyB8IE1JSV9DTlRMX1JTVF9BVVRPIHwgTUlJX0NO VExfRkRYKTsNCi0NCi0JLyogc2V0IHVwIExFRHMgdG8gY29ycmVjdCBkaXNwbGF5ICovDQotCW1k aW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgMjAsIDB4MDQyMik7DQotDQotCWlmIChhdTEwMDBfZGVi dWcgPiA0KQ0KLQkJZHVtcF9taWkoZGV2LCBwaHlfYWRkcik7DQotCXJldHVybiAwOw0KLX0NCi0N Ci1pbnQgbHh0OTcxYV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIp DQotew0KLQlzMTYgbWlpX2NvbnRyb2wsIHRpbWVvdXQ7DQotCQ0KLQlpZiAoYXUxMDAwX2RlYnVn ID4gNCkgew0KLQkJcHJpbnRrKCJseHQ5NzFhX3Jlc2V0XG4iKTsNCi0JCWR1bXBfbWlpKGRldiwg cGh5X2FkZHIpOw0KLQl9DQotDQotCW1paV9jb250cm9sID0gbWRpb19yZWFkKGRldiwgcGh5X2Fk ZHIsIE1JSV9DT05UUk9MKTsNCi0JbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJP TCwgbWlpX2NvbnRyb2wgfCBNSUlfQ05UTF9SRVNFVCk7DQotCW1kZWxheSgxKTsNCi0JZm9yICh0 aW1lb3V0ID0gMTAwOyB0aW1lb3V0ID4gMDsgLS10aW1lb3V0KSB7DQotCQltaWlfY29udHJvbCA9 IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7DQotCQlpZiAoKG1paV9jb250 cm9sICYgTUlJX0NOVExfUkVTRVQpID09IDApDQotCQkJYnJlYWs7DQotCQltZGVsYXkoMSk7DQot CX0NCi0JaWYgKG1paV9jb250cm9sICYgTUlJX0NOVExfUkVTRVQpIHsNCi0JCXByaW50ayhLRVJO X0VSUiAiJXMgUEhZIHJlc2V0IHRpbWVvdXQgIVxuIiwgZGV2LT5uYW1lKTsNCi0JCXJldHVybiAt MTsNCi0JfQ0KLQlyZXR1cm4gMDsNCi19DQotDQotaW50DQotbHh0OTcxYV9zdGF0dXMoc3RydWN0 IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyLCB1MTYgKmxpbmssIHUxNiAqc3BlZWQpDQot ew0KLQl1MTYgbWlpX2RhdGE7DQotCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwOw0KLQ0KLQlp ZiAoIWRldikgew0KLQkJcHJpbnRrKEtFUk5fRVJSICJseHQ5NzFhX3N0YXR1cyBlcnJvcjogTlVM TCBkZXZcbiIpOw0KLQkJcmV0dXJuIC0xOw0KLQl9DQotCWF1cCA9IChzdHJ1Y3QgYXUxMDAwX3By aXZhdGUgKikgZGV2LT5wcml2Ow0KLQ0KLQltaWlfZGF0YSA9IG1kaW9fcmVhZChkZXYsIGF1cC0+ cGh5X2FkZHIsIE1JSV9TVEFUVVMpOw0KLQlpZiAobWlpX2RhdGEgJiBNSUlfU1RBVF9MSU5LKSB7 DQotCQkqbGluayA9IDE7DQotCQltaWlfZGF0YSA9IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2Fk ZHIsIE1JSV9JTlRFTF9QSFlfU1RBVCk7DQotCQlpZiAobWlpX2RhdGEgJiBNSUlfSU5URUxfUEhZ X1NUQVRfU1BEKSB7DQotCQkJaWYgKG1paV9kYXRhICYgTUlJX0lOVEVMX1BIWV9TVEFUX0ZEWCkg ew0KLQkJCQkqc3BlZWQgPSBJRl9QT1JUXzEwMEJBU0VGWDsNCi0JCQkJZGV2LT5pZl9wb3J0ID0g SUZfUE9SVF8xMDBCQVNFRlg7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQkqc3BlZWQgPSBJRl9Q T1JUXzEwMEJBU0VUWDsNCi0JCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMDBCQVNFVFg7DQot CQkJfQ0KLQkJfQ0KLQkJZWxzZSAgew0KLQkJCSpzcGVlZCA9IElGX1BPUlRfMTBCQVNFVDsNCi0J CQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwQkFTRVQ7DQotCQl9DQotDQotCX0NCi0JZWxzZSB7 DQotCQkqbGluayA9IDA7DQotCQkqc3BlZWQgPSAwOw0KLQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9S VF9VTktOT1dOOw0KLQl9DQotCXJldHVybiAwOw0KLX0NCi0NCi1pbnQga3M4OTk1bV9pbml0KHN0 cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkcikNCi17DQotCXMxNiBkYXRhOw0KLQkN Ci0vLwlwcmludGsoImtzODk5NW1faW5pdFxuIik7DQotCS8qIFN0b3AgYXV0by1uZWdvdGlhdGlv biAqLw0KLQlkYXRhID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsNCi0J bWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgZGF0YSAmIH5NSUlfQ05UTF9B VVRPKTsNCi0NCi0JLyogU2V0IGFkdmVydGlzZW1lbnQgdG8gMTAvMTAwIGFuZCBIYWxmL0Z1bGwg ZHVwbGV4DQotCSAqIChmdWxsIGNhcGFiaWxpdGllcykgKi8NCi0JZGF0YSA9IG1kaW9fcmVhZChk ZXYsIHBoeV9hZGRyLCBNSUlfQU5BRFYpOw0KLQlkYXRhIHw9IE1JSV9OV0FZX1RYIHwgTUlJX05X QVlfVFhfRkRYIHwgTUlJX05XQVlfVF9GRFggfCBNSUlfTldBWV9UOw0KLQltZGlvX3dyaXRlKGRl diwgcGh5X2FkZHIsIE1JSV9BTkFEViwgZGF0YSk7DQotCQ0KLQkvKiBSZXN0YXJ0IGF1dG8tbmVn b3RpYXRpb24gKi8NCi0JZGF0YSA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJP TCk7DQotCWRhdGEgfD0gTUlJX0NOVExfUlNUX0FVVE8gfCBNSUlfQ05UTF9BVVRPOw0KLQltZGlv X3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBkYXRhKTsNCi0NCi0JaWYgKGF1MTAw MF9kZWJ1ZyA+IDQpIGR1bXBfbWlpKGRldiwgcGh5X2FkZHIpOw0KLQ0KLQlyZXR1cm4gMDsNCi19 DQotDQotaW50IGtzODk5NW1fcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9h ZGRyKQ0KLXsNCi0JczE2IG1paV9jb250cm9sLCB0aW1lb3V0Ow0KLQkNCi0vLwlwcmludGsoImtz ODk5NW1fcmVzZXRcbiIpOw0KLQltaWlfY29udHJvbCA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRy LCBNSUlfQ09OVFJPTCk7DQotCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0ws IG1paV9jb250cm9sIHwgTUlJX0NOVExfUkVTRVQpOw0KLQltZGVsYXkoMSk7DQotCWZvciAodGlt ZW91dCA9IDEwMDsgdGltZW91dCA+IDA7IC0tdGltZW91dCkgew0KLQkJbWlpX2NvbnRyb2wgPSBt ZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOw0KLQkJaWYgKChtaWlfY29udHJv bCAmIE1JSV9DTlRMX1JFU0VUKSA9PSAwKQ0KLQkJCWJyZWFrOw0KLQkJbWRlbGF5KDEpOw0KLQl9 DQotCWlmIChtaWlfY29udHJvbCAmIE1JSV9DTlRMX1JFU0VUKSB7DQotCQlwcmludGsoS0VSTl9F UlIgIiVzIFBIWSByZXNldCB0aW1lb3V0ICFcbiIsIGRldi0+bmFtZSk7DQotCQlyZXR1cm4gLTE7 DQotCX0NCi0JcmV0dXJuIDA7DQotfQ0KLQ0KLWludCBrczg5OTVtX3N0YXR1cyhzdHJ1Y3QgbmV0 X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIHUxNiAqbGluaywgdTE2ICpzcGVlZCkNCi17DQot CXUxNiBtaWlfZGF0YTsNCi0Jc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXA7DQotDQotCWlmICgh ZGV2KSB7DQotCQlwcmludGsoS0VSTl9FUlIgImtzODk5NW1fc3RhdHVzIGVycm9yOiBOVUxMIGRl dlxuIik7DQotCQlyZXR1cm4gLTE7DQotCX0NCi0JYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0 ZSAqKSBkZXYtPnByaXY7DQotDQotCW1paV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlf YWRkciwgTUlJX1NUQVRVUyk7DQotCWlmIChtaWlfZGF0YSAmIE1JSV9TVEFUX0xJTkspIHsNCi0J CSpsaW5rID0gMTsNCi0JCW1paV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwg TUlJX0FVWF9DTlRSTCk7DQotCQlpZiAobWlpX2RhdGEgJiBNSUlfQVVYXzEwMCkgew0KLQkJCWlm IChtaWlfZGF0YSAmIE1JSV9BVVhfRkRYKSB7DQotCQkJCSpzcGVlZCA9IElGX1BPUlRfMTAwQkFT RUZYOw0KLQkJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwMEJBU0VGWDsNCi0JCQl9DQotCQkJ ZWxzZSB7DQotCQkJCSpzcGVlZCA9IElGX1BPUlRfMTAwQkFTRVRYOw0KLQkJCQlkZXYtPmlmX3Bv cnQgPSBJRl9QT1JUXzEwMEJBU0VUWDsNCi0JCQl9DQotCQl9DQotCQllbHNlICB7CQkJCQkJCQkJ CQkNCi0JCQkqc3BlZWQgPSBJRl9QT1JUXzEwQkFTRVQ7DQotCQkJZGV2LT5pZl9wb3J0ID0gSUZf UE9SVF8xMEJBU0VUOw0KLQkJfQ0KLQ0KLQl9DQotCWVsc2Ugew0KLQkJKmxpbmsgPSAwOw0KLQkJ KnNwZWVkID0gMDsNCi0JCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfVU5LTk9XTjsNCi0JfQ0KLQly ZXR1cm4gMDsNCi19DQotDQotaW50DQotc21zY184M0MxODVfaW5pdCAoc3RydWN0IG5ldF9kZXZp Y2UgKmRldiwgaW50IHBoeV9hZGRyKQ0KLXsNCi0JczE2IGRhdGE7DQotDQotCWlmIChhdTEwMDBf ZGVidWcgPiA0KQ0KLQkJcHJpbnRrKCJzbXNjXzgzQzE4NV9pbml0XG4iKTsNCi0NCi0JLyogU3Rv cCBhdXRvLW5lZ290aWF0aW9uICovDQotCWRhdGEgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwg TUlJX0NPTlRST0wpOw0KLQltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBk YXRhICYgfk1JSV9DTlRMX0FVVE8pOw0KLQ0KLQkvKiBTZXQgYWR2ZXJ0aXNlbWVudCB0byAxMC8x MDAgYW5kIEhhbGYvRnVsbCBkdXBsZXgNCi0JICogKGZ1bGwgY2FwYWJpbGl0aWVzKSAqLw0KLQlk YXRhID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9BTkFEVik7DQotCWRhdGEgfD0gTUlJ X05XQVlfVFggfCBNSUlfTldBWV9UWF9GRFggfCBNSUlfTldBWV9UX0ZEWCB8IE1JSV9OV0FZX1Q7 DQotCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0FOQURWLCBkYXRhKTsNCi0JDQotCS8q IFJlc3RhcnQgYXV0by1uZWdvdGlhdGlvbiAqLw0KLQlkYXRhID0gbWRpb19yZWFkKGRldiwgcGh5 X2FkZHIsIE1JSV9DT05UUk9MKTsNCi0JZGF0YSB8PSBNSUlfQ05UTF9SU1RfQVVUTyB8IE1JSV9D TlRMX0FVVE87DQotDQotCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wsIGRh dGEpOw0KLQ0KLQlpZiAoYXUxMDAwX2RlYnVnID4gNCkgZHVtcF9taWkoZGV2LCBwaHlfYWRkcik7 DQotCXJldHVybiAwOw0KLX0NCi0NCi1pbnQNCi1zbXNjXzgzQzE4NV9yZXNldCAoc3RydWN0IG5l dF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyKQ0KLXsNCi0JczE2IG1paV9jb250cm9sLCB0aW1l b3V0Ow0KLQkNCi0JaWYgKGF1MTAwMF9kZWJ1ZyA+IDQpDQotCQlwcmludGsoInNtc2NfODNDMTg1 X3Jlc2V0XG4iKTsNCi0NCi0JbWlpX2NvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwg TUlJX0NPTlRST0wpOw0KLQltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBt aWlfY29udHJvbCB8IE1JSV9DTlRMX1JFU0VUKTsNCi0JbWRlbGF5KDEpOw0KLQlmb3IgKHRpbWVv dXQgPSAxMDA7IHRpbWVvdXQgPiAwOyAtLXRpbWVvdXQpIHsNCi0JCW1paV9jb250cm9sID0gbWRp b19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsNCi0JCWlmICgobWlpX2NvbnRyb2wg JiBNSUlfQ05UTF9SRVNFVCkgPT0gMCkNCi0JCQlicmVhazsNCi0JCW1kZWxheSgxKTsNCi0JfQ0K LQlpZiAobWlpX2NvbnRyb2wgJiBNSUlfQ05UTF9SRVNFVCkgew0KLQkJcHJpbnRrKEtFUk5fRVJS ICIlcyBQSFkgcmVzZXQgdGltZW91dCAhXG4iLCBkZXYtPm5hbWUpOw0KLQkJcmV0dXJuIC0xOw0K LQl9DQotCXJldHVybiAwOw0KLX0NCi0NCi1pbnQgDQotc21zY184M0MxODVfc3RhdHVzIChzdHJ1 Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIHUxNiAqbGluaywgdTE2ICpzcGVlZCkN Ci17DQotCXUxNiBtaWlfZGF0YTsNCi0Jc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXA7DQotDQot CWlmICghZGV2KSB7DQotCQlwcmludGsoS0VSTl9FUlIgInNtc2NfODNDMTg1X3N0YXR1cyBlcnJv cjogTlVMTCBkZXZcbiIpOw0KLQkJcmV0dXJuIC0xOw0KLQl9DQotDQotCWF1cCA9IChzdHJ1Y3Qg YXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2Ow0KLQltaWlfZGF0YSA9IG1kaW9fcmVhZChkZXYs IGF1cC0+cGh5X2FkZHIsIE1JSV9TVEFUVVMpOw0KLQ0KLQlpZiAobWlpX2RhdGEgJiBNSUlfU1RB VF9MSU5LKSB7DQotCQkqbGluayA9IDE7DQotCQltaWlfZGF0YSA9IG1kaW9fcmVhZChkZXYsIGF1 cC0+cGh5X2FkZHIsIDB4MWYpOw0KLQkJaWYgKG1paV9kYXRhICYgKDE8PDMpKSB7DQotCQkJaWYg KG1paV9kYXRhICYgKDE8PDQpKSB7DQotCQkJCSpzcGVlZCA9IElGX1BPUlRfMTAwQkFTRUZYOw0K LQkJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwMEJBU0VGWDsNCi0JCQl9DQotCQkJZWxzZSB7 DQotCQkJCSpzcGVlZCA9IElGX1BPUlRfMTAwQkFTRVRYOw0KLQkJCQlkZXYtPmlmX3BvcnQgPSBJ Rl9QT1JUXzEwMEJBU0VUWDsNCi0JCQl9DQotCQl9DQotCQllbHNlIHsNCi0JCQkqc3BlZWQgPSBJ Rl9QT1JUXzEwQkFTRVQ7DQotCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMEJBU0VUOw0KLQkJ fQ0KLQl9DQotCWVsc2Ugew0KLQkJKmxpbmsgPSAwOw0KLQkJKnNwZWVkID0gMDsNCi0JCWRldi0+ aWZfcG9ydCA9IElGX1BPUlRfVU5LTk9XTjsNCi0JfQ0KLQlyZXR1cm4gMDsNCi19DQotDQotDQot I2lmZGVmIENPTkZJR19NSVBTX0JPU1BPUlVTDQotaW50IHN0dWJfaW5pdChzdHJ1Y3QgbmV0X2Rl dmljZSAqZGV2LCBpbnQgcGh5X2FkZHIpDQotew0KLQkvL3ByaW50aygiUEhZIHN0dWJfaW5pdFxu Iik7DQotCXJldHVybiAwOw0KLX0NCi0NCi1pbnQgc3R1Yl9yZXNldChzdHJ1Y3QgbmV0X2Rldmlj ZSAqZGV2LCBpbnQgcGh5X2FkZHIpDQotew0KLQkvL3ByaW50aygiUEhZIHN0dWJfcmVzZXRcbiIp Ow0KLQlyZXR1cm4gMDsNCi19DQotDQotaW50IA0KLXN0dWJfc3RhdHVzKHN0cnVjdCBuZXRfZGV2 aWNlICpkZXYsIGludCBwaHlfYWRkciwgdTE2ICpsaW5rLCB1MTYgKnNwZWVkKQ0KLXsNCi0JLy9w cmludGsoIlBIWSBzdHViX3N0YXR1c1xuIik7DQotCSpsaW5rID0gMTsNCi0JLyogaG1tbSwgcmV2 aXNpdCAqLw0KLQkqc3BlZWQgPSBJRl9QT1JUXzEwMEJBU0VGWDsNCi0JZGV2LT5pZl9wb3J0ID0g SUZfUE9SVF8xMDBCQVNFRlg7DQotCXJldHVybiAwOw0KLX0NCi0jZW5kaWYNCi0NCi1zdHJ1Y3Qg cGh5X29wcyBiY21fNTIwMV9vcHMgPSB7DQotCWJjbV81MjAxX2luaXQsDQotCWJjbV81MjAxX3Jl c2V0LA0KLQliY21fNTIwMV9zdGF0dXMsDQotfTsNCi0NCi1zdHJ1Y3QgcGh5X29wcyBhbTc5Yzg3 NF9vcHMgPSB7DQotCWFtNzljODc0X2luaXQsDQotCWFtNzljODc0X3Jlc2V0LA0KLQlhbTc5Yzg3 NF9zdGF0dXMsDQotfTsNCi0NCi1zdHJ1Y3QgcGh5X29wcyBhbTc5YzkwMV9vcHMgPSB7DQotCWFt NzljOTAxX2luaXQsDQotCWFtNzljOTAxX3Jlc2V0LA0KLQlhbTc5YzkwMV9zdGF0dXMsDQotfTsN Ci0NCi1zdHJ1Y3QgcGh5X29wcyBsc2lfODAyMjdfb3BzID0geyANCi0JbHNpXzgwMjI3X2luaXQs DQotCWxzaV84MDIyN19yZXNldCwNCi0JbHNpXzgwMjI3X3N0YXR1cywNCi19Ow0KLQ0KLXN0cnVj dCBwaHlfb3BzIGx4dDk3MWFfb3BzID0geyANCi0JbHh0OTcxYV9pbml0LA0KLQlseHQ5NzFhX3Jl c2V0LA0KLQlseHQ5NzFhX3N0YXR1cywNCi19Ow0KLQ0KLXN0cnVjdCBwaHlfb3BzIGtzODk5NW1f b3BzID0gew0KLQlrczg5OTVtX2luaXQsDQotCWtzODk5NW1fcmVzZXQsDQotCWtzODk5NW1fc3Rh dHVzLA0KLX07DQotDQotc3RydWN0IHBoeV9vcHMgc21zY184M0MxODVfb3BzID0gew0KLQlzbXNj XzgzQzE4NV9pbml0LA0KLQlzbXNjXzgzQzE4NV9yZXNldCwNCi0Jc21zY184M0MxODVfc3RhdHVz LA0KLX07DQotDQotI2lmZGVmIENPTkZJR19NSVBTX0JPU1BPUlVTDQotc3RydWN0IHBoeV9vcHMg c3R1Yl9vcHMgPSB7DQotCXN0dWJfaW5pdCwNCi0Jc3R1Yl9yZXNldCwNCi0Jc3R1Yl9zdGF0dXMs DQotfTsNCi0jZW5kaWYNCi0NCi1zdGF0aWMgc3RydWN0IG1paV9jaGlwX2luZm8gew0KLQljb25z dCBjaGFyICogbmFtZTsNCi0JdTE2IHBoeV9pZDA7DQotCXUxNiBwaHlfaWQxOw0KLQlzdHJ1Y3Qg cGh5X29wcyAqcGh5X29wczsJDQotCWludCBkdWFsX3BoeTsNCi19IG1paV9jaGlwX3RhYmxlW10g PSB7DQotCXsiQnJvYWRjb20gQkNNNTIwMSAxMC8xMDAgQmFzZVQgUEhZIiwweDAwNDAsMHg2MjEy LCAmYmNtXzUyMDFfb3BzLDB9LA0KLQl7IkJyb2FkY29tIEJDTTUyMjEgMTAvMTAwIEJhc2VUIFBI WSIsMHgwMDQwLDB4NjFlNCwgJmJjbV81MjAxX29wcywwfSwNCi0JeyJCcm9hZGNvbSBCQ001MjIy IDEwLzEwMCBCYXNlVCBQSFkiLDB4MDA0MCwweDYzMjIsICZiY21fNTIwMV9vcHMsMX0sDQotCXsi TlMgRFA4Mzg0NyBQSFkiLCAweDIwMDAsIDB4NWMzMCwgJmJjbV81MjAxX29wcyAsMH0sDQotCXsi QU1EIDc5QzkwMSBIb21lUE5BIFBIWSIsMHgwMDAwLDB4MzVjOCwgJmFtNzljOTAxX29wcywwfSwN Ci0JeyJBTUQgNzlDODc0IDEwLzEwMCBCYXNlVCBQSFkiLDB4MDAyMiwweDU2MWIsICZhbTc5Yzg3 NF9vcHMsMH0sDQotCXsiTFNJIDgwMjI3IDEwLzEwMCBCYXNlVCBQSFkiLDB4MDAxNiwweGY4NDAs ICZsc2lfODAyMjdfb3BzLDB9LA0KLQl7IkludGVsIExYVDk3MUEgRHVhbCBTcGVlZCBQSFkiLDB4 MDAxMywweDc4ZTIsICZseHQ5NzFhX29wcywwfSwNCi0JeyJLZW5kaW4gS1M4OTk1TSAxMC8xMDAg QmFzZVQgUEhZIiwweDAwMjIsMHgxNDUwLCAma3M4OTk1bV9vcHMsMH0sDQotCXsiU01TQyBMQU44 M0MxODUgMTAvMTAwIEJhc2VUIFBIWSIsMHgwMDA3LDB4YzBhMywgJnNtc2NfODNDMTg1X29wcyww fSwNCi0jaWZkZWYgQ09ORklHX01JUFNfQk9TUE9SVVMNCi0JeyJTdHViIiwgMHgxMjM0LCAweDU2 NzgsICZzdHViX29wcyB9LA0KLSNlbmRpZg0KLQl7MCx9LA0KLX07DQotDQotc3RhdGljIGludCBt ZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IHJlZykNCitz dGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIs IGludCByZWcpDQogew0KIAlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUx MDAwX3ByaXZhdGUgKikgZGV2LT5wcml2Ow0KLQl2b2xhdGlsZSB1MzIgKm1paV9jb250cm9sX3Jl ZzsNCi0Jdm9sYXRpbGUgdTMyICptaWlfZGF0YV9yZWc7DQorCXZvbGF0aWxlIHUzMiAqY29uc3Qg bWlpX2NvbnRyb2xfcmVnID0gJmF1cC0+bWFjLT5taWlfY29udHJvbDsNCisJdm9sYXRpbGUgdTMy ICpjb25zdCBtaWlfZGF0YV9yZWcgPSAmYXVwLT5tYWMtPm1paV9kYXRhOw0KIAl1MzIgdGltZWRv dXQgPSAyMDsNCiAJdTMyIG1paV9jb250cm9sOw0KIA0KLQkjaWZkZWYgQ09ORklHX0JDTTUyMjJf RFVBTF9QSFkNCi0JLyogRmlyc3QgdGltZSB3ZSBwcm9iZSwgaXQncyBmb3IgdGhlIG1hYzAgcGh5 Lg0KLQkgKiBTaW5jZSB3ZSBoYXZlbid0IGRldGVybWluZWQgeWV0IHRoYXQgd2UgaGF2ZSBhIGR1 YWwgcGh5LA0KLQkgKiBhdXAtPm1paS0+bWlpX2NvbnRyb2xfcmVnIHdvbid0IGJlIHNldHVwIGFu ZCB3ZSdsbA0KLQkgKiBkZWZhdWx0IHRvIHRoZSBlbHNlIHN0YXRlbWVudC4NCi0JICogQnkgdGhl IHRpbWUgd2UgcHJvYmUgZm9yIHRoZSBtYWMxIHBoeSwgdGhlIG1paV9jb250cm9sX3JlZw0KLQkg KiB3aWxsIGJlIHNldHVwIHRvIGJlIHRoZSBhZGRyZXNzIG9mIHRoZSBtYWMwIHBoeSBjb250cm9s IHNpbmNlDQotCSAqIGJvdGggcGh5cyBhcmUgY29udHJvbGxlZCB0aHJvdWdoIG1hYzAuDQotCSAq Lw0KLQlpZiAoYXVwLT5taWkgJiYgYXVwLT5taWktPm1paV9jb250cm9sX3JlZykgew0KLQkJbWlp X2NvbnRyb2xfcmVnID0gYXVwLT5taWktPm1paV9jb250cm9sX3JlZzsNCi0JCW1paV9kYXRhX3Jl ZyA9IGF1cC0+bWlpLT5taWlfZGF0YV9yZWc7DQotCX0NCi0JZWxzZSBpZiAoYXVfbWFjc1swXS0+ bWlpICYmIGF1X21hY3NbMF0tPm1paS0+bWlpX2NvbnRyb2xfcmVnKSB7DQotCQkvKiBhc3N1bWUg Ym90aCBwaHlzIGFyZSBjb250cm9sbGVkIHRocm91Z2ggbWFjMCAqLw0KLQkJbWlpX2NvbnRyb2xf cmVnID0gYXVfbWFjc1swXS0+bWlpLT5taWlfY29udHJvbF9yZWc7DQotCQltaWlfZGF0YV9yZWcg PSBhdV9tYWNzWzBdLT5taWktPm1paV9kYXRhX3JlZzsNCi0JfQ0KLQllbHNlIA0KLQkjZW5kaWYN Ci0Jew0KLQkJLyogZGVmYXVsdCBjb250cm9sIGFuZCBkYXRhIHJlZyBhZGRyZXNzZXMgKi8NCi0J CW1paV9jb250cm9sX3JlZyA9ICZhdXAtPm1hYy0+bWlpX2NvbnRyb2w7DQotCQltaWlfZGF0YV9y ZWcgPSAmYXVwLT5tYWMtPm1paV9kYXRhOw0KLQl9DQotDQogCXdoaWxlICgqbWlpX2NvbnRyb2xf cmVnICYgTUFDX01JSV9CVVNZKSB7DQogCQltZGVsYXkoMSk7DQogCQlpZiAoLS10aW1lZG91dCA9 PSAwKSB7DQpAQCAtODM1LDcgKzE1MSw3IEBADQogCX0NCiANCiAJbWlpX2NvbnRyb2wgPSBNQUNf U0VUX01JSV9TRUxFQ1RfUkVHKHJlZykgfCANCi0JCU1BQ19TRVRfTUlJX1NFTEVDVF9QSFkocGh5 X2lkKSB8IE1BQ19NSUlfUkVBRDsNCisJCU1BQ19TRVRfTUlJX1NFTEVDVF9QSFkocGh5X2FkZHIp IHwgTUFDX01JSV9SRUFEOw0KIA0KIAkqbWlpX2NvbnRyb2xfcmVnID0gbWlpX2NvbnRyb2w7DQog DQpAQCAtODUxLDMyICsxNjcsMTQgQEANCiAJcmV0dXJuIChpbnQpKm1paV9kYXRhX3JlZzsNCiB9 DQogDQotc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQg cGh5X2lkLCBpbnQgcmVnLCB1MTYgdmFsdWUpDQorc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1 Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIGludCByZWcsIHUxNiB2YWx1ZSkNCiB7 DQogCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAq KSBkZXYtPnByaXY7DQotCXZvbGF0aWxlIHUzMiAqbWlpX2NvbnRyb2xfcmVnOw0KLQl2b2xhdGls ZSB1MzIgKm1paV9kYXRhX3JlZzsNCisJdm9sYXRpbGUgdTMyICpjb25zdCBtaWlfY29udHJvbF9y ZWcgPSAmYXVwLT5tYWMtPm1paV9jb250cm9sOw0KKwl2b2xhdGlsZSB1MzIgKmNvbnN0IG1paV9k YXRhX3JlZyA9ICZhdXAtPm1hYy0+bWlpX2RhdGE7DQogCXUzMiB0aW1lZG91dCA9IDIwOw0KIAl1 MzIgbWlpX2NvbnRyb2w7DQogDQotCSNpZmRlZiBDT05GSUdfQkNNNTIyMl9EVUFMX1BIWQ0KLQlp ZiAoYXVwLT5taWkgJiYgYXVwLT5taWktPm1paV9jb250cm9sX3JlZykgew0KLQkJbWlpX2NvbnRy b2xfcmVnID0gYXVwLT5taWktPm1paV9jb250cm9sX3JlZzsNCi0JCW1paV9kYXRhX3JlZyA9IGF1 cC0+bWlpLT5taWlfZGF0YV9yZWc7DQotCX0NCi0JZWxzZSBpZiAoYXVfbWFjc1swXS0+bWlpICYm IGF1X21hY3NbMF0tPm1paS0+bWlpX2NvbnRyb2xfcmVnKSB7DQotCQkvKiBhc3N1bWUgYm90aCBw aHlzIGFyZSBjb250cm9sbGVkIHRocm91Z2ggbWFjMCAqLw0KLQkJbWlpX2NvbnRyb2xfcmVnID0g YXVfbWFjc1swXS0+bWlpLT5taWlfY29udHJvbF9yZWc7DQotCQltaWlfZGF0YV9yZWcgPSBhdV9t YWNzWzBdLT5taWktPm1paV9kYXRhX3JlZzsNCi0JfQ0KLQllbHNlIA0KLQkjZW5kaWYNCi0Jew0K LQkJLyogZGVmYXVsdCBjb250cm9sIGFuZCBkYXRhIHJlZyBhZGRyZXNzZXMgKi8NCi0JCW1paV9j b250cm9sX3JlZyA9ICZhdXAtPm1hYy0+bWlpX2NvbnRyb2w7DQotCQltaWlfZGF0YV9yZWcgPSAm YXVwLT5tYWMtPm1paV9kYXRhOw0KLQl9DQotDQogCXdoaWxlICgqbWlpX2NvbnRyb2xfcmVnICYg TUFDX01JSV9CVVNZKSB7DQogCQltZGVsYXkoMSk7DQogCQlpZiAoLS10aW1lZG91dCA9PSAwKSB7 DQpAQCAtODg3LDE2NSArMTg1LDE2NyBAQA0KIAl9DQogDQogCW1paV9jb250cm9sID0gTUFDX1NF VF9NSUlfU0VMRUNUX1JFRyhyZWcpIHwgDQotCQlNQUNfU0VUX01JSV9TRUxFQ1RfUEhZKHBoeV9p ZCkgfCBNQUNfTUlJX1dSSVRFOw0KKwkJTUFDX1NFVF9NSUlfU0VMRUNUX1BIWShwaHlfYWRkcikg fCBNQUNfTUlJX1dSSVRFOw0KIA0KIAkqbWlpX2RhdGFfcmVnID0gdmFsdWU7DQogCSptaWlfY29u dHJvbF9yZWcgPSBtaWlfY29udHJvbDsNCiB9DQogDQotDQotc3RhdGljIHZvaWQgZHVtcF9taWko c3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCkNCitzdGF0aWMgaW50IG1kaW9idXNf cmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcGh5X2FkZHIsIGludCByZWdudW0pDQogew0K LQlpbnQgaSwgdmFsOw0KLQ0KLQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7DQotCQlpZiAoKHZh bCA9IG1kaW9fcmVhZChkZXYsIHBoeV9pZCwgaSkpID49IDApDQotCQkJcHJpbnRrKCIlczogTUlJ IFJlZyAlZD0leFxuIiwgZGV2LT5uYW1lLCBpLCB2YWwpOw0KKwkvKiBXQVJOSU5HOiBidXMtPnBo eV9tYXBbcGh5X2FkZHJdLmF0dGFjaGVkX2RldiA9PSBkZXYgZG9lcw0KKwkgKiBfTk9UXyBob2xk IChlLmcuIHdoZW4gUEhZIGlzIGFjY2Vzc2VkIHRocm91Z2ggb3RoZXIgTUFDJ3MgTUlJIGJ1cykg Ki8NCisJc3RydWN0IG5ldF9kZXZpY2UgKmNvbnN0IGRldiA9IGJ1cy0+cHJpdjsNCisNCisJZW5h YmxlX21hYyhkZXYsIDApOyAvKiBtYWtlIHN1cmUgdGhlIE1BQyBhc3NvY2lhdGVkIHdpdGggdGhp cw0KKwkJCSAgICAgKiBtaWlfYnVzIGlzIGVuYWJsZWQgKi8NCisJcmV0dXJuIG1kaW9fcmVhZChk ZXYsIHBoeV9hZGRyLCByZWdudW0pOw0KK30NCisNCitzdGF0aWMgaW50IG1kaW9idXNfd3JpdGUo c3RydWN0IG1paV9idXMgKmJ1cywgaW50IHBoeV9hZGRyLCBpbnQgcmVnbnVtLA0KKwkJCSB1MTYg dmFsdWUpDQorew0KKwlzdHJ1Y3QgbmV0X2RldmljZSAqY29uc3QgZGV2ID0gYnVzLT5wcml2Ow0K Kw0KKwllbmFibGVfbWFjKGRldiwgMCk7IC8qIG1ha2Ugc3VyZSB0aGUgTUFDIGFzc29jaWF0ZWQg d2l0aCB0aGlzDQorCQkJICAgICAqIG1paV9idXMgaXMgZW5hYmxlZCAqLw0KKwltZGlvX3dyaXRl KGRldiwgcGh5X2FkZHIsIHJlZ251bSwgdmFsdWUpOw0KKwlyZXR1cm4gMDsNCit9DQorDQorc3Rh dGljIGludCBtZGlvYnVzX3Jlc2V0KHN0cnVjdCBtaWlfYnVzICpidXMpDQorew0KKwlzdHJ1Y3Qg bmV0X2RldmljZSAqY29uc3QgZGV2ID0gYnVzLT5wcml2Ow0KKw0KKwllbmFibGVfbWFjKGRldiwg MCk7IC8qIG1ha2Ugc3VyZSB0aGUgTUFDIGFzc29jaWF0ZWQgd2l0aCB0aGlzDQorCQkJICAgICAq IG1paV9idXMgaXMgZW5hYmxlZCAqLw0KKwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIGludCBt aWlfcHJvYmUgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpDQorew0KKwlzdHJ1Y3QgYXUxMDAwX3By aXZhdGUgKmNvbnN0IGF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2Ow0K KwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gTlVMTDsNCisNCisjaWYgZGVmaW5lZChDT05G SUdfTUlQU19BVTFYMDBfRU5FVF9TVEFUSUNfUEhZX0NPTkZJRykNCisJQlVHX09OKGF1cC0+bWFj X2lkIDwgMCB8fCBhdXAtPm1hY19pZCA+IDEpOw0KKw0KKwlpZihhdXAtPm1hY19pZCA9PSAwKSB7 DQorIyBpZiBDT05GSUdfTUlQU19BVTFYMDBfRU5FVF9FVEgwX1BIWV9BRERSPT0tMQ0KKwkJcHJp bnRrIChLRVJOX0lORk8gRFJWX05BTUUgIjolczogdXNpbmcgUEhZLWxlc3MgY29uZmlnXG4iLCBk ZXYtPm5hbWUpOw0KKwkJcmV0dXJuIDA7DQorIyBlbGlmIChDT05GSUdfTUlQU19BVTFYMDBfRU5F VF9FVEgwX1BIWV9BRERSPj0wKSAmJiAoQ09ORklHX01JUFNfQVUxWDAwX0VORVRfRVRIMF9QSFlf QUREUjxQSFlfTUFYX0FERFIpDQorCQlwaHlkZXYgPSBhdXAtPm1paV9idXMucGh5X21hcFtDT05G SUdfTUlQU19BVTFYMDBfRU5FVF9FVEgwX1BIWV9BRERSXTsNCisjICAgaWYgZGVmaW5lZChDT05G SUdfTUlQU19BVTFYMDBfRU5FVF9FVEgxX1BIWV9JUlEpDQorCQkvKiBmaXggdXAgSVJRICovDQor CQlhdXAtPm1paV9idXMuaXJxW0NPTkZJR19NSVBTX0FVMVgwMF9FTkVUX0VUSDBfUEhZX0FERFJd ID0gQ09ORklHX01JUFNfQVUxWDAwX0VORVRfRVRIMF9QSFlfSVJROw0KKwkJaWYocGh5ZGV2KQ0K KwkJCXBoeWRldi0+aXJxID0gQ09ORklHX01JUFNfQVUxWDAwX0VORVRfRVRIMF9QSFlfSVJROw0K KyMgICBlbmRpZg0KKyMgZWxzZQ0KKyMgIGVycm9yIEJhZCB2YWx1ZSBmb3IgQ09ORklHX01JUFNf QVUxWDAwX0VORVRfRVRIMF9QSFlfQUREUiBnaXZlbg0KKyMgZW5kaWYNCisJfSBlbHNlIGlmIChh dXAtPm1hY19pZCA9PSAxKSB7DQorIyBpZiBDT05GSUdfTUlQU19BVTFYMDBfRU5FVF9FVEgxX1BI WV9BRERSPT0tMQ0KKwkJcHJpbnRrIChLRVJOX0lORk8gRFJWX05BTUUgIjolczogdXNpbmcgUEhZ LWxlc3MgY29uZmlnXG4iLCBkZXYtPm5hbWUpOw0KKwkJcmV0dXJuIDA7DQorIyBlbGlmIChDT05G SUdfTUlQU19BVTFYMDBfRU5FVF9FVEgxX1BIWV9BRERSPj0wKSAmJiAoQ09ORklHX01JUFNfQVUx WDAwX0VORVRfRVRIMV9QSFlfQUREUjxQSFlfTUFYX0FERFIpDQorIyAgaWYgZGVmaW5lZChDT05G SUdfTUlQU19BVTFYMDBfRU5FVF9FVEgxX1BIWV9PTl9NQUMwKQ0KKyMgICBpZiBDT05GSUdfTUlQ U19BVTFYMDBfRU5FVF9FVEgxX1BIWV9BRERSPT1DT05GSUdfTUlQU19BVTFYMDBfRU5FVF9FVEgw X1BIWV9BRERSDQorIyAgICBlcnJvciBnaXZlbiBzYW1lIHN0YXRpYyBQSFkgYWRkcmVzcywgYW5k IGJvdGggUEhZcyBhcmUgb24gdGhlIHNhbWUgYnVzDQorIyAgIGVuZGlmDQorCQlwaHlkZXYgPSBh dV9tYWNzWzBdLT5taWlfYnVzLnBoeV9tYXBbQ09ORklHX01JUFNfQVUxWDAwX0VORVRfRVRIMV9Q SFlfQUREUl07DQorIyAgIGlmIGRlZmluZWQoQ09ORklHX01JUFNfQVUxWDAwX0VORVRfRVRIMV9Q SFlfSVJRKQ0KKwkJLyogZml4IHVwIElSUSAqLw0KKwkJYXVfbWFjc1swXS0+bWlpX2J1cy5pcnFb Q09ORklHX01JUFNfQVUxWDAwX0VORVRfRVRIMV9QSFlfQUREUl0gPSBDT05GSUdfTUlQU19BVTFY MDBfRU5FVF9FVEgxX1BIWV9JUlE7DQorCQlpZihwaHlkZXYpDQorCQkJcGh5ZGV2LT5pcnEgPSBD T05GSUdfTUlQU19BVTFYMDBfRU5FVF9FVEgxX1BIWV9JUlE7DQorIyAgIGVuZGlmDQorIyAgZWxz ZQ0KKwkJcGh5ZGV2ID0gYXVwLT5taWlfYnVzLnBoeV9tYXBbQ09ORklHX01JUFNfQVUxWDAwX0VO RVRfRVRIMV9QSFlfQUREUl07DQorIyAgIGlmIGRlZmluZWQoQ09ORklHX01JUFNfQVUxWDAwX0VO RVRfRVRIMV9QSFlfSVJRKQ0KKwkJLyogZml4IHVwIElSUSAqLw0KKwkJYXVwLT5taWlfYnVzLmly cVtDT05GSUdfTUlQU19BVTFYMDBfRU5FVF9FVEgxX1BIWV9BRERSXSA9IENPTkZJR19NSVBTX0FV MVgwMF9FTkVUX0VUSDFfUEhZX0lSUTsNCisJCWlmKHBoeWRldikNCisJCQlwaHlkZXYtPmlycSA9 IENPTkZJR19NSVBTX0FVMVgwMF9FTkVUX0VUSDFfUEhZX0lSUTsNCisjICAgZW5kaWYNCisjICBl bmRpZg0KKyMgZWxzZQ0KKyMgIGVycm9yIEJhZCB2YWx1ZSBmb3IgQ09ORklHX01JUFNfQVUxWDAw X0VORVRfRVRIMF9QSFlfQUREUiBnaXZlbg0KKyMgZW5kaWYNCiAJfQ0KLQlmb3IgKGkgPSAxNjsg aSA8IDI1OyBpKyspIHsNCi0JCWlmICgodmFsID0gbWRpb19yZWFkKGRldiwgcGh5X2lkLCBpKSkg Pj0gMCkNCi0JCQlwcmludGsoIiVzOiBNSUkgUmVnICVkPSV4XG4iLCBkZXYtPm5hbWUsIGksIHZh bCk7DQotCX0NCi19DQogDQotc3RhdGljIGludCBtaWlfcHJvYmUgKHN0cnVjdCBuZXRfZGV2aWNl ICogZGV2KQ0KLXsNCi0Jc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAw MF9wcml2YXRlICopIGRldi0+cHJpdjsNCisjZWxzZSAvKiBydW50aW1lIGRldGVjdGVkIFBIWSBj b25maWd1cmF0aW9uICovDQogCWludCBwaHlfYWRkcjsNCi0jaWZkZWYgQ09ORklHX01JUFNfQk9T UE9SVVMNCi0JaW50IHBoeV9mb3VuZD0wOw0KLSNlbmRpZg0KLQ0KLQkvKiBzZWFyY2ggZm9yIHRv dGFsIG9mIDMyIHBvc3NpYmxlIG1paSBwaHkgYWRkcmVzc2VzICovDQotCWZvciAocGh5X2FkZHIg PSAwOyBwaHlfYWRkciA8IDMyOyBwaHlfYWRkcisrKSB7DQotCQl1MTYgbWlpX3N0YXR1czsNCi0J CXUxNiBwaHlfaWQwLCBwaHlfaWQxOw0KLQkJaW50IGk7DQotDQotCQkjaWZkZWYgQ09ORklHX0JD TTUyMjJfRFVBTF9QSFkNCi0JCS8qIE1hc2sgdGhlIGFscmVhZHkgZm91bmQgcGh5LCB0cnkgbmV4 dCBvbmUgKi8NCi0JCWlmIChhdV9tYWNzWzBdLT5taWkgJiYgYXVfbWFjc1swXS0+bWlpLT5taWlf Y29udHJvbF9yZWcpIHsNCi0JCQlpZiAoYXVfbWFjc1swXS0+cGh5X2FkZHIgPT0gcGh5X2FkZHIp DQotCQkJCWNvbnRpbnVlOw0KLQkJfQ0KLQkJI2VuZGlmDQogDQotCQltaWlfc3RhdHVzID0gbWRp b19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9TVEFUVVMpOw0KLQkJaWYgKG1paV9zdGF0dXMgPT0g MHhmZmZmIHx8IG1paV9zdGF0dXMgPT0gMHgwMDAwKQ0KLQkJCS8qIHRoZSBtaWkgaXMgbm90IGFj Y2Vzc2FibGUsIHRyeSBuZXh0IG9uZSAqLw0KLQkJCWNvbnRpbnVlOw0KLQ0KLQkJcGh5X2lkMCA9 IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfUEhZX0lEMCk7DQotCQlwaHlfaWQxID0gbWRp b19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9QSFlfSUQxKTsNCi0NCi0JCS8qIHNlYXJjaCBvdXIg bWlpIHRhYmxlIGZvciB0aGUgY3VycmVudCBtaWkgKi8gDQotCQlmb3IgKGkgPSAwOyBtaWlfY2hp cF90YWJsZVtpXS5waHlfaWQxOyBpKyspIHsNCi0JCQlpZiAocGh5X2lkMCA9PSBtaWlfY2hpcF90 YWJsZVtpXS5waHlfaWQwICYmDQotCQkJICAgIHBoeV9pZDEgPT0gbWlpX2NoaXBfdGFibGVbaV0u cGh5X2lkMSkgew0KLQkJCQlzdHJ1Y3QgbWlpX3BoeSAqIG1paV9waHkgPSBhdXAtPm1paTsNCi0N Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGF0IHBoeSBhZGRyZXNzICVkXG4iLA0KLQkJ CQkgICAgICAgZGV2LT5uYW1lLCBtaWlfY2hpcF90YWJsZVtpXS5uYW1lLCANCi0JCQkJICAgICAg IHBoeV9hZGRyKTsNCi0jaWZkZWYgQ09ORklHX01JUFNfQk9TUE9SVVMNCi0JCQkJcGh5X2ZvdW5k ID0gMTsNCi0jZW5kaWYNCi0JCQkJbWlpX3BoeS0+Y2hpcF9pbmZvID0gbWlpX2NoaXBfdGFibGUr aTsNCi0JCQkJYXVwLT5waHlfYWRkciA9IHBoeV9hZGRyOw0KLQkJCQlhdXAtPndhbnRfYXV0b25l ZyA9IDE7DQotCQkJCWF1cC0+cGh5X29wcyA9IG1paV9jaGlwX3RhYmxlW2ldLnBoeV9vcHM7DQot CQkJCWF1cC0+cGh5X29wcy0+cGh5X2luaXQoZGV2LHBoeV9hZGRyKTsNCi0NCi0JCQkJLy8gQ2hl Y2sgZm9yIGR1YWwtcGh5IGFuZCB0aGVuIHN0b3JlIHJlcXVpcmVkIA0KLQkJCQkvLyB2YWx1ZXMg YW5kIHNldCBpbmRpY2F0b3JzLiBXZSBuZWVkIHRvIGRvIA0KLQkJCQkvLyB0aGlzIG5vdyBzaW5j ZSBtZGlvX3tyZWFkLHdyaXRlfSBuZWVkIHRoZSANCi0JCQkJLy8gY29udHJvbCBhbmQgZGF0YSBy ZWdpc3RlciBhZGRyZXNzZXMuDQotCQkJCSNpZmRlZiBDT05GSUdfQkNNNTIyMl9EVUFMX1BIWQ0K LQkJCQlpZiAoIG1paV9jaGlwX3RhYmxlW2ldLmR1YWxfcGh5KSB7DQotDQotCQkJCQkvKiBhc3N1 bWUgYm90aCBwaHlzIGFyZSBjb250cm9sbGVkIA0KLQkJCQkJICogdGhyb3VnaCBNQUMwLiBCb2Fy ZCBzcGVjaWZpYz8gKi8NCi0JCQkJCQ0KLQkJCQkJLyogc2FuaXR5IGNoZWNrICovDQotCQkJCQlp ZiAoIWF1X21hY3NbMF0gfHwgIWF1X21hY3NbMF0tPm1paSkNCi0JCQkJCQlyZXR1cm4gLTE7DQot CQkJCQlhdXAtPm1paS0+bWlpX2NvbnRyb2xfcmVnID0gKHUzMiAqKQ0KLQkJCQkJCSZhdV9tYWNz WzBdLT5tYWMtPm1paV9jb250cm9sOw0KLQkJCQkJYXVwLT5taWktPm1paV9kYXRhX3JlZyA9ICh1 MzIgKikNCi0JCQkJCQkmYXVfbWFjc1swXS0+bWFjLT5taWlfZGF0YTsNCi0JCQkJfQ0KLQkJCQkj ZW5kaWYNCi0JCQkJZ290byBmb3VuZDsNCi0JCQl9DQotCQl9DQotCX0NCi1mb3VuZDoNCisJLyog ZmluZCB0aGUgZmlyc3QgKGxvd2VzdCBhZGRyZXNzKSBQSFkgb24gdGhlIGN1cnJlbnQgTUFDJ3Mg TUlJIGJ1cyAqLw0KKwlmb3IgKHBoeV9hZGRyID0gMDsgcGh5X2FkZHIgPCBQSFlfTUFYX0FERFI7 IHBoeV9hZGRyKyspDQorCQlpZiAoYXVwLT5taWlfYnVzLnBoeV9tYXBbcGh5X2FkZHJdKSB7DQor CQkJcGh5ZGV2ID0gYXVwLT5taWlfYnVzLnBoeV9tYXBbcGh5X2FkZHJdOw0KKwkJCWJyZWFrOyAv KiBmb3VuZCBpdCAqLw0KKwkJfQ0KKw0KKwkvKiB0cnkgaGFyZGVyIHRvIGZpbmQgYSBQSFkgKi8N CisJaWYgKCFwaHlkZXYgJiYgKGF1cC0+bWFjX2lkID09IDEpKSB7DQorCQkvKiBubyBQSFkgZm91 bmQsIG1heWJlIHdlIGhhdmUgYSBkdWFsIFBIWT8gKi8NCisJCXByaW50ayAoS0VSTl9JTkZPIERS Vl9OQU1FICI6IG5vIFBIWSBmb3VuZCBvbiBNQUMxLCAiDQorCQkJImxldCdzIHNlZSBpZiBpdCdz IGF0dGFjaGVkIHRvIE1BQzAuLi5cbiIpOw0KKw0KKwkJQlVHX09OKCFhdV9tYWNzWzBdIHx8ICFh dV9tYWNzWzBdLT5taWlfYnVzKTsNCisNCisJCS8qIGZpbmQgdGhlIGZpcnN0IChsb3dlc3QgYWRk cmVzcykgbm9uLWF0dGFjaGVkIFBIWSBvbg0KKwkJICogdGhlIE1BQzAgTUlJIGJ1cyAqLw0KKwkJ Zm9yIChwaHlfYWRkciA9IDA7IHBoeV9hZGRyIDwgUEhZX01BWF9BRERSOyBwaHlfYWRkcisrKSB7 DQorCQkJc3RydWN0IHBoeV9kZXZpY2UgKmNvbnN0IHRtcF9waHlkZXYgPQ0KKwkJCQlhdXAtPmF1 X21hY3NbMF0tPm1paV9idXMucGh5X21hcFtwaHlfYWRkcl07DQogDQotI2lmZGVmIENPTkZJR19N SVBTX0JPU1BPUlVTDQotCS8qIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgTWljcmVsL0tl bmRpbiA1IHBvcnQgc3dpdGNoDQotCSAgIFRoZSBzZWNvbmQgTUFDIGRvZXNuJ3Qgc2VlIGEgUEhZ IGNvbm5lY3RlZC4uLiBzbyB3ZSBuZWVkIHRvDQotCSAgIHRyaWNrIGl0IGludG8gdGhpbmtpbmcg d2UgaGF2ZSBvbmUuDQotCQkNCi0JICAgSWYgdGhpcyBrZXJuZWwgaXMgcnVuIG9uIGFub3RoZXIg QXUxNTAwIGRldmVsb3BtZW50IGJvYXJkDQotCSAgIHRoZSBzdHViIHdpbGwgYmUgZm91bmQgYXMg d2VsbCBhcyB0aGUgYWN0dWFsIFBIWS4gSG93ZXZlciwNCi0JICAgdGhlIGxhc3QgZm91bmQgUEhZ IHdpbGwgYmUgdXNlZC4uLiB1c3VhbGx5IGF0IEFkZHIgMzEgKERiMTUwMCkuCQ0KLQkqLw0KLQlp ZiAoICghcGh5X2ZvdW5kKSApDQotCXsNCi0JCXUxNiBwaHlfaWQwLCBwaHlfaWQxOw0KLQkJaW50 IGk7DQorCQkJaWYgKCF0bXBfcGh5ZGV2KQ0KKwkJCQljb250aW51ZTsgLyogbm8gUEhZIGhlcmUu Li4gKi8NCiANCi0JCXBoeV9pZDAgPSAweDEyMzQ7DQotCQlwaHlfaWQxID0gMHg1Njc4Ow0KKwkJ CWlmICh0bXBfcGh5ZGV2LT5hdHRhY2hlZF9kZXYpDQorCQkJCWNvbnRpbnVlOyAvKiBhbHJlYWR5 IGNsYWltZWQgYnkgTUFDMCAqLw0KIA0KLQkJLyogc2VhcmNoIG91ciBtaWkgdGFibGUgZm9yIHRo ZSBjdXJyZW50IG1paSAqLyANCi0JCWZvciAoaSA9IDA7IG1paV9jaGlwX3RhYmxlW2ldLnBoeV9p ZDE7IGkrKykgew0KLQkJCWlmIChwaHlfaWQwID09IG1paV9jaGlwX3RhYmxlW2ldLnBoeV9pZDAg JiYNCi0JCQkgICAgcGh5X2lkMSA9PSBtaWlfY2hpcF90YWJsZVtpXS5waHlfaWQxKSB7DQotCQkJ CXN0cnVjdCBtaWlfcGh5ICogbWlpX3BoeTsNCi0NCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6 ICVzIGF0IHBoeSBhZGRyZXNzICVkXG4iLA0KLQkJCQkgICAgICAgZGV2LT5uYW1lLCBtaWlfY2hp cF90YWJsZVtpXS5uYW1lLCANCi0JCQkJICAgICAgIHBoeV9hZGRyKTsNCi0JCQkJbWlpX3BoeSA9 IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWlfcGh5KSwgDQotCQkJCQkJR0ZQX0tFUk5FTCk7DQot CQkJCWlmIChtaWlfcGh5KSB7DQotCQkJCQltaWlfcGh5LT5jaGlwX2luZm8gPSBtaWlfY2hpcF90 YWJsZStpOw0KLQkJCQkJYXVwLT5waHlfYWRkciA9IHBoeV9hZGRyOw0KLQkJCQkJbWlpX3BoeS0+ bmV4dCA9IGF1cC0+bWlpOw0KLQkJCQkJYXVwLT5waHlfb3BzID0gDQotCQkJCQkJbWlpX2NoaXBf dGFibGVbaV0ucGh5X29wczsNCi0JCQkJCWF1cC0+bWlpID0gbWlpX3BoeTsNCi0JCQkJCWF1cC0+ cGh5X29wcy0+cGh5X2luaXQoZGV2LHBoeV9hZGRyKTsNCi0JCQkJfSBlbHNlIHsNCi0JCQkJCXBy aW50ayhLRVJOX0VSUiAiJXM6IG91dCBvZiBtZW1vcnlcbiIsIA0KLQkJCQkJCQlkZXYtPm5hbWUp Ow0KLQkJCQkJcmV0dXJuIC0xOw0KLQkJCQl9DQotCQkJCW1paV9waHktPmNoaXBfaW5mbyA9IG1p aV9jaGlwX3RhYmxlK2k7DQotCQkJCWF1cC0+cGh5X2FkZHIgPSBwaHlfYWRkcjsNCi0JCQkJYXVw LT5waHlfb3BzID0gbWlpX2NoaXBfdGFibGVbaV0ucGh5X29wczsNCi0JCQkJYXVwLT5waHlfb3Bz LT5waHlfaW5pdChkZXYscGh5X2FkZHIpOw0KLQkJCQlicmVhazsNCi0JCQl9DQorCQkJcGh5ZGV2 ID0gdG1wX3BoeWRldjsNCisJCQlicmVhazsgLyogZm91bmQgaXQgKi8NCiAJCX0NCiAJfQ0KLQlp ZiAoYXVwLT5tYWNfaWQgPT0gMCkgew0KLQkJLyogdGhlIEJvc3BvcnVzIHBoeSByZXNwb25kcyB0 byBhZGRyZXNzZXMgMC01IGJ1dCANCi0JCSAqIDUgaXMgdGhlIGNvcnJlY3Qgb25lLg0KLQkJICov DQotCQlhdXAtPnBoeV9hZGRyID0gNTsNCi0JfQ0KLSNlbmRpZg0KIA0KLQlpZiAoYXVwLT5taWkt PmNoaXBfaW5mbyA9PSBOVUxMKSB7DQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBBdTF4IE5vIGtu b3duIE1JSSB0cmFuc2NlaXZlcnMgZm91bmQhXG4iLA0KLQkJCQlkZXYtPm5hbWUpOw0KKyNlbmRp Zg0KKwlpZiAoIXBoeWRldikgew0KKwkJcHJpbnRrIChLRVJOX0VSUiBEUlZfTkFNRSAiOiVzOiBu byBQSFkgZm91bmRcbiIsIGRldi0+bmFtZSk7DQogCQlyZXR1cm4gLTE7DQogCX0NCiANCi0JcHJp bnRrKEtFUk5fSU5GTyAiJXM6IFVzaW5nICVzIGFzIGRlZmF1bHRcbiIsIA0KLQkJCWRldi0+bmFt ZSwgYXVwLT5taWktPmNoaXBfaW5mby0+bmFtZSk7DQorCS8qIG5vdyB3ZSBhcmUgc3VwcG9zZWQg dG8gaGF2ZSBhIHByb3BlciBwaHlkZXYsIHRvIGF0dGFjaCB0by4uLiAqLw0KKwlCVUdfT04oIXBo eWRldik7DQorDQorCXBoeWRldiA9IHBoeV9jb25uZWN0KGRldiwgcGh5ZGV2LT5kZXYuYnVzX2lk LCAmYXUxMDAwX2FkanVzdF9saW5rLCAwKTsNCisNCisJaWYgKElTX0VSUihwaHlkZXYpKSB7DQor CQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYXR0YWNoIHRvIFBIWVxuIiwgZGV2LT5u YW1lKTsNCisJCXJldHVybiBQVFJfRVJSKHBoeWRldik7DQorCX0NCisNCisJLyogbWFzayB3aXRo IE1BQyBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8NCisJcGh5ZGV2LT5zdXBwb3J0ZWQgJj0gKFNVUFBP UlRFRF8xMGJhc2VUX0hhbGYNCisJCQkgICAgICB8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwNCisJ CQkgICAgICB8IFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmDQorCQkJICAgICAgfCBTVVBQT1JURURf MTAwYmFzZVRfRnVsbA0KKwkJCSAgICAgIHwgU1VQUE9SVEVEX0F1dG9uZWcNCisJCQkgICAgICAv KiB8IFNVUFBPUlRFRF9QYXVzZSB8IFNVUFBPUlRFRF9Bc3ltX1BhdXNlICovDQorCQkJICAgICAg fCBTVVBQT1JURURfTUlJDQorCQkJICAgICAgfCBTVVBQT1JURURfVFApOw0KKw0KKwlwaHlkZXYt PmFkdmVydGlzaW5nID0gcGh5ZGV2LT5zdXBwb3J0ZWQ7DQorDQorCWF1cC0+b2xkX2xpbmsgPSAw Ow0KKwlhdXAtPm9sZF9zcGVlZCA9IDA7DQorCWF1cC0+b2xkX2R1cGxleCA9IC0xOw0KKwlhdXAt PnBoeV9kZXYgPSBwaHlkZXY7DQorDQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBhdHRhY2hlZCBQ SFkgZHJpdmVyIFslc10gIg0KKwkgICAgICAgIihtaWlfYnVzOnBoeV9hZGRyPSVzLCBpcnE9JWQp XG4iLA0KKwkgICAgICAgZGV2LT5uYW1lLCBwaHlkZXYtPmRydi0+bmFtZSwgcGh5ZGV2LT5kZXYu YnVzX2lkLCBwaHlkZXYtPmlycSk7DQogDQogCXJldHVybiAwOw0KIH0NCkBAIC0xMDk3LDM1ICsz OTcsMzggQEANCiAJYXVfc3luY19kZWxheSgxMCk7DQogfQ0KIA0KLQ0KLXN0YXRpYyB2b2lkIHJl c2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQ0KK3N0YXRpYyB2b2lkIGVuYWJsZV9tYWMo c3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZvcmNlX3Jlc2V0KQ0KIHsNCi0JaW50IGk7DQot CXUzMiBmbGFnczsNCisJdW5zaWduZWQgbG9uZyBmbGFnczsNCiAJc3RydWN0IGF1MTAwMF9wcml2 YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsNCiANCi0JaWYg KGF1MTAwMF9kZWJ1ZyA+IDQpIA0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlc2V0IG1hYywg YXVwICV4XG4iLCANCi0JCQkJZGV2LT5uYW1lLCAodW5zaWduZWQpYXVwKTsNCi0NCiAJc3Bpbl9s b2NrX2lycXNhdmUoJmF1cC0+bG9jaywgZmxhZ3MpOw0KLQlpZiAoYXVwLT50aW1lci5mdW5jdGlv biA9PSAmYXUxMDAwX3RpbWVyKSB7LyogY2hlY2sgaWYgdGltZXIgaW5pdHRlZCAqLw0KLQkJZGVs X3RpbWVyKCZhdXAtPnRpbWVyKTsNCi0JfQ0KIA0KLQloYXJkX3N0b3AoZGV2KTsNCi0JI2lmZGVm IENPTkZJR19CQ001MjIyX0RVQUxfUEhZDQotCWlmIChhdXAtPm1hY19pZCAhPSAwKSB7DQotCSNl bmRpZg0KLQkJLyogSWYgQkNNNTIyMiwgd2UgY2FuJ3QgbGVhdmUgTUFDMCBpbiByZXNldCBiZWNh dXNlIHRoZW4gDQotCQkgKiB3ZSBjYW4ndCBhY2Nlc3MgdGhlIGR1YWwgcGh5IGZvciBFVEgxICov DQorCWlmKGZvcmNlX3Jlc2V0IHx8ICghYXVwLT5tYWNfZW5hYmxlZCkpIHsNCiAJCSphdXAtPmVu YWJsZSA9IE1BQ19FTl9DTE9DS19FTkFCTEU7DQogCQlhdV9zeW5jX2RlbGF5KDIpOw0KLQkJKmF1 cC0+ZW5hYmxlID0gMDsNCisJCSphdXAtPmVuYWJsZSA9IChNQUNfRU5fUkVTRVQwIHwgTUFDX0VO X1JFU0VUMSB8IE1BQ19FTl9SRVNFVDINCisJCQkJfCBNQUNfRU5fQ0xPQ0tfRU5BQkxFKTsNCiAJ CWF1X3N5bmNfZGVsYXkoMik7DQotCSNpZmRlZiBDT05GSUdfQkNNNTIyMl9EVUFMX1BIWQ0KKw0K KwkJYXVwLT5tYWNfZW5hYmxlZCA9IDE7DQogCX0NCi0JI2VuZGlmDQorDQorCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJmF1cC0+bG9jaywgZmxhZ3MpOw0KK30NCisNCitzdGF0aWMgdm9pZCByZXNl dF9tYWNfdW5sb2NrZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikNCit7DQorCXN0cnVjdCBhdTEw MDBfcHJpdmF0ZSAqY29uc3QgYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnBy aXY7DQorCWludCBpOw0KKw0KKwloYXJkX3N0b3AoZGV2KTsNCisNCisJKmF1cC0+ZW5hYmxlID0g TUFDX0VOX0NMT0NLX0VOQUJMRTsNCisJYXVfc3luY19kZWxheSgyKTsNCisJKmF1cC0+ZW5hYmxl ID0gMDsNCisJYXVfc3luY19kZWxheSgyKTsNCisNCiAJYXVwLT50eF9mdWxsID0gMDsNCiAJZm9y IChpID0gMDsgaSA8IE5VTV9SWF9ETUE7IGkrKykgew0KIAkJLyogcmVzZXQgY29udHJvbCBiaXRz ICovDQpAQCAtMTEzNSw5ICs0MzgsMjYgQEANCiAJCS8qIHJlc2V0IGNvbnRyb2wgYml0cyAqLw0K IAkJYXVwLT50eF9kbWFfcmluZ1tpXS0+YnVmZl9zdGF0ICY9IH4weGY7DQogCX0NCi0Jc3Bpbl91 bmxvY2tfaXJxcmVzdG9yZSgmYXVwLT5sb2NrLCBmbGFncyk7DQorDQorCWF1cC0+bWFjX2VuYWJs ZWQgPSAwOw0KKw0KIH0NCiANCitzdGF0aWMgdm9pZCByZXNldF9tYWMoc3RydWN0IG5ldF9kZXZp Y2UgKmRldikNCit7DQorCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqY29uc3QgYXVwID0gKHN0cnVj dCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7DQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQor DQorCWlmIChhdTEwMDBfZGVidWcgPiA0KQ0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlc2V0 IG1hYywgYXVwICV4XG4iLA0KKwkJICAgICAgIGRldi0+bmFtZSwgKHVuc2lnbmVkKWF1cCk7DQor DQorCXNwaW5fbG9ja19pcnFzYXZlKCZhdXAtPmxvY2ssIGZsYWdzKTsNCisNCisJcmVzZXRfbWFj X3VubG9ja2VkIChkZXYpOw0KKw0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdXAtPmxvY2ss IGZsYWdzKTsNCit9DQogDQogLyogDQogICogU2V0dXAgdGhlIHJlY2VpdmUgYW5kIHRyYW5zbWl0 ICJyaW5ncyIuICBUaGVzZSBwb2ludGVycyBhcmUgdGhlIGFkZHJlc3Nlcw0KQEAgLTEyMzcsMTc4 ICs1NTcsMzEgQEANCiAJcmV0dXJuIDA7DQogfQ0KIA0KLXN0YXRpYyBpbnQgYXUxMDAwX3NldHVw X2FuZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGFkdmVydGlzZSkNCi17DQotCXN0cnVj dCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKWRldi0+cHJp djsNCi0JdTE2IGN0bCwgYWR2Ow0KLQ0KLQkvKiBTZXR1cCBzdGFuZGFyZCBhZHZlcnRpc2UgKi8N Ci0JYWR2ID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX0FEVkVSVElTRSk7DQot CWFkdiAmPSB+KEFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfMTAwQkFTRTQpOw0KLQlpZiAoYWR2 ZXJ0aXNlICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpDQotCQlhZHYgfD0gQURWRVJUSVNFXzEw SEFMRjsNCi0JaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKQ0KLQkJYWR2 IHw9IEFEVkVSVElTRV8xMEZVTEw7DQotCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMGJh c2VUX0hhbGYpDQotCQlhZHYgfD0gQURWRVJUSVNFXzEwMEhBTEY7DQotCWlmIChhZHZlcnRpc2Ug JiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpDQotCQlhZHYgfD0gQURWRVJUSVNFXzEwMEZVTEw7 DQotCW1kaW9fd3JpdGUoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQURWRVJUSVNFLCBhZHYpOw0K LQ0KLQkvKiBTdGFydC9SZXN0YXJ0IGFuZWcgKi8NCi0JY3RsID0gbWRpb19yZWFkKGRldiwgYXVw LT5waHlfYWRkciwgTUlJX0JNQ1IpOw0KLQljdGwgfD0gKEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FO UkVTVEFSVCk7DQotCW1kaW9fd3JpdGUoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQk1DUiwgY3Rs KTsNCi0NCi0JcmV0dXJuIDA7DQotfQ0KLQ0KLXN0YXRpYyBpbnQgYXUxMDAwX3NldHVwX2ZvcmNl ZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3BlZWQsIGludCBmZCkNCi17DQotCXN0cnVj dCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKWRldi0+cHJp djsNCi0JdTE2IGN0bDsNCi0NCi0JY3RsID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwg TUlJX0JNQ1IpOw0KLQljdGwgJj0gfihCTUNSX0ZVTExEUExYIHwgQk1DUl9TUEVFRDEwMCB8IEJN Q1JfQU5FTkFCTEUpOw0KLQ0KLQkvKiBGaXJzdCByZXNldCB0aGUgUEhZICovDQotCW1kaW9fd3Jp dGUoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQk1DUiwgY3RsIHwgQk1DUl9SRVNFVCk7DQotDQot CS8qIFNlbGVjdCBzcGVlZCAmIGR1cGxleCAqLw0KLQlzd2l0Y2ggKHNwZWVkKSB7DQotCQljYXNl IFNQRUVEXzEwOg0KLQkJCWJyZWFrOw0KLQkJY2FzZSBTUEVFRF8xMDA6DQotCQkJY3RsIHw9IEJN Q1JfU1BFRUQxMDA7DQotCQkJYnJlYWs7DQotCQljYXNlIFNQRUVEXzEwMDA6DQotCQlkZWZhdWx0 Og0KLQkJCXJldHVybiAtRUlOVkFMOw0KLQl9DQotCWlmIChmZCA9PSBEVVBMRVhfRlVMTCkNCi0J CWN0bCB8PSBCTUNSX0ZVTExEUExYOw0KLQltZGlvX3dyaXRlKGRldiwgYXVwLT5waHlfYWRkciwg TUlJX0JNQ1IsIGN0bCk7DQotDQotCXJldHVybiAwOw0KLX0NCi0NCi0NCi1zdGF0aWMgdm9pZA0K LWF1MTAwMF9zdGFydF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29s X2NtZCAqY21kKQ0KLXsNCi0Jc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1 MTAwMF9wcml2YXRlICopZGV2LT5wcml2Ow0KLQl1MzIgYWR2ZXJ0aXNlOw0KLQlpbnQgYXV0b25l ZzsNCi0JaW50IGZvcmNlZF9zcGVlZDsNCi0JaW50IGZvcmNlZF9kdXBsZXg7DQotDQotCS8qIERl ZmF1bHQgYWR2ZXJ0aXNlICovDQotCWFkdmVydGlzZSA9IEdFTk1JSV9ERUZBVUxUX0FEVkVSVElT RTsNCi0JYXV0b25lZyA9IGF1cC0+d2FudF9hdXRvbmVnOw0KLQlmb3JjZWRfc3BlZWQgPSBTUEVF RF8xMDA7DQotCWZvcmNlZF9kdXBsZXggPSBEVVBMRVhfRlVMTDsNCi0NCi0JLyogU2V0dXAgbGlu ayBwYXJhbWV0ZXJzICovDQotCWlmIChjbWQpIHsNCi0JCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVU T05FR19FTkFCTEUpIHsNCi0JCQlhZHZlcnRpc2UgPSBjbWQtPmFkdmVydGlzaW5nOw0KLQkJCWF1 dG9uZWcgPSAxOw0KLQkJfSBlbHNlIHsNCi0JCQlhdXRvbmVnID0gMDsNCi0NCi0JCQlmb3JjZWRf c3BlZWQgPSBjbWQtPnNwZWVkOw0KLQkJCWZvcmNlZF9kdXBsZXggPSBjbWQtPmR1cGxleDsNCi0J CX0NCi0JfQ0KLQ0KLQkvKiBDb25maWd1cmUgUEhZICYgc3RhcnQgYW5lZyAqLw0KLQlhdXAtPndh bnRfYXV0b25lZyA9IGF1dG9uZWc7DQotCWlmIChhdXRvbmVnKQ0KLQkJYXUxMDAwX3NldHVwX2Fu ZWcoZGV2LCBhZHZlcnRpc2UpOw0KLQllbHNlDQotCQlhdTEwMDBfc2V0dXBfZm9yY2VkKGRldiwg Zm9yY2VkX3NwZWVkLCBmb3JjZWRfZHVwbGV4KTsNCi0JbW9kX3RpbWVyKCZhdXAtPnRpbWVyLCBq aWZmaWVzICsgSFopOw0KLX0NCisvKg0KKyAqIGV0aHRvb2wgb3BlcmF0aW9ucw0KKyAqLw0KIA0K IHN0YXRpYyBpbnQgYXUxMDAwX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBz dHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkNCiB7DQogCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVw ID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKWRldi0+cHJpdjsNCi0JdTE2IGxpbmssIHNwZWVk Ow0KIA0KLQljbWQtPnN1cHBvcnRlZCA9IEdFTk1JSV9ERUZBVUxUX0ZFQVRVUkVTOw0KLQljbWQt PmFkdmVydGlzaW5nID0gR0VOTUlJX0RFRkFVTFRfQURWRVJUSVNFOw0KLQljbWQtPnBvcnQgPSBQ T1JUX01JSTsNCi0JY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7DQotCWNtZC0+cGh5 X2FkZHJlc3MgPSBhdXAtPnBoeV9hZGRyOw0KLQlzcGluX2xvY2tfaXJxKCZhdXAtPmxvY2spOw0K LQljbWQtPmF1dG9uZWcgPSBhdXAtPndhbnRfYXV0b25lZzsNCi0JYXVwLT5waHlfb3BzLT5waHlf c3RhdHVzKGRldiwgYXVwLT5waHlfYWRkciwgJmxpbmssICZzcGVlZCk7DQotCWlmICgoc3BlZWQg PT0gSUZfUE9SVF8xMDBCQVNFVFgpIHx8IChzcGVlZCA9PSBJRl9QT1JUXzEwMEJBU0VGWCkpDQot CQljbWQtPnNwZWVkID0gU1BFRURfMTAwOw0KLQllbHNlIGlmIChzcGVlZCA9PSBJRl9QT1JUXzEw QkFTRVQpDQotCQljbWQtPnNwZWVkID0gU1BFRURfMTA7DQotCWlmIChsaW5rICYmIChkZXYtPmlm X3BvcnQgPT0gSUZfUE9SVF8xMDBCQVNFRlgpKQ0KLQkJY21kLT5kdXBsZXggPSBEVVBMRVhfRlVM TDsNCi0JZWxzZQ0KLQkJY21kLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsNCi0Jc3Bpbl91bmxvY2tf aXJxKCZhdXAtPmxvY2spOw0KLQlyZXR1cm4gMDsNCisJaWYgKGF1cC0+cGh5X2RldikNCisJCXJl dHVybiBwaHlfZXRodG9vbF9nc2V0KGF1cC0+cGh5X2RldiwgY21kKTsNCisNCisJcmV0dXJuIC1F SU5WQUw7DQogfQ0KIA0KIHN0YXRpYyBpbnQgYXUxMDAwX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0 X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkNCiB7DQotCSBzdHJ1Y3QgYXUx MDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKilkZXYtPnByaXY7DQot CSAgdW5zaWduZWQgbG9uZyBmZWF0dXJlcyA9IEdFTk1JSV9ERUZBVUxUX0ZFQVRVUkVTOw0KKwlz dHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKilkZXYt PnByaXY7DQogDQotCSBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpDQotCQkgcmV0dXJuIC1F UEVSTTsNCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQ0KKwkJcmV0dXJuIC1FUEVSTTsN CiANCi0JIGlmIChjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19FTkFCTEUgJiYgY21kLT5hdXRvbmVn ICE9IEFVVE9ORUdfRElTQUJMRSkNCi0JCSByZXR1cm4gLUVJTlZBTDsNCi0JIGlmIChjbWQtPmF1 dG9uZWcgPT0gQVVUT05FR19FTkFCTEUgJiYgY21kLT5hZHZlcnRpc2luZyA9PSAwKQ0KLQkJIHJl dHVybiAtRUlOVkFMOw0KLQkgaWYgKGNtZC0+ZHVwbGV4ICE9IERVUExFWF9IQUxGICYmIGNtZC0+ ZHVwbGV4ICE9IERVUExFWF9GVUxMKQ0KLQkJIHJldHVybiAtRUlOVkFMOw0KLQkgaWYgKGNtZC0+ YXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUpDQotCQkgc3dpdGNoIChjbWQtPnNwZWVkKSB7DQot CQkgY2FzZSBTUEVFRF8xMDoNCi0JCQkgaWYgKGNtZC0+ZHVwbGV4ID09IERVUExFWF9IQUxGICYm DQotCQkJCSAoZmVhdHVyZXMgJiBTVVBQT1JURURfMTBiYXNlVF9IYWxmKSA9PSAwKQ0KLQkJCQkg cmV0dXJuIC1FSU5WQUw7DQotCQkJIGlmIChjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCAmJg0K LQkJCQkgKGZlYXR1cmVzICYgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCkgPT0gMCkNCi0JCQkJIHJl dHVybiAtRUlOVkFMOw0KLQkJCSBicmVhazsNCi0JCSBjYXNlIFNQRUVEXzEwMDoNCi0JCQkgaWYg KGNtZC0+ZHVwbGV4ID09IERVUExFWF9IQUxGICYmDQotCQkJCSAoZmVhdHVyZXMgJiBTVVBQT1JU RURfMTAwYmFzZVRfSGFsZikgPT0gMCkNCi0JCQkJIHJldHVybiAtRUlOVkFMOw0KLQkJCSBpZiAo Y21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwgJiYNCi0JCQkJIChmZWF0dXJlcyAmIFNVUFBPUlRF RF8xMDBiYXNlVF9GdWxsKSA9PSAwKQ0KLQkJCQkgcmV0dXJuIC1FSU5WQUw7DQotCQkJIGJyZWFr Ow0KLQkJIGRlZmF1bHQ6DQotCQkJIHJldHVybiAtRUlOVkFMOw0KLQkJIH0NCi0JIGVsc2UgaWYg KChmZWF0dXJlcyAmIFNVUFBPUlRFRF9BdXRvbmVnKSA9PSAwKQ0KLQkJIHJldHVybiAtRUlOVkFM Ow0KLQ0KLQkgc3Bpbl9sb2NrX2lycSgmYXVwLT5sb2NrKTsNCi0JIGF1MTAwMF9zdGFydF9saW5r KGRldiwgY21kKTsNCi0JIHNwaW5fdW5sb2NrX2lycSgmYXVwLT5sb2NrKTsNCi0JIHJldHVybiAw Ow0KLX0NCisJaWYgKGF1cC0+cGh5X2RldikNCisJCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KGF1 cC0+cGh5X2RldiwgY21kKTsNCiANCi1zdGF0aWMgaW50IGF1MTAwMF9ud2F5X3Jlc2V0KHN0cnVj dCBuZXRfZGV2aWNlICpkZXYpDQotew0KLQlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChz dHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKilkZXYtPnByaXY7DQotDQotCWlmICghYXVwLT53YW50X2F1 dG9uZWcpDQotCQlyZXR1cm4gLUVJTlZBTDsNCi0Jc3Bpbl9sb2NrX2lycSgmYXVwLT5sb2NrKTsN Ci0JYXUxMDAwX3N0YXJ0X2xpbmsoZGV2LCBOVUxMKTsNCi0Jc3Bpbl91bmxvY2tfaXJxKCZhdXAt PmxvY2spOw0KLQlyZXR1cm4gMDsNCisJcmV0dXJuIC1FSU5WQUw7DQogfQ0KIA0KIHN0YXRpYyB2 b2lkDQpAQCAtMTQyMywxOSArNTk2LDE1IEBADQogCWluZm8tPnJlZ2R1bXBfbGVuID0gMDsNCiB9 DQogDQotc3RhdGljIHUzMiBhdTEwMDBfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikN Ci17DQotCXJldHVybiBuZXRpZl9jYXJyaWVyX29rKGRldik7DQotfQ0KLQ0KIHN0YXRpYyBzdHJ1 Y3QgZXRodG9vbF9vcHMgYXUxMDAwX2V0aHRvb2xfb3BzID0gew0KIAkuZ2V0X3NldHRpbmdzID0g YXUxMDAwX2dldF9zZXR0aW5ncywNCiAJLnNldF9zZXR0aW5ncyA9IGF1MTAwMF9zZXRfc2V0dGlu Z3MsDQogCS5nZXRfZHJ2aW5mbyA9IGF1MTAwMF9nZXRfZHJ2aW5mbywNCi0JLm53YXlfcmVzZXQg PSBhdTEwMDBfbndheV9yZXNldCwNCi0JLmdldF9saW5rID0gYXUxMDAwX2dldF9saW5rDQorCS5n ZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssDQogfTsNCiANCisNCisNCiBzdGF0aWMgc3Ry dWN0IG5ldF9kZXZpY2UgKg0KIGF1MTAwMF9wcm9iZSh1MzIgaW9hZGRyLCBpbnQgaXJxLCBpbnQg cG9ydF9udW0pDQogew0KQEAgLTE1MjcsMjQgKzY5NiwyMiBAQA0KIAkJcHJpbnRrKEtFUk5fRVJS ICIlczogYmFkIGlvYWRkclxuIiwgZGV2LT5uYW1lKTsNCiAJfQ0KIA0KLQkvKiBicmluZyB0aGUg ZGV2aWNlIG91dCBvZiByZXNldCwgb3RoZXJ3aXNlIHByb2JpbmcgdGhlIG1paQ0KLQkgKiB3aWxs IGhhbmcgKi8NCi0JKmF1cC0+ZW5hYmxlID0gTUFDX0VOX0NMT0NLX0VOQUJMRTsNCi0JYXVfc3lu Y19kZWxheSgyKTsNCi0JKmF1cC0+ZW5hYmxlID0gTUFDX0VOX1JFU0VUMCB8IE1BQ19FTl9SRVNF VDEgfCANCi0JCU1BQ19FTl9SRVNFVDIgfCBNQUNfRU5fQ0xPQ0tfRU5BQkxFOw0KLQlhdV9zeW5j X2RlbGF5KDIpOw0KKwkqYXVwLT5lbmFibGUgPSAwOw0KKwlhdXAtPm1hY19lbmFibGVkID0gMDsN CiANCi0JYXVwLT5taWkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlpX3BoeSksIEdGUF9LRVJO RUwpOw0KLQlpZiAoIWF1cC0+bWlpKSB7DQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvdXQgb2Yg bWVtb3J5XG4iLCBkZXYtPm5hbWUpOw0KLQkJZ290byBlcnJfb3V0Ow0KKwlhdXAtPm1paV9idXMu cHJpdiA9IGRldjsNCisJYXVwLT5taWlfYnVzLnJlYWQgPSBtZGlvYnVzX3JlYWQ7DQorCWF1cC0+ bWlpX2J1cy53cml0ZSA9IG1kaW9idXNfd3JpdGU7DQorCWF1cC0+bWlpX2J1cy5yZXNldCA9IG1k aW9idXNfcmVzZXQ7DQorCWF1cC0+bWlpX2J1cy5uYW1lID0gImF1MTAwMF9ldGhfbWlpIjsNCisJ YXVwLT5taWlfYnVzLmlkID0gYXVwLT5tYWNfaWQ7DQorCWF1cC0+bWlpX2J1cy5pcnEgPSBrbWFs bG9jKHNpemVvZihpbnQpKlBIWV9NQVhfQUREUiwgR0ZQX0tFUk5FTCk7DQorCWZvcihpID0gMDsg aSA8IFBIWV9NQVhfQUREUjsgKytpKSB7DQorCQlhdXAtPm1paV9idXMucGh5X21hcFtpXSA9IE5V TEw7IC8qIHBhcmFub2lhICovDQorCQlhdXAtPm1paV9idXMuaXJxW2ldID0gUEhZX1BPTEw7DQog CX0NCi0JYXVwLT5taWktPm5leHQgPSBOVUxMOw0KLQlhdXAtPm1paS0+Y2hpcF9pbmZvID0gTlVM TDsNCi0JYXVwLT5taWktPnN0YXR1cyA9IDA7DQotCWF1cC0+bWlpLT5taWlfY29udHJvbF9yZWcg PSAwOw0KLQlhdXAtPm1paS0+bWlpX2RhdGFfcmVnID0gMDsNCisNCisJbWRpb2J1c19yZWdpc3Rl cigmYXVwLT5taWlfYnVzKTsNCiANCiAJaWYgKG1paV9wcm9iZShkZXYpICE9IDApIHsNCiAJCWdv dG8gZXJyX291dDsNCkBAIC0xNTkwLDcgKzc1Nyw2IEBADQogCWRldi0+c2V0X211bHRpY2FzdF9s aXN0ID0gJnNldF9yeF9tb2RlOw0KIAlkZXYtPmRvX2lvY3RsID0gJmF1MTAwMF9pb2N0bDsNCiAJ U0VUX0VUSFRPT0xfT1BTKGRldiwgJmF1MTAwMF9ldGh0b29sX29wcyk7DQotCWRldi0+c2V0X2Nv bmZpZyA9ICZhdTEwMDBfc2V0X2NvbmZpZzsNCiAJZGV2LT50eF90aW1lb3V0ID0gYXUxMDAwX3R4 X3RpbWVvdXQ7DQogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBFVEhfVFhfVElNRU9VVDsNCiANCkBA IC0xNjA2LDcgKzc3Miw3IEBADQogCS8qIGhlcmUgd2Ugc2hvdWxkIGhhdmUgYSB2YWxpZCBkZXYg cGx1cyBhdXAtPiByZWdpc3RlciBhZGRyZXNzZXMNCiAJICogc28gd2UgY2FuIHJlc2V0IHRoZSBt YWMgcHJvcGVybHkuKi8NCiAJcmVzZXRfbWFjKGRldik7DQotCWtmcmVlKGF1cC0+bWlpKTsNCisN CiAJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9ETUE7IGkrKykgew0KIAkJaWYgKGF1cC0+cnhfZGJf aW51c2VbaV0pDQogCQkJUmVsZWFzZURCKGF1cCwgYXVwLT5yeF9kYl9pbnVzZVtpXSk7DQpAQCAt MTY0MCwxOSArODA2LDE0IEBADQogCXUzMiBmbGFnczsNCiAJaW50IGk7DQogCXUzMiBjb250cm9s Ow0KLQl1MTYgbGluaywgc3BlZWQ7DQogDQogCWlmIChhdTEwMDBfZGVidWcgPiA0KSANCiAJCXBy aW50aygiJXM6IGF1MTAwMF9pbml0XG4iLCBkZXYtPm5hbWUpOw0KIA0KLQlzcGluX2xvY2tfaXJx c2F2ZSgmYXVwLT5sb2NrLCBmbGFncyk7DQotDQogCS8qIGJyaW5nIHRoZSBkZXZpY2Ugb3V0IG9m IHJlc2V0ICovDQotCSphdXAtPmVuYWJsZSA9IE1BQ19FTl9DTE9DS19FTkFCTEU7DQotICAgICAg ICBhdV9zeW5jX2RlbGF5KDIpOw0KLQkqYXVwLT5lbmFibGUgPSBNQUNfRU5fUkVTRVQwIHwgTUFD X0VOX1JFU0VUMSB8IA0KLQkJTUFDX0VOX1JFU0VUMiB8IE1BQ19FTl9DTE9DS19FTkFCTEU7DQot CWF1X3N5bmNfZGVsYXkoMjApOw0KKwllbmFibGVfbWFjKGRldiwgMSk7DQorDQorCXNwaW5fbG9j a19pcnFzYXZlKCZhdXAtPmxvY2ssIGZsYWdzKTsNCiANCiAJYXVwLT5tYWMtPmNvbnRyb2wgPSAw Ow0KIAlhdXAtPnR4X2hlYWQgPSAoYXVwLT50eF9kbWFfcmluZ1swXS0+YnVmZl9zdGF0ICYgMHhD KSA+PiAyOw0KQEAgLTE2NjgsMTIgKzgyOSwxNiBAQA0KIAl9DQogCWF1X3N5bmMoKTsNCiANCi0J YXVwLT5waHlfb3BzLT5waHlfc3RhdHVzKGRldiwgYXVwLT5waHlfYWRkciwgJmxpbmssICZzcGVl ZCk7DQotCWNvbnRyb2wgPSBNQUNfRElTQUJMRV9SWF9PV04gfCBNQUNfUlhfRU5BQkxFIHwgTUFD X1RYX0VOQUJMRTsNCisJY29udHJvbCA9IE1BQ19SWF9FTkFCTEUgfCBNQUNfVFhfRU5BQkxFOw0K ICNpZm5kZWYgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFODQogCWNvbnRyb2wgfD0gTUFDX0JJR19F TkRJQU47DQogI2VuZGlmDQotCWlmIChsaW5rICYmIChkZXYtPmlmX3BvcnQgPT0gSUZfUE9SVF8x MDBCQVNFRlgpKSB7DQorCWlmIChhdXAtPnBoeV9kZXYpIHsNCisJCWlmIChhdXAtPnBoeV9kZXYt PmxpbmsgJiYgKERVUExFWF9GVUxMID09IGF1cC0+cGh5X2Rldi0+ZHVwbGV4KSkNCisJCQljb250 cm9sIHw9IE1BQ19GVUxMX0RVUExFWDsNCisJCWVsc2UNCisJCQljb250cm9sIHw9IE1BQ19ESVNB QkxFX1JYX09XTjsNCisJfSBlbHNlIHsgLyogUEhZLWxlc3Mgb3AsIGFzc3VtZSBmdWxsLWR1cGxl eCAqLw0KIAkJY29udHJvbCB8PSBNQUNfRlVMTF9EVVBMRVg7DQogCX0NCiANCkBAIC0xNjg1LDU3 ICs4NTAsODQgQEANCiAJcmV0dXJuIDA7DQogfQ0KIA0KLXN0YXRpYyB2b2lkIGF1MTAwMF90aW1l cih1bnNpZ25lZCBsb25nIGRhdGEpDQorc3RhdGljIHZvaWQNCithdTEwMDBfYWRqdXN0X2xpbmso c3RydWN0IG5ldF9kZXZpY2UgKmRldikNCiB7DQotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAo c3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOw0KIAlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9 IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2Ow0KLQl1bnNpZ25lZCBjaGFyIGlm X3BvcnQ7DQotCXUxNiBsaW5rLCBzcGVlZDsNCisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9 IGF1cC0+cGh5X2RldjsNCisJdW5zaWduZWQgbG9uZyBmbGFnczsNCiANCi0JaWYgKCFkZXYpIHsN Ci0JCS8qIGZhdGFsIGVycm9yLCBkb24ndCByZXN0YXJ0IHRoZSB0aW1lciAqLw0KLQkJcHJpbnRr KEtFUk5fRVJSICJhdTEwMDBfdGltZXIgZXJyb3I6IE5VTEwgZGV2XG4iKTsNCi0JCXJldHVybjsN Ci0JfQ0KKwlpbnQgc3RhdHVzX2NoYW5nZSA9IDA7DQogDQotCWlmX3BvcnQgPSBkZXYtPmlmX3Bv cnQ7DQotCWlmIChhdXAtPnBoeV9vcHMtPnBoeV9zdGF0dXMoZGV2LCBhdXAtPnBoeV9hZGRyLCAm bGluaywgJnNwZWVkKSA9PSAwKSB7DQotCQlpZiAobGluaykgew0KLQkJCWlmICghbmV0aWZfY2Fy cmllcl9vayhkZXYpKSB7DQotCQkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsNCi0JCQkJcHJpbnRr KEtFUk5fSU5GTyAiJXM6IGxpbmsgdXBcbiIsIGRldi0+bmFtZSk7DQotCQkJfQ0KLQkJfQ0KLQkJ ZWxzZSB7DQotCQkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgew0KLQkJCQluZXRpZl9jYXJy aWVyX29mZihkZXYpOw0KLQkJCQlkZXYtPmlmX3BvcnQgPSAwOw0KLQkJCQlwcmludGsoS0VSTl9J TkZPICIlczogbGluayBkb3duXG4iLCBkZXYtPm5hbWUpOw0KLQkJCX0NCisJQlVHX09OKCFhdXAt PnBoeV9kZXYpOw0KKw0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXVwLT5sb2NrLCBmbGFncyk7DQor DQorCWlmIChwaHlkZXYtPmxpbmsgJiYgKGF1cC0+b2xkX3NwZWVkICE9IHBoeWRldi0+c3BlZWQp KSB7DQorCQkvLyBzcGVlZCBjaGFuZ2VkDQorDQorCQlzd2l0Y2gocGh5ZGV2LT5zcGVlZCkgew0K KwkJY2FzZSBTUEVFRF8xMDoNCisJCWNhc2UgU1BFRURfMTAwOg0KKwkJCWJyZWFrOw0KKwkJZGVm YXVsdDoNCisJCQlwcmludGsoS0VSTl9XQVJOSU5HDQorCQkJICAgICAgICIlczogU3BlZWQgKCVk KSBpcyBub3QgMTAvMTAwID8/P1xuIiwNCisJCQkgICAgICAgZGV2LT5uYW1lLCBwaHlkZXYtPnNw ZWVkKTsNCisJCQlicmVhazsNCiAJCX0NCisNCisJCWF1cC0+b2xkX3NwZWVkID0gcGh5ZGV2LT5z cGVlZDsNCisNCisJCXN0YXR1c19jaGFuZ2UgPSAxOw0KIAl9DQogDQotCWlmIChsaW5rICYmIChk ZXYtPmlmX3BvcnQgIT0gaWZfcG9ydCkgJiYgDQotCQkJKGRldi0+aWZfcG9ydCAhPSBJRl9QT1JU X1VOS05PV04pKSB7DQorCWlmIChwaHlkZXYtPmxpbmsgJiYgKGF1cC0+b2xkX2R1cGxleCAhPSBw aHlkZXYtPmR1cGxleCkpIHsNCisJCS8vIGR1cGxleCBtb2RlIGNoYW5nZWQNCisNCisJCS8qIHN3 aXRjaGluZyBkdXBsZXggbW9kZSByZXF1aXJlcyB0byBkaXNhYmxlIHJ4IGFuZCB0eCEgKi8NCiAJ CWhhcmRfc3RvcChkZXYpOw0KLQkJaWYgKGRldi0+aWZfcG9ydCA9PSBJRl9QT1JUXzEwMEJBU0VG WCkgew0KLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBnb2luZyB0byBmdWxsIGR1cGxleFxuIiwg DQotCQkJCQlkZXYtPm5hbWUpOw0KLQkJCWF1cC0+bWFjLT5jb250cm9sIHw9IE1BQ19GVUxMX0RV UExFWDsNCi0JCQlhdV9zeW5jX2RlbGF5KDEpOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJYXVwLT5t YWMtPmNvbnRyb2wgJj0gfk1BQ19GVUxMX0RVUExFWDsNCi0JCQlhdV9zeW5jX2RlbGF5KDEpOw0K LQkJfQ0KKw0KKwkJaWYgKERVUExFWF9GVUxMID09IHBoeWRldi0+ZHVwbGV4KQ0KKwkJCWF1cC0+ bWFjLT5jb250cm9sID0gKChhdXAtPm1hYy0+Y29udHJvbA0KKwkJCQkJICAgICB8IE1BQ19GVUxM X0RVUExFWCkNCisJCQkJCSAgICAgJiB+TUFDX0RJU0FCTEVfUlhfT1dOKTsNCisJCWVsc2UNCisJ CQlhdXAtPm1hYy0+Y29udHJvbCA9ICgoYXVwLT5tYWMtPmNvbnRyb2wNCisJCQkJCSAgICAgICYg fk1BQ19GVUxMX0RVUExFWCkNCisJCQkJCSAgICAgfCBNQUNfRElTQUJMRV9SWF9PV04pOw0KKwkJ YXVfc3luY19kZWxheSgxKTsNCisNCiAJCWVuYWJsZV9yeF90eChkZXYpOw0KKwkJYXVwLT5vbGRf ZHVwbGV4ID0gcGh5ZGV2LT5kdXBsZXg7DQorDQorCQlzdGF0dXNfY2hhbmdlID0gMTsNCisJfQ0K Kw0KKwlpZihwaHlkZXYtPmxpbmsgIT0gYXVwLT5vbGRfbGluaykgew0KKwkJLy8gbGluayBzdGF0 ZSBjaGFuZ2VkDQorDQorCQlpZiAocGh5ZGV2LT5saW5rKSAvLyBsaW5rIHdlbnQgdXANCisJCQlu ZXRpZl9zY2hlZHVsZShkZXYpOw0KKwkJZWxzZSB7IC8vIGxpbmsgd2VudCBkb3duDQorCQkJYXVw LT5vbGRfc3BlZWQgPSAwOw0KKwkJCWF1cC0+b2xkX2R1cGxleCA9IC0xOw0KKwkJfQ0KKw0KKwkJ YXVwLT5vbGRfbGluayA9IHBoeWRldi0+bGluazsNCisJCXN0YXR1c19jaGFuZ2UgPSAxOw0KIAl9 DQogDQotCWF1cC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVCgoMSpIWikpOyANCi0JYXVwLT50aW1l ci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2Ow0KLQlhdXAtPnRpbWVyLmZ1bmN0aW9uID0gJmF1 MTAwMF90aW1lcjsgLyogdGltZXIgaGFuZGxlciAqLw0KLQlhZGRfdGltZXIoJmF1cC0+dGltZXIp Ow0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdXAtPmxvY2ssIGZsYWdzKTsNCiANCisJaWYg KHN0YXR1c19jaGFuZ2UpIHsNCisJCWlmIChwaHlkZXYtPmxpbmspDQorCQkJcHJpbnRrKEtFUk5f SU5GTyAiJXM6IGxpbmsgdXAgKCVkLyVzKVxuIiwNCisJCQkgICAgICAgZGV2LT5uYW1lLCBwaHlk ZXYtPnNwZWVkLA0KKwkJCSAgICAgICBEVVBMRVhfRlVMTCA9PSBwaHlkZXYtPmR1cGxleCA/ICJG dWxsIiA6ICJIYWxmIik7DQorCQllbHNlDQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsg ZG93blxuIiwgZGV2LT5uYW1lKTsNCisJfQ0KIH0NCiANCiBzdGF0aWMgaW50IGF1MTAwMF9vcGVu KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpDQpAQCAtMTc0NiwyNSArOTM4LDI2IEBADQogCWlmIChh dTEwMDBfZGVidWcgPiA0KQ0KIAkJcHJpbnRrKCIlczogb3BlbjogZGV2PSVwXG4iLCBkZXYtPm5h bWUsIGRldik7DQogDQorCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZhdTEw MDBfaW50ZXJydXB0LCAwLA0KKwkJCQkJZGV2LT5uYW1lLCBkZXYpKSkgew0KKwkJcHJpbnRrKEtF Uk5fRVJSICIlczogdW5hYmxlIHRvIGdldCBJUlEgJWRcbiIsDQorCQkJCWRldi0+bmFtZSwgZGV2 LT5pcnEpOw0KKwkJcmV0dXJuIHJldHZhbDsNCisJfQ0KKw0KIAlpZiAoKHJldHZhbCA9IGF1MTAw MF9pbml0KGRldikpKSB7DQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciBpbiBhdTEwMDBf aW5pdFxuIiwgZGV2LT5uYW1lKTsNCiAJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOw0KIAkJcmV0 dXJuIHJldHZhbDsNCiAJfQ0KLQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOw0KIA0KLQlpZiAoKHJl dHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmYXUxMDAwX2ludGVycnVwdCwgMCwgDQotCQkJ CQlkZXYtPm5hbWUsIGRldikpKSB7DQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8g Z2V0IElSUSAlZFxuIiwgDQotCQkJCWRldi0+bmFtZSwgZGV2LT5pcnEpOw0KLQkJcmV0dXJuIHJl dHZhbDsNCisJaWYgKGF1cC0+cGh5X2Rldikgew0KKwkJLyogY2F1c2UgdGhlIFBIWSBzdGF0ZSBt YWNoaW5lIHRvIHNjaGVkdWxlIGEgbGluayBzdGF0ZSBjaGVjayAqLw0KKwkJYXVwLT5waHlfZGV2 LT5zdGF0ZSA9IFBIWV9DSEFOR0VMSU5LOw0KKwkJcGh5X3N0YXJ0KGF1cC0+cGh5X2Rldik7DQog CX0NCiANCi0JaW5pdF90aW1lcigmYXVwLT50aW1lcik7IC8qIHVzZWQgaW4gaW9jdGwoKSAqLw0K LQlhdXAtPnRpbWVyLmV4cGlyZXMgPSBSVU5fQVQoKDMqSFopKTsgDQotCWF1cC0+dGltZXIuZGF0 YSA9ICh1bnNpZ25lZCBsb25nKWRldjsNCi0JYXVwLT50aW1lci5mdW5jdGlvbiA9ICZhdTEwMDBf dGltZXI7IC8qIHRpbWVyIGhhbmRsZXIgKi8NCi0JYWRkX3RpbWVyKCZhdXAtPnRpbWVyKTsNCisJ bmV0aWZfc3RhcnRfcXVldWUoZGV2KTsNCiANCiAJaWYgKGF1MTAwMF9kZWJ1ZyA+IDQpDQogCQlw cmludGsoIiVzOiBvcGVuOiBJbml0aWFsaXphdGlvbiBkb25lLlxuIiwgZGV2LT5uYW1lKTsNCkBA IC0xNzc0LDE2ICs5NjcsMTkgQEANCiANCiBzdGF0aWMgaW50IGF1MTAwMF9jbG9zZShzdHJ1Y3Qg bmV0X2RldmljZSAqZGV2KQ0KIHsNCi0JdTMyIGZsYWdzOw0KLQlzdHJ1Y3QgYXUxMDAwX3ByaXZh dGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2Ow0KKwl1bnNpZ25l ZCBsb25nIGZsYWdzOw0KKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmNvbnN0IGF1cCA9IChzdHJ1 Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2Ow0KIA0KIAlpZiAoYXUxMDAwX2RlYnVnID4g NCkNCiAJCXByaW50aygiJXM6IGNsb3NlOiBkZXY9JXBcbiIsIGRldi0+bmFtZSwgZGV2KTsNCiAN Ci0JcmVzZXRfbWFjKGRldik7DQorCWlmIChhdXAtPnBoeV9kZXYpDQorCQlwaHlfc3RvcChhdXAt PnBoeV9kZXYpOw0KIA0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmYXVwLT5sb2NrLCBmbGFncyk7DQot CQ0KKw0KKwlyZXNldF9tYWNfdW5sb2NrZWQgKGRldik7DQorDQogCS8qIHN0b3AgdGhlIGRldmlj ZSAqLw0KIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7DQogDQpAQCAtMTgwNSw3ICsxMDAxLDcgQEAN CiAJCWlmIChkZXYpIHsNCiAJCQlhdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+ cHJpdjsNCiAJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOw0KLQkJCWtmcmVlKGF1cC0+bWlpKTsN CisNCiAJCQlmb3IgKGogPSAwOyBqIDwgTlVNX1JYX0RNQTsgaisrKSB7DQogCQkJCWlmIChhdXAt PnJ4X2RiX2ludXNlW2pdKQ0KIAkJCQkJUmVsZWFzZURCKGF1cCwgYXVwLT5yeF9kYl9pbnVzZVtq XSk7DQpAQCAtMTgzMCw3ICsxMDI2LDcgQEANCiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBz ID0gJmF1cC0+c3RhdHM7DQogDQogCWlmIChzdGF0dXMgJiBUWF9GUkFNRV9BQk9SVEVEKSB7DQot CQlpZiAoZGV2LT5pZl9wb3J0ID09IElGX1BPUlRfMTAwQkFTRUZYKSB7DQorCQlpZiAoIWF1cC0+ cGh5X2RldiB8fCAoRFVQTEVYX0ZVTEwgPT0gYXVwLT5waHlfZGV2LT5kdXBsZXgpKSB7DQogCQkJ aWYgKHN0YXR1cyAmIChUWF9KQUJfVElNRU9VVCB8IFRYX1VOREVSUlVOKSkgew0KIAkJCQkvKiBh bnkgb3RoZXIgdHggZXJyb3JzIGFyZSBvbmx5IHZhbGlkDQogCQkJCSAqIGluIGhhbGYgZHVwbGV4 IG1vZGUgKi8NCkBAIC0yMTA0LDEyNiArMTMwMCwxNSBAQA0KIAl9DQogfQ0KIA0KLQ0KIHN0YXRp YyBpbnQgYXUxMDAwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAq cnEsIGludCBjbWQpDQogew0KIAlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3Qg YXUxMDAwX3ByaXZhdGUgKilkZXYtPnByaXY7DQotCXUxNiAqZGF0YSA9ICh1MTYgKikmcnEtPmlm cl9pZnJ1Ow0KIA0KLQlzd2l0Y2goY21kKSB7IA0KLQkJY2FzZSBTSU9DREVWUFJJVkFURToJLyog R2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBQSFkgaW4gdXNlLiAqLw0KLQkJY2FzZSBTSU9DR01JSVBI WToNCi0JCSAgICAgICAgaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHJldHVybiAtRUlOVkFMOw0K LQkJCWRhdGFbMF0gPSBhdXAtPnBoeV9hZGRyOw0KLQkJY2FzZSBTSU9DREVWUFJJVkFURSsxOgkv KiBSZWFkIHRoZSBzcGVjaWZpZWQgTUlJIHJlZ2lzdGVyLiAqLw0KLQkJY2FzZSBTSU9DR01JSVJF RzoNCi0JCQlkYXRhWzNdID0gIG1kaW9fcmVhZChkZXYsIGRhdGFbMF0sIGRhdGFbMV0pOyANCi0J CQlyZXR1cm4gMDsNCi0JCWNhc2UgU0lPQ0RFVlBSSVZBVEUrMjoJLyogV3JpdGUgdGhlIHNwZWNp ZmllZCBNSUkgcmVnaXN0ZXIgKi8NCi0JCWNhc2UgU0lPQ1NNSUlSRUc6IA0KLQkJCWlmICghY2Fw YWJsZShDQVBfTkVUX0FETUlOKSkNCi0JCQkJcmV0dXJuIC1FUEVSTTsNCi0JCQltZGlvX3dyaXRl KGRldiwgZGF0YVswXSwgZGF0YVsxXSxkYXRhWzJdKTsNCi0JCQlyZXR1cm4gMDsNCi0JCWRlZmF1 bHQ6DQotCQkJcmV0dXJuIC1FT1BOT1RTVVBQOw0KLQl9DQorCWlmICghbmV0aWZfcnVubmluZyhk ZXYpKSByZXR1cm4gLUVJTlZBTDsNCiANCi19DQorCWlmICghYXVwLT5waHlfZGV2KSByZXR1cm4g LUVJTlZBTDsgLy8gUEhZIG5vdCBjb250cm9sbGFibGUNCiANCi0NCi1zdGF0aWMgaW50IGF1MTAw MF9zZXRfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKQ0K LXsNCi0Jc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRl ICopIGRldi0+cHJpdjsNCi0JdTE2IGNvbnRyb2w7DQotDQotCWlmIChhdTEwMDBfZGVidWcgPiA0 KSAgew0KLQkJcHJpbnRrKCIlczogc2V0X2NvbmZpZyBjYWxsZWQ6IGRldi0+aWZfcG9ydCAlZCBt YXAtPnBvcnQgJXhcbiIsIA0KLQkJCQlkZXYtPm5hbWUsIGRldi0+aWZfcG9ydCwgbWFwLT5wb3J0 KTsNCi0JfQ0KLQ0KLQlzd2l0Y2gobWFwLT5wb3J0KXsNCi0JCWNhc2UgSUZfUE9SVF9VTktOT1dO OiAvKiB1c2UgYXV0byBoZXJlICovICAgDQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbmZp ZyBwaHkgZm9yIGFuZWdcbiIsIA0KLQkJCQkJZGV2LT5uYW1lKTsNCi0JCQlkZXYtPmlmX3BvcnQg PSBtYXAtPnBvcnQ7DQotCQkJLyogTGluayBEb3duOiB0aGUgdGltZXIgd2lsbCBicmluZyBpdCB1 cCAqLw0KLQkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7DQotCQ0KLQkJCS8qIHJlYWQgY3VycmVu dCBjb250cm9sICovDQotCQkJY29udHJvbCA9IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2FkZHIs IE1JSV9DT05UUk9MKTsNCi0JCQljb250cm9sICY9IH4oTUlJX0NOVExfRkRYIHwgTUlJX0NOVExf RjEwMCk7DQotDQotCQkJLyogZW5hYmxlIGF1dG8gbmVnb3RpYXRpb24gYW5kIHJlc2V0IHRoZSBu ZWdvdGlhdGlvbiAqLw0KLQkJCW1kaW9fd3JpdGUoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQ09O VFJPTCwgDQotCQkJCQljb250cm9sIHwgTUlJX0NOVExfQVVUTyB8IA0KLQkJCQkJTUlJX0NOVExf UlNUX0FVVE8pOw0KLQ0KLQkJCWJyZWFrOw0KLSAgICANCi0JCWNhc2UgSUZfUE9SVF8xMEJBU0VU OiAvKiAxMEJhc2VUICovICAgICAgICAgDQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbmZp ZyBwaHkgZm9yIDEwQmFzZVRcbiIsIA0KLQkJCQkJZGV2LT5uYW1lKTsNCi0JCQlkZXYtPmlmX3Bv cnQgPSBtYXAtPnBvcnQ7DQotCQ0KLQkJCS8qIExpbmsgRG93bjogdGhlIHRpbWVyIHdpbGwgYnJp bmcgaXQgdXAgKi8NCi0JCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOw0KLQ0KLQkJCS8qIHNldCBT cGVlZCB0byAxME1icHMsIEhhbGYgRHVwbGV4ICovDQotCQkJY29udHJvbCA9IG1kaW9fcmVhZChk ZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9DT05UUk9MKTsNCi0JCQljb250cm9sICY9IH4oTUlJX0NO VExfRjEwMCB8IE1JSV9DTlRMX0FVVE8gfCANCi0JCQkJCU1JSV9DTlRMX0ZEWCk7DQotCQ0KLQkJ CS8qIGRpc2FibGUgYXV0byBuZWdvdGlhdGlvbiBhbmQgZm9yY2UgMTBNL0hEIG1vZGUqLw0KLQkJ CW1kaW9fd3JpdGUoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgY29udHJvbCk7DQot CQkJYnJlYWs7DQotICAgIA0KLQkJY2FzZSBJRl9QT1JUXzEwMEJBU0VUOiAvKiAxMDBCYXNlVCAq Lw0KLQkJY2FzZSBJRl9QT1JUXzEwMEJBU0VUWDogLyogMTAwQmFzZVR4ICovIA0KLQkJCXByaW50 ayhLRVJOX0lORk8gIiVzOiBjb25maWcgcGh5IGZvciAxMDBCYXNlVFhcbiIsIA0KLQkJCQkJZGV2 LT5uYW1lKTsNCi0JCQlkZXYtPmlmX3BvcnQgPSBtYXAtPnBvcnQ7DQotCQ0KLQkJCS8qIExpbmsg RG93bjogdGhlIHRpbWVyIHdpbGwgYnJpbmcgaXQgdXAgKi8NCi0JCQluZXRpZl9jYXJyaWVyX29m ZihkZXYpOw0KLQkNCi0JCQkvKiBzZXQgU3BlZWQgdG8gMTAwTWJwcywgSGFsZiBEdXBsZXggKi8N Ci0JCQkvKiBkaXNhYmxlIGF1dG8gbmVnb3RpYXRpb24gYW5kIGVuYWJsZSAxMDBNQml0IE1vZGUg Ki8NCi0JCQljb250cm9sID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX0NPTlRS T0wpOw0KLQkJCWNvbnRyb2wgJj0gfihNSUlfQ05UTF9BVVRPIHwgTUlJX0NOVExfRkRYKTsNCi0J CQljb250cm9sIHw9IE1JSV9DTlRMX0YxMDA7DQotCQkJbWRpb193cml0ZShkZXYsIGF1cC0+cGh5 X2FkZHIsIE1JSV9DT05UUk9MLCBjb250cm9sKTsNCi0JCQlicmVhazsNCi0gICAgDQotCQljYXNl IElGX1BPUlRfMTAwQkFTRUZYOiAvKiAxMDBCYXNlRnggKi8NCi0JCQlwcmludGsoS0VSTl9JTkZP ICIlczogY29uZmlnIHBoeSBmb3IgMTAwQmFzZUZYXG4iLCANCi0JCQkJCWRldi0+bmFtZSk7DQot CQkJZGV2LT5pZl9wb3J0ID0gbWFwLT5wb3J0Ow0KLQkNCi0JCQkvKiBMaW5rIERvd246IHRoZSB0 aW1lciB3aWxsIGJyaW5nIGl0IHVwICovDQotCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsNCi0J DQotCQkJLyogc2V0IFNwZWVkIHRvIDEwME1icHMsIEZ1bGwgRHVwbGV4ICovDQotCQkJLyogZGlz YWJsZSBhdXRvIG5lZ290aWF0aW9uIGFuZCBlbmFibGUgMTAwTUJpdCBNb2RlICovDQotCQkJY29u dHJvbCA9IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9DT05UUk9MKTsNCi0JCQlj b250cm9sICY9IH5NSUlfQ05UTF9BVVRPOw0KLQkJCWNvbnRyb2wgfD0gIE1JSV9DTlRMX0YxMDAg fCBNSUlfQ05UTF9GRFg7DQotCQkJbWRpb193cml0ZShkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9D T05UUk9MLCBjb250cm9sKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgSUZfUE9SVF8xMEJBU0UyOiAv KiAxMEJhc2UyICovDQotCQljYXNlIElGX1BPUlRfQVVJOiAvKiBBVUkgKi8NCi0JCS8qIFRoZXNl IE1vZGVzIGFyZSBub3Qgc3VwcG9ydGVkIChhcmUgdGhleT8pKi8NCi0JCQlwcmludGsoS0VSTl9F UlIgIiVzOiAxMEJhc2UyL0FVSSBub3Qgc3VwcG9ydGVkIiwgDQotCQkJCQlkZXYtPm5hbWUpOw0K LQkJCXJldHVybiAtRU9QTk9UU1VQUDsNCi0JCQlicmVhazsNCi0gICAgDQotCQlkZWZhdWx0Og0K LQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgbWVkaWEgc2VsZWN0ZWQiLCANCi0JCQkJ CWRldi0+bmFtZSk7DQotCQkJcmV0dXJuIC1FSU5WQUw7DQotCX0NCi0JcmV0dXJuIDA7DQorCXJl dHVybiBwaHlfbWlpX2lvY3RsKGF1cC0+cGh5X2RldiwgaWZfbWlpKHJxKSwgY21kKTsNCiB9DQog DQogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdTEwMDBfZ2V0X3N0YXRzKHN0cnVj dCBuZXRfZGV2aWNlICpkZXYpDQpJbmRleDogZ3cxNTUwa2VybmVsL2RyaXZlcnMvbmV0L2F1MTAw MF9ldGguaA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQ0KLS0tIGd3MTU1MGtlcm5lbC5vcmlnL2RyaXZlcnMvbmV0L2F1 MTAwMF9ldGguaAkyMDA2LTA1LTA5IDAzOjAxOjQ1LjAwMDAwMDAwMCArMDIwMA0KKysrIGd3MTU1 MGtlcm5lbC9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmgJMjAwNi0wNS0wOSAwMzoyMToxOS4wMDAw MDAwMDAgKzAyMDANCkBAIC00MCwxMjAgKzQwLDYgQEANCiANCiAjZGVmaW5lIE1VTFRJQ0FTVF9G SUxURVJfTElNSVQgNjQNCiANCi0vKiBGSVhNRSANCi0gKiBUaGUgUEhZIGRlZmluZXMgc2hvdWxk IGJlIGluIGEgc2VwYXJhdGUgZmlsZS4NCi0gKi8NCi0NCi0vKiBNSUkgcmVnaXN0ZXIgb2Zmc2V0 cyAqLw0KLSNkZWZpbmUJTUlJX0NPTlRST0wgMHgwMDAwDQotI2RlZmluZSBNSUlfU1RBVFVTICAw eDAwMDENCi0jZGVmaW5lIE1JSV9QSFlfSUQwIDB4MDAwMg0KLSNkZWZpbmUJTUlJX1BIWV9JRDEg MHgwMDAzDQotI2RlZmluZSBNSUlfQU5BRFYgICAweDAwMDQNCi0jZGVmaW5lIE1JSV9BTkxQQVIg IDB4MDAwNQ0KLSNkZWZpbmUgTUlJX0FFWFAgICAgMHgwMDA2DQotI2RlZmluZSBNSUlfQU5FWFQg ICAweDAwMDcNCi0jZGVmaW5lIE1JSV9MU0lfUEhZX0NPTkZJRyAweDAwMTENCi0vKiBTdGF0dXMg cmVnaXN0ZXIgKi8NCi0jZGVmaW5lIE1JSV9MU0lfUEhZX1NUQVQgICAweDAwMTINCi0jZGVmaW5l IE1JSV9BTURfUEhZX1NUQVQgICBNSUlfTFNJX1BIWV9TVEFUDQotI2RlZmluZSBNSUlfSU5URUxf UEhZX1NUQVQgMHgwMDExDQotDQotI2RlZmluZSBNSUlfQVVYX0NOVFJMICAweDAwMTgNCi0vKiBt aWkgcmVnaXN0ZXJzIHNwZWNpZmljIHRvIEFNRCA3OUM5MDEgKi8NCi0jZGVmaW5lCU1JSV9TVEFU VVNfU1VNTUFSWSA9IDB4MDAxOA0KLQ0KLS8qIE1JSSBDb250cm9sIHJlZ2lzdGVyIGJpdCBkZWZp bml0aW9ucy4gKi8NCi0jZGVmaW5lCU1JSV9DTlRMX0ZEWCAgICAgIDB4MDEwMA0KLSNkZWZpbmUg TUlJX0NOVExfUlNUX0FVVE8gMHgwMjAwDQotI2RlZmluZQlNSUlfQ05UTF9JU09MQVRFICAweDA0 MDANCi0jZGVmaW5lIE1JSV9DTlRMX1BXUkRXTiAgIDB4MDgwMA0KLSNkZWZpbmUJTUlJX0NOVExf QVVUTyAgICAgMHgxMDAwDQotI2RlZmluZSBNSUlfQ05UTF9GMTAwICAgICAweDIwMDANCi0jZGVm aW5lCU1JSV9DTlRMX0xQQksgICAgIDB4NDAwMA0KLSNkZWZpbmUgTUlJX0NOVExfUkVTRVQgICAg MHg4MDAwDQotDQotLyogTUlJIFN0YXR1cyByZWdpc3RlciBiaXQgICovDQotI2RlZmluZQlNSUlf U1RBVF9FWFQgICAgICAgIDB4MDAwMSANCi0jZGVmaW5lIE1JSV9TVEFUX0pBQiAgICAgICAgMHgw MDAyDQotI2RlZmluZQlNSUlfU1RBVF9MSU5LICAgICAgIDB4MDAwNA0KLSNkZWZpbmUgTUlJX1NU QVRfQ0FOX0FVVE8gICAweDAwMDgNCi0jZGVmaW5lCU1JSV9TVEFUX0ZBVUxUICAgICAgMHgwMDEw IA0KLSNkZWZpbmUgTUlJX1NUQVRfQVVUT19ET05FICAweDAwMjANCi0jZGVmaW5lCU1JSV9TVEFU X0NBTl9UICAgICAgMHgwODAwDQotI2RlZmluZSBNSUlfU1RBVF9DQU5fVF9GRFggIDB4MTAwMA0K LSNkZWZpbmUJTUlJX1NUQVRfQ0FOX1RYICAgICAweDIwMDAgDQotI2RlZmluZSBNSUlfU1RBVF9D QU5fVFhfRkRYIDB4NDAwMA0KLSNkZWZpbmUJTUlJX1NUQVRfQ0FOX1Q0ICAgICAweDgwMDANCi0N Ci0NCi0jZGVmaW5lCQlNSUlfSUQxX09VSV9MTwkJMHhGQzAwCS8qIGxvdyBiaXRzIG9mIE9VSSBt YXNrICovDQotI2RlZmluZQkJTUlJX0lEMV9NT0RFTAkJMHgwM0YwCS8qIG1vZGVsIG51bWJlciAq Lw0KLSNkZWZpbmUJCU1JSV9JRDFfUkVWCQkweDAwMEYJLyogbW9kZWwgbnVtYmVyICovDQotDQot LyogTUlJIE5XQVkgUmVnaXN0ZXIgQml0cyAuLi4NCi0gICB2YWxpZCBmb3IgdGhlIEFOQVIgKEF1 dG8tTmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCkgYW5kDQotICAgQU5MUEFSIChBdXRvLU5lZ290 aWF0aW9uIExpbmsgUGFydG5lcikgcmVnaXN0ZXJzICovDQotI2RlZmluZQlNSUlfTldBWV9OT0RF X1NFTCAweDAwMWYNCi0jZGVmaW5lIE1JSV9OV0FZX0NTTUFfQ0QgIDB4MDAwMQ0KLSNkZWZpbmUJ TUlJX05XQVlfVAkgIDB4MDAyMA0KLSNkZWZpbmUgTUlJX05XQVlfVF9GRFggICAgMHgwMDQwDQot I2RlZmluZQlNSUlfTldBWV9UWCAgICAgICAweDAwODANCi0jZGVmaW5lIE1JSV9OV0FZX1RYX0ZE WCAgIDB4MDEwMA0KLSNkZWZpbmUJTUlJX05XQVlfVDQgICAgICAgMHgwMjAwIA0KLSNkZWZpbmUg TUlJX05XQVlfUEFVU0UgICAgMHgwNDAwIA0KLSNkZWZpbmUJTUlJX05XQVlfUkYgICAgICAgMHgy MDAwIC8qIFJlbW90ZSBGYXVsdCAqLw0KLSNkZWZpbmUgTUlJX05XQVlfQUNLICAgICAgMHg0MDAw IC8qIFJlbW90ZSBBY2tub3dsZWRnZSAqLw0KLSNkZWZpbmUJTUlJX05XQVlfTlAgICAgICAgMHg4 MDAwIC8qIE5leHQgUGFnZSAoRW5hYmxlKSAqLw0KLQ0KLS8qIG1paSBzdHNvdXQgcmVnaXN0ZXIg Yml0cyAqLw0KLSNkZWZpbmUJTUlJX1NUU09VVF9MSU5LX0ZBSUwgMHg0MDAwDQotI2RlZmluZQlN SUlfU1RTT1VUX1NQRCAgICAgICAweDAwODANCi0jZGVmaW5lIE1JSV9TVFNPVVRfRFBMWCAgICAg IDB4MDA0MA0KLQ0KLS8qIG1paSBzdHNpY3MgcmVnaXN0ZXIgYml0cyAqLw0KLSNkZWZpbmUJTUlJ X1NUU0lDU19TUEQgICAgICAgMHg4MDAwDQotI2RlZmluZSBNSUlfU1RTSUNTX0RQTFggICAgICAw eDQwMDANCi0jZGVmaW5lCU1JSV9TVFNJQ1NfTElOS1NUUyAgIDB4MDAwMQ0KLQ0KLS8qIG1paSBz dHNzdW0gcmVnaXN0ZXIgYml0cyAqLw0KLSNkZWZpbmUJTUlJX1NUU1NVTV9MSU5LICAweDAwMDgN Ci0jZGVmaW5lIE1JSV9TVFNTVU1fRFBMWCAgMHgwMDA0DQotI2RlZmluZQlNSUlfU1RTU1VNX0FV VE8gIDB4MDAwMg0KLSNkZWZpbmUgTUlJX1NUU1NVTV9TUEQgICAweDAwMDENCi0NCi0vKiBsc2kg cGh5IHN0YXR1cyByZWdpc3RlciAqLw0KLSNkZWZpbmUgTUlJX0xTSV9QSFlfU1RBVF9GRFgJMHgw MDQwDQotI2RlZmluZSBNSUlfTFNJX1BIWV9TVEFUX1NQRAkweDAwODANCi0NCi0vKiBhbWQgcGh5 IHN0YXR1cyByZWdpc3RlciAqLw0KLSNkZWZpbmUgTUlJX0FNRF9QSFlfU1RBVF9GRFgJMHgwODAw DQotI2RlZmluZSBNSUlfQU1EX1BIWV9TVEFUX1NQRAkweDA0MDANCi0NCi0vKiBpbnRlbCBwaHkg c3RhdHVzIHJlZ2lzdGVyICovDQotI2RlZmluZSBNSUlfSU5URUxfUEhZX1NUQVRfRkRYCTB4MDIw MA0KLSNkZWZpbmUgTUlJX0lOVEVMX1BIWV9TVEFUX1NQRAkweDQwMDANCi0NCi0vKiBBdXhpbGxp YXJ5IENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyICovDQotI2RlZmluZSBNSUlfQVVYX0ZEWCAgICAg IDB4MDAwMQ0KLSNkZWZpbmUgTUlJX0FVWF8xMDAgICAgICAweDAwMDINCi0jZGVmaW5lIE1JSV9B VVhfRjEwMCAgICAgMHgwMDA0DQotI2RlZmluZSBNSUlfQVVYX0FORUcgICAgIDB4MDAwOA0KLQ0K LXR5cGVkZWYgc3RydWN0IG1paV9waHkgew0KLQlzdHJ1Y3QgbWlpX3BoeSAqIG5leHQ7DQotCXN0 cnVjdCBtaWlfY2hpcF9pbmZvICogY2hpcF9pbmZvOw0KLQl1MTYgc3RhdHVzOw0KLQl1MzIgKm1p aV9jb250cm9sX3JlZzsNCi0JdTMyICptaWlfZGF0YV9yZWc7DQotfSBtaWlfcGh5X3Q7DQotDQot c3RydWN0IHBoeV9vcHMgew0KLQlpbnQgKCpwaHlfaW5pdCkgKHN0cnVjdCBuZXRfZGV2aWNlICos IGludCk7DQotCWludCAoKnBoeV9yZXNldCkgKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCk7DQot CWludCAoKnBoeV9zdGF0dXMpIChzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIHUxNiAqLCB1MTYg Kik7DQotfTsNCi0NCiAvKiANCiAgKiBEYXRhIEJ1ZmZlciBEZXNjcmlwdG9yLiBEYXRhIGJ1ZmZl cnMgbXVzdCBiZSBhbGlnbmVkIG9uIDMyIGJ5dGUgDQogICogYm91bmRhcnkgZm9yIGJvdGgsIHJl Y2VpdmUgYW5kIHRyYW5zbWl0Lg0KQEAgLTIwMCw3ICs4Niw2IEBADQogDQogDQogc3RydWN0IGF1 MTAwMF9wcml2YXRlIHsNCi0JDQogCWRiX2Rlc3RfdCAqcERCZnJlZTsNCiAJZGJfZGVzdF90IGRi W05VTV9SWF9CVUZGUytOVU1fVFhfQlVGRlNdOw0KIAl2b2xhdGlsZSByeF9kbWFfdCAqcnhfZG1h X3JpbmdbTlVNX1JYX0RNQV07DQpAQCAtMjEzLDkgKzk4LDE2IEBADQogCXUzMiB0eF9mdWxsOw0K IA0KIAlpbnQgbWFjX2lkOw0KLQltaWlfcGh5X3QgKm1paTsNCi0Jc3RydWN0IG1paV9pZl9pbmZv IG1paV9pZjsNCi0Jc3RydWN0IHBoeV9vcHMgKnBoeV9vcHM7DQorDQorCWludCBtYWNfZW5hYmxl ZDsgICAgICAgLyogd2hldGhlciBNQUMgaXMgY3VycmVudGx5IGVuYWJsZWQgYW5kIHJ1bm5pbmcg KHJlcS4gZm9yIG1kaW8pICovDQorDQorCWludCBvbGRfbGluazsgICAgICAgICAgLyogdXNlZCBi eSBhdTEwMDBfYWRqdXN0X2xpbmsgKi8NCisJaW50IG9sZF9zcGVlZDsNCisJaW50IG9sZF9kdXBs ZXg7DQorDQorCWludCBwaHlfYWRkcjsgICAgICAgICAgLyogcGh5IGFkZHJlc3MgKi8NCisJc3Ry dWN0IHBoeV9kZXZpY2UgKnBoeV9kZXY7DQorCXN0cnVjdCBtaWlfYnVzIG1paV9idXM7DQogCQ0K IAkvKiBUaGVzZSB2YXJpYWJsZXMgYXJlIGp1c3QgZm9yIHF1aWNrIGFjY2VzcyB0byBjZXJ0YWlu IHJlZ3MgYWRkcmVzc2VzLiAqLw0KIAl2b2xhdGlsZSBtYWNfcmVnX3QgKm1hYzsgIC8qIG1hYyBy ZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgKi8gICANCkBAIC0yMjcsMTEgKzExOSw5IEBA DQogCXU4ICpoYXNoX3RhYmxlOw0KIAl1MzIgaGFzaF9tb2RlOw0KIAl1MzIgaW50cl93b3JrX2Rv bmU7IC8qIG51bWJlciBvZiBSeCBhbmQgVHggcGt0cyBwcm9jZXNzZWQgaW4gdGhlIGlzciAqLw0K LQlpbnQgcGh5X2FkZHI7ICAgICAgICAgIC8qIHBoeSBhZGRyZXNzICovDQogCXUzMiBvcHRpb25z OyAgICAgICAgICAgLyogVXNlci1zZXR0YWJsZSBtaXNjLiBkcml2ZXIgb3B0aW9ucy4gKi8NCiAJ dTMyIGRydl9mbGFnczsNCi0JaW50IHdhbnRfYXV0b25lZzsNCisNCiAJc3RydWN0IG5ldF9kZXZp Y2Vfc3RhdHMgc3RhdHM7DQotCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOw0KIAlzcGlubG9ja190 IGxvY2s7ICAgICAgIC8qIFNlcmlhbGlzZSBhY2Nlc3MgdG8gZGV2aWNlICovDQogfTsNCm== --=-3obsThmJDBZucvHF3QdD-- --=-nXAAkLu6qAytME5Lt43T Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2.2 (GNU/Linux) iD8DBQBEX/inSYHgZIg/QUIRAqc5AKDcN/EMPnJ0lkOeL4n1lqlqFX8RBACcCtSF qpmrJcycV/aOi53oUDrsLWY= =xM7F -----END PGP SIGNATURE----- --=-nXAAkLu6qAytME5Lt43T--