Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 30 Aug 2008 09:37:31 +0200
From:      "Jacques Fourie" <jacques.fourie@gmail.com>
To:        "Stanislav Sedov" <stas@freebsd.org>
Cc:        freebsd-arm@freebsd.org
Subject:   Re: MMC Controller driver for PXA255
Message-ID:  <be2f52430808300037y79723a2ascf62c33aec7579f3@mail.gmail.com>
In-Reply-To: <20080829231522.201a591b.stas@FreeBSD.org>
References:  <be2f52430808290920w5e586180q657c842cae07277b@mail.gmail.com> <20080829231522.201a591b.stas@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
------=_Part_26427_13643661.1220081851637
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

> On Fri, 29 Aug 2008 18:20:16 +0200
> "Jacques Fourie" <jacques.fourie@gmail.com> mentioned:
>
>> Hi,
>>
>> I've written a driver for the MMC controller found on the Intel Xscale
>> PXA255 (as found on the Gumstix Connex). It seems to work OK - I've
>> tested with a range of SD cards. The driver works in PIO mode (still
>> busy to debug some DMA issues) and on my Gumstix Connex I get around
>> 400kB/s. If anyone wants to review the code for inclusion let me know
>> and I'll be happy to provide it.
>>
>
> Great work!
> Upload it somewhere or post here, so we can take a look.
>
> Thanks!
> --
> Stanislav Sedov
> ST4096-RIPE
>
Hi,

I previously sent Warner some mods but forgot to cc the list. Here is
a diff against current (svn revision 182470).  I also made some minor
mods to the mmc stack that I'll post as soon as I've cleaned them up -
they contain a lot of extra printf's at the moment.

Jacques

------=_Part_26427_13643661.1220081851637
Content-Type: text/plain; name=diff_arm.txt
Content-Transfer-Encoding: base64
X-Attachment-Id: f_fkhwpo1x1
Content-Disposition: attachment; filename=diff_arm.txt

ZGlmZiAteCAnKnN2bionIC11IC1OIC1kIC1yIGZic2RfY3VycmVudF8yMDA4MDgzMC9zcmMvc3lz
L2FybS94c2NhbGUvcHhhL2ZpbGVzLnB4YSBmYnNkX2pmX3ByaXYvc3JjL3N5cy9hcm0veHNjYWxl
L3B4YS9maWxlcy5weGEKLS0tIGZic2RfY3VycmVudF8yMDA4MDgzMC9zcmMvc3lzL2FybS94c2Nh
bGUvcHhhL2ZpbGVzLnB4YQkyMDA4LTA4LTMwIDA4OjQzOjU3LjAwMDAwMDAwMCArMDIwMAorKysg
ZmJzZF9qZl9wcml2L3NyYy9zeXMvYXJtL3hzY2FsZS9weGEvZmlsZXMucHhhCTIwMDgtMDgtMjUg
MTY6MzE6NDkuMDAwMDAwMDAwICswMjAwCkBAIC0xLDQgKzEsNCBAQAotIyAkRnJlZUJTRDogaGVh
ZC9zeXMvYXJtL3hzY2FsZS9weGEvZmlsZXMucHhhIDE3OTcwMCAyMDA4LTA2LTEwIDAzOjQ0OjE0
WiBrZXZsbyAkCisjICRGcmVlQlNEJAogCiBhcm0vYXJtL2J1c19zcGFjZV9nZW5lcmljLmMJCXN0
YW5kYXJkCiBhcm0vYXJtL2NwdWZ1bmNfYXNtX3hzY2FsZS5TCQlzdGFuZGFyZApAQCAtMTEsOCAr
MTEsMTIgQEAKIGFybS94c2NhbGUvcHhhL3B4YV9zbWkuYwkJc3RhbmRhcmQKIGFybS94c2NhbGUv
cHhhL3B4YV9zcGFjZS5jCQlzdGFuZGFyZAogYXJtL3hzY2FsZS9weGEvcHhhX3RpbWVyLmMJCXN0
YW5kYXJkCithcm0veHNjYWxlL3B4YS9weGFfY2xrX21nci5jCQlzdGFuZGFyZAorYXJtL3hzY2Fs
ZS9weGEvcHhhX2RtYWMuYwkJc3RhbmRhcmQKIAogYXJtL3hzY2FsZS9weGEvdWFydF9idXNfcHhh
LmMJCW9wdGlvbmFsIHVhcnQKIGFybS94c2NhbGUvcHhhL3VhcnRfY3B1X3B4YS5jCQlvcHRpb25h
bCB1YXJ0CiAKIGFybS94c2NhbGUvcHhhL2lmX3NtY19zbWkuYwkJb3B0aW9uYWwgc21jCisKK2Fy
bS94c2NhbGUvcHhhL3B4YV9tY2kuYwkJb3B0aW9uYWwgcHhhX21jaQpkaWZmIC14ICcqc3ZuKicg
LXUgLU4gLWQgLXIgZmJzZF9jdXJyZW50XzIwMDgwODMwL3NyYy9zeXMvYXJtL3hzY2FsZS9weGEv
cHhhX2Nsa19tZ3IuYyBmYnNkX2pmX3ByaXYvc3JjL3N5cy9hcm0veHNjYWxlL3B4YS9weGFfY2xr
X21nci5jCi0tLSBmYnNkX2N1cnJlbnRfMjAwODA4MzAvc3JjL3N5cy9hcm0veHNjYWxlL3B4YS9w
eGFfY2xrX21nci5jCTE5NzAtMDEtMDEgMDI6MDA6MDAuMDAwMDAwMDAwICswMjAwCisrKyBmYnNk
X2pmX3ByaXYvc3JjL3N5cy9hcm0veHNjYWxlL3B4YS9weGFfY2xrX21nci5jCTIwMDgtMDgtMjUg
MTM6MjA6NDMuMDAwMDAwMDAwICswMjAwCkBAIC0wLDAgKzEsMTU3IEBACisvKi0KKyAqIENvcHly
aWdodCAoYykgMjAwOCBKYWNxdWVzIEZvdXJpZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMg
SVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisg
KiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KK19fRkJTRElEKCIkRnJl
ZUJTRCQiKTsKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zeXN0bS5o
PgorI2luY2x1ZGUgPHN5cy9iaW8uaD4KKyNpbmNsdWRlIDxzeXMvYnVzLmg+CisjaW5jbHVkZSA8
c3lzL2NvbmYuaD4KKyNpbmNsdWRlIDxzeXMvZW5kaWFuLmg+CisjaW5jbHVkZSA8c3lzL2tlcm5l
bC5oPgorI2luY2x1ZGUgPHN5cy9rdGhyZWFkLmg+CisjaW5jbHVkZSA8c3lzL2xvY2suaD4KKyNp
bmNsdWRlIDxzeXMvbWFsbG9jLmg+CisjaW5jbHVkZSA8c3lzL21vZHVsZS5oPgorI2luY2x1ZGUg
PHN5cy9tdXRleC5oPgorI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgorI2luY2x1ZGUgPHN5cy9yZXNv
dXJjZS5oPgorI2luY2x1ZGUgPHN5cy9ybWFuLmg+CisjaW5jbHVkZSA8c3lzL3N5c3RtLmg+Cisj
aW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXRjLmg+CisjaW5jbHVkZSA8
c3lzL3dhdGNoZG9nLmg+CisKKyNpbmNsdWRlIDxtYWNoaW5lL2J1cy5oPgorI2luY2x1ZGUgPG1h
Y2hpbmUvY3B1Lmg+CisjaW5jbHVkZSA8bWFjaGluZS9jcHVmdW5jLmg+CisjaW5jbHVkZSA8bWFj
aGluZS9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPG1hY2hpbmUvZnJhbWUuaD4KKyNpbmNsdWRlIDxt
YWNoaW5lL2ludHIuaD4KKyNpbmNsdWRlIDxhcm0veHNjYWxlL3B4YS9weGFyZWcuaD4KKyNpbmNs
dWRlIDxhcm0veHNjYWxlL3B4YS9weGF2YXIuaD4KKworc3RydWN0IHB4YV9jbGtfbWdyX3NvZnRj
IHsKKwlkZXZpY2VfdCBkZXY7CisJc3RydWN0IHJlc291cmNlCSptZW1fcmVzOwkKK307CisKK3N0
YXRpYyBzdHJ1Y3QgcHhhX2Nsa19tZ3Jfc29mdGMgKnB4YV9jbGtfbWdyX3NvZnRjID0gTlVMTDsK
Kworc3RhdGljIGludCBweGFfY2xrX21ncl9hY3RpdmF0ZShkZXZpY2VfdCBkZXYpOworCitzdGF0
aWMgdm9pZCBweGFfY2xrX21ncl9kZWFjdGl2YXRlKGRldmljZV90IGRldik7CisKK3N0YXRpYyBp
bnQKK3B4YV9jbGtfbWdyX3Byb2JlKGRldmljZV90IGRldikKK3sKKworCWRldmljZV9zZXRfZGVz
YyhkZXYsICJQWEEgY2xvY2sgbWFuYWdlciIpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBp
bnQKK3B4YV9jbGtfbWdyX2F0dGFjaChkZXZpY2VfdCBkZXYpCit7CisJc3RydWN0IHB4YV9jbGtf
bWdyX3NvZnRjICpzYyA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsKKwlpbnQgZXJyOworCisJc2Mt
PmRldiA9IGRldjsKKwlweGFfY2xrX21ncl9zb2Z0YyA9IHNjOworCWVyciA9IHB4YV9jbGtfbWdy
X2FjdGl2YXRlKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBidXNfZ2Vu
ZXJpY19hdHRhY2goZGV2KTsKK291dDo7CisJaWYgKGVycikKKwkJcHhhX2Nsa19tZ3JfZGVhY3Rp
dmF0ZShkZXYpOworCXJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludAorcHhhX2Nsa19tZ3Jf
YWN0aXZhdGUoZGV2aWNlX3QgZGV2KQoreworCXN0cnVjdCBweGFfY2xrX21ncl9zb2Z0YyAqc2M7
CisJaW50IHJpZDsKKworCXNjID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYpOworCXJpZCA9IDA7CisJ
c2MtPm1lbV9yZXMgPSBidXNfYWxsb2NfcmVzb3VyY2VfYW55KGRldiwgU1lTX1JFU19NRU1PUlks
ICZyaWQsCisJICAgIFJGX0FDVElWRSk7CisJaWYgKHNjLT5tZW1fcmVzID09IE5VTEwpCisJCWdv
dG8gZXJyb3V0OworCXJldHVybiAoMCk7CitlcnJvdXQ6CisJcHhhX2Nsa19tZ3JfZGVhY3RpdmF0
ZShkZXYpOworCXJldHVybiAoRU5PTUVNKTsKK30KKworc3RhdGljIHZvaWQKK3B4YV9jbGtfbWdy
X2RlYWN0aXZhdGUoZGV2aWNlX3QgZGV2KQoreworCXN0cnVjdCBweGFfY2xrX21ncl9zb2Z0YyAq
c2M7CisKKwlzYyA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsKKwlidXNfZ2VuZXJpY19kZXRhY2go
c2MtPmRldik7CisJaWYgKHNjLT5tZW1fcmVzKQorCQlidXNfcmVsZWFzZV9yZXNvdXJjZShkZXYs
IFNZU19SRVNfTUVNT1JZLAorCQkgICAgcm1hbl9nZXRfcmlkKHNjLT5tZW1fcmVzKSwgc2MtPm1l
bV9yZXMpOworCXNjLT5tZW1fcmVzID0gMDsKKwlyZXR1cm47Cit9CisKK3ZvaWQKK3B4YV9zZXRf
Y2tlbih1aW50MzJfdCBjbG9jaywgdWludDMyX3QgZW5hYmxlKQoreworCXVpbnQzMl90IHZhbDsK
KwlzdHJ1Y3QgcHhhX2Nsa19tZ3Jfc29mdGMgKnNjOworCisJc2MgPSBweGFfY2xrX21ncl9zb2Z0
YzsKKwkvKiBSZWFkIGN1cnJlbnQgdmFsdWUgKi8KKwl2YWwgPSBidXNfcmVhZF80KHNjLT5tZW1f
cmVzLCBDTEtNQU5fQ0tFTik7CisJaWYgKGVuYWJsZSkKKwkJdmFsIHw9IGNsb2NrOworCWVsc2UJ
CisJCXZhbCAmPSB+Y2xvY2s7CisJYnVzX3dyaXRlXzQoc2MtPm1lbV9yZXMsIENMS01BTl9DS0VO
LCB2YWwpOworfQorCitzdGF0aWMgZGV2aWNlX21ldGhvZF90IHB4YV9jbGtfbWdyX21ldGhvZHNb
XSA9IHsKKwkvKiBkZXZpY2VfaWYgKi8KKwlERVZNRVRIT0QoZGV2aWNlX3Byb2JlLCBweGFfY2xr
X21ncl9wcm9iZSksCisJREVWTUVUSE9EKGRldmljZV9hdHRhY2gsIHB4YV9jbGtfbWdyX2F0dGFj
aCksCisJezAsIDB9LAorfTsKKworc3RhdGljIGRyaXZlcl90IHB4YV9jbGtfbWdyX2RyaXZlciA9
IHsKKwkicHhhX2Nsa19tZ3IiLAorCXB4YV9jbGtfbWdyX21ldGhvZHMsCisJc2l6ZW9mKHN0cnVj
dCBweGFfY2xrX21ncl9zb2Z0YyksCit9Oworc3RhdGljIGRldmNsYXNzX3QgcHhhX2Nsa19tZ3Jf
ZGV2Y2xhc3M7CisKK0RSSVZFUl9NT0RVTEUocHhhX2Nsa19tZ3IsIHB4YSwgcHhhX2Nsa19tZ3Jf
ZHJpdmVyLCBweGFfY2xrX21ncl9kZXZjbGFzcywgMCwgMCk7CmRpZmYgLXggJypzdm4qJyAtdSAt
TiAtZCAtciBmYnNkX2N1cnJlbnRfMjAwODA4MzAvc3JjL3N5cy9hcm0veHNjYWxlL3B4YS9weGFf
ZG1hYy5jIGZic2RfamZfcHJpdi9zcmMvc3lzL2FybS94c2NhbGUvcHhhL3B4YV9kbWFjLmMKLS0t
IGZic2RfY3VycmVudF8yMDA4MDgzMC9zcmMvc3lzL2FybS94c2NhbGUvcHhhL3B4YV9kbWFjLmMJ
MTk3MC0wMS0wMSAwMjowMDowMC4wMDAwMDAwMDAgKzAyMDAKKysrIGZic2RfamZfcHJpdi9zcmMv
c3lzL2FybS94c2NhbGUvcHhhL3B4YV9kbWFjLmMJMjAwOC0wOC0yOCAxMTozMzozOS4wMDAwMDAw
MDAgKzAyMDAKQEAgLTAsMCArMSwzNDUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA2IEJl
bm5vIFJpY2UuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNT
IE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAor
ICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK
KyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSA8c3lzL2NkZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNsdWRl
IDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lzdG0uaD4KKyNpbmNsdWRlIDxzeXMvYnVz
Lmg+CisjaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgorI2luY2x1ZGUgPHN5cy9sb2NrLmg+CisjaW5j
bHVkZSA8c3lzL21vZHVsZS5oPgorI2luY2x1ZGUgPHN5cy9tYWxsb2MuaD4KKyNpbmNsdWRlIDxz
eXMvbXV0ZXguaD4KKyNpbmNsdWRlIDxzeXMvcm1hbi5oPgorI2luY2x1ZGUgPHN5cy90aW1ldGMu
aD4KKyNpbmNsdWRlIDxtYWNoaW5lL2J1cy5oPgorI2luY2x1ZGUgPG1hY2hpbmUvaW50ci5oPgor
CisjaW5jbHVkZSA8YXJtL3hzY2FsZS9weGEvcHhhdmFyLmg+CisjaW5jbHVkZSA8YXJtL3hzY2Fs
ZS9weGEvcHhhcmVnLmg+CisKK3N0cnVjdCBkbWFjX2NoYW5uZWwgeworCWludAlkY19pZDsKKwlp
bnQJZGNfYWxsb2NhdGVkOworCWludAlkY19idXN5OworCWludAlkY19lcnJvcjsKK307CisKK3N0
cnVjdCBweGFfZG1hY19zb2Z0YyB7CisJc3RydWN0IHJlc291cmNlICoJcGRfcmVzWzJdOworCWRl
dmljZV90CQlwZF9kZXY7CisJYnVzX3NwYWNlX3RhZ190CQlwZF9ic3Q7CisJYnVzX3NwYWNlX2hh
bmRsZV90CXBkX2JzaDsKKwlzdHJ1Y3QgbXR4IAkJcGRfbXR4OworCXN0cnVjdCBkbWFjX2NoYW5u
ZWwJcGRfY2hhbm5lbHNbRE1BQ19OX0NIQU5ORUxTXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVz
b3VyY2Vfc3BlYyBweGFfZG1hY19zcGVjW10gPSB7CisJeyBTWVNfUkVTX01FTU9SWSwJMCwJUkZf
QUNUSVZFIH0sCisJeyBTWVNfUkVTX0lSUSwJCTAsCVJGX0FDVElWRSB9LAorCXsgLTEsIDAgfQor
fTsKKworc3RhdGljIHN0cnVjdCBweGFfZG1hY19zb2Z0YyAqZG1hY19zb2Z0YyA9IE5VTEw7CisK
K3N0YXRpYyBpbnQJcHhhX2RtYWNfcHJvYmUoZGV2aWNlX3QpOworc3RhdGljIGludAlweGFfZG1h
Y19hdHRhY2goZGV2aWNlX3QpOworCitzdGF0aWMgZHJpdmVyX2ZpbHRlcl90CXB4YV9kbWFjX2lu
dHI7CisKK3N0YXRpYyBpbnQKK3B4YV9kbWFjX3Byb2JlKGRldmljZV90IGRldikKK3sKKworCWRl
dmljZV9zZXRfZGVzYyhkZXYsICJETUEgQ29udHJvbGxlciIpOworCXJldHVybiAoMCk7Cit9CisK
K3N0YXRpYyBpbnQKK3B4YV9kbWFjX2F0dGFjaChkZXZpY2VfdCBkZXYpCit7CisJaW50CWVycm9y
LCBpOworCXZvaWQJKmlobDsKKwlzdHJ1Y3QJcHhhX2RtYWNfc29mdGMgKnNjOworCisJc2MgPSAo
c3RydWN0IHB4YV9kbWFjX3NvZnRjICopZGV2aWNlX2dldF9zb2Z0YyhkZXYpOworCisJaWYgKGRt
YWNfc29mdGMgIT0gTlVMTCkKKwkJcmV0dXJuIChFTlhJTyk7CisJZG1hY19zb2Z0YyA9IHNjOwor
CisJZXJyb3IgPSBidXNfYWxsb2NfcmVzb3VyY2VzKGRldiwgcHhhX2RtYWNfc3BlYywgc2MtPnBk
X3Jlcyk7CisJaWYgKGVycm9yKSB7CisJCWRldmljZV9wcmludGYoZGV2LCAiY291bGQgbm90IGFs
bG9jYXRlIHJlc291cmNlc1xuIik7CisJCXJldHVybiAoRU5YSU8pOworCX0KKworCWlmIChidXNf
c2V0dXBfaW50cihkZXYsIHNjLT5wZF9yZXNbMV0sIElOVFJfVFlQRV9NSVNDLCBweGFfZG1hY19p
bnRyLAorCSAgICBOVUxMLCBOVUxMLCAmaWhsKSAhPSAwKSB7CisJCWJ1c19yZWxlYXNlX3Jlc291
cmNlcyhkZXYsIHB4YV9kbWFjX3NwZWMsIHNjLT5wZF9yZXMpOworCQlkZXZpY2VfcHJpbnRmKGRl
diwgImNvdWxkIG5vdCBzZXQgdXAgaW50ZXJydXB0XG4iKTsKKwkJcmV0dXJuIChFTlhJTyk7CisJ
fQorCisJc2MtPnBkX2JzdCA9IHJtYW5fZ2V0X2J1c3RhZyhzYy0+cGRfcmVzWzBdKTsKKwlzYy0+
cGRfYnNoID0gcm1hbl9nZXRfYnVzaGFuZGxlKHNjLT5wZF9yZXNbMF0pOworCisJZm9yIChpID0g
MDsgaSA8IERNQUNfTl9DSEFOTkVMUzsgaSsrKSB7CisJCXNjLT5wZF9jaGFubmVsc1tpXS5kY19p
ZCA9IGk7CisJCXNjLT5wZF9jaGFubmVsc1tpXS5kY19hbGxvY2F0ZWQgPSAwOworCQlzYy0+cGRf
Y2hhbm5lbHNbaV0uZGNfYnVzeSA9IDA7CisJCXNjLT5wZF9jaGFubmVsc1tpXS5kY19lcnJvciA9
IDA7CisJfQorCisJLyoKKwkgKiBXZSB1c2UgYSBzcGluIGxvY2sgc28gd2UgY2FuIGxvY2sgaXQg
aW4gdGhlIChmYXN0KSBpbnRlcnJ1cHQgaGFuZGxlci4KKwkgKi8KKwltdHhfaW5pdCgmc2MtPnBk
X210eCwgImRtYWMgbXV0ZXgiLCBOVUxMLCBNVFhfU1BJTik7CisKKwlzYy0+cGRfZGV2ID0gZGV2
OworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorcHhhX2RtYWNfaW50cih2b2lkICph
cmcpCit7CisJdWludDMyX3QJZGludCwgZGNzcjsKKwlpbnQJCWk7CisJc3RydWN0CQlweGFfZG1h
Y19zb2Z0YyAqc2M7CisKKwkodm9pZClhcmc7CisKKwlzYyA9IGRtYWNfc29mdGM7CisKKwlkaW50
ID0gYnVzX3NwYWNlX3JlYWRfNChzYy0+cGRfYnN0LCBzYy0+cGRfYnNoLCBETUFDX0RJTlQpOwor
CisJLy9wcmludGYoIkRNQUMgaW50ciA6ICUwOFhcbiIsIGRpbnQpOworCQorCWZvciAoaSA9IDA7
IGkgPCBETUFDX05fQ0hBTk5FTFM7IGkrKykgeworCQlpZiAoZGludCAmICgxIDw8IGkpKSB7CisJ
CQlkY3NyID0gYnVzX3NwYWNlX3JlYWRfNChzYy0+cGRfYnN0LCBzYy0+cGRfYnNoLAorCQkJICAg
IERNQUNfRENTUihpKSk7CisJCQltdHhfbG9ja19zcGluKCZzYy0+cGRfbXR4KTsKKwkJCWlmICgo
ZGNzciAmIERDU1JfQlVTRVJSSU5UUikgIT0gMCkgeworCQkJCXNjLT5wZF9jaGFubmVsc1tpXS5k
Y19lcnJvciA9IDE7CisJCQl9CisJCQlzYy0+cGRfY2hhbm5lbHNbaV0uZGNfYnVzeSA9IDA7CisJ
CQltdHhfdW5sb2NrX3NwaW4oJnNjLT5wZF9tdHgpOworCQkJd2FrZXVwX29uZSgmKHNjLT5wZF9j
aGFubmVsc1tpXSkpOworCQkJYnVzX3NwYWNlX3dyaXRlXzQoc2MtPnBkX2JzdCwgc2MtPnBkX2Jz
aCwKKwkJCSAgICBETUFDX0RDU1IoaSksIGRjc3IpOworCQl9CisJfQorCQorCXJldHVybiAoRklM
VEVSX0hBTkRMRUQpOworfQorCitzdGF0aWMgZGV2aWNlX21ldGhvZF90IHB4YV9kbWFjX21ldGhv
ZHNbXSA9IHsKKwlERVZNRVRIT0QoZGV2aWNlX3Byb2JlLCBweGFfZG1hY19wcm9iZSksCisJREVW
TUVUSE9EKGRldmljZV9hdHRhY2gsIHB4YV9kbWFjX2F0dGFjaCksCisKKwl7MCwgMH0KK307CisK
K3N0YXRpYyBkcml2ZXJfdCBweGFfZG1hY19kcml2ZXIgPSB7CisJImRtYWMiLAorCXB4YV9kbWFj
X21ldGhvZHMsCisJc2l6ZW9mKHN0cnVjdCBweGFfZG1hY19zb2Z0YyksCit9OworCitzdGF0aWMg
ZGV2Y2xhc3NfdCBweGFfZG1hY19kZXZjbGFzczsKKworRFJJVkVSX01PRFVMRShweGFkbWFjLCBw
eGEsIHB4YV9kbWFjX2RyaXZlciwgcHhhX2RtYWNfZGV2Y2xhc3MsIDAsIDApOworCitpbnQKK3B4
YV9kbWFjX2FsbG9jKGludCBwcmlvcml0eSwgc3RydWN0IGRtYWNfY2hhbm5lbCAqKmNoYW5uZWws
IGludCB0aW1lb3V0KQoreworCWludAlpLCBzdGFydCwgZW5kOworCXN0cnVjdAlweGFfZG1hY19z
b2Z0YyAqc2M7CisKKwlzYyA9IGRtYWNfc29mdGM7CisKKwlpZiAocHJpb3JpdHkgPCBETUFDX1BS
SU9SSVRZX0hJR0hFU1QgJiYgcHJpb3JpdHkgPiBETUFDX1BSSU9SSVRZX0xPVykgeworCQkqY2hh
bm5lbCA9IE5VTEw7CisJCXJldHVybiAoRURPT0ZVUyk7CisJfQorCisJc3dpdGNoIChwcmlvcml0
eSkgeworCWNhc2UgRE1BQ19QUklPUklUWV9ISUdIRVNUOgorCQlzdGFydCA9IDA7CisJCWVuZCA9
IDM7CisJCWJyZWFrOworCisJY2FzZSBETUFDX1BSSU9SSVRZX0hJR0g6CisJCXN0YXJ0ID0gNDsK
KwkJZW5kID0gNzsKKwkJYnJlYWs7CisKKwljYXNlIERNQUNfUFJJT1JJVFlfTE9XOgorCWRlZmF1
bHQ6CisJCXN0YXJ0ID0gODsKKwkJZW5kID0gMTU7CisJCWJyZWFrOworCX0KKworCW10eF9sb2Nr
X3NwaW4oJnNjLT5wZF9tdHgpOworCityZXRyeToKKwlmb3IgKGkgPSBzdGFydDsgaSA8PSBlbmQ7
IGkrKykgeworCQlpZiAoc2MtPnBkX2NoYW5uZWxzW2ldLmRjX2FsbG9jYXRlZCA9PSAwKSB7CisJ
CQlzYy0+cGRfY2hhbm5lbHNbaV0uZGNfYWxsb2NhdGVkID0gMTsKKwkJCW10eF91bmxvY2tfc3Bp
bigmc2MtPnBkX210eCk7CisJCQkqY2hhbm5lbCA9ICYoc2MtPnBkX2NoYW5uZWxzW2ldKTsKKwkJ
CXJldHVybiAoMCk7CisJCX0KKwl9CisKKwlpZiAodGltZW91dCkgeworCQltc2xlZXAoc2MsICZz
Yy0+cGRfbXR4LCAwLCAiZG1hYWxjIiwKKwkJICAgIHRpbWVvdXQgPT0gLTEgPyAwIDogdGltZW91
dCk7CisJCWlmICh0aW1lb3V0ICE9IC0xKQorCQkJdGltZW91dCA9IDA7CisJCWdvdG8gcmV0cnk7
CisJfQorCisJbXR4X3VubG9ja19zcGluKCZzYy0+cGRfbXR4KTsKKwlyZXR1cm4gKEVOT1NQQyk7
Cit9CisKK3ZvaWQKK3B4YV9kbWFjX3JlbGVhc2Uoc3RydWN0IGRtYWNfY2hhbm5lbCAqY2hhbm5l
bCkKK3sKKwlzdHJ1Y3QJcHhhX2RtYWNfc29mdGMgKnNjOworCisJc2MgPSBkbWFjX3NvZnRjOwor
CisJbXR4X2xvY2tfc3Bpbigmc2MtPnBkX210eCk7CisJY2hhbm5lbC0+ZGNfYWxsb2NhdGVkID0g
MDsKKwltdHhfdW5sb2NrX3NwaW4oJnNjLT5wZF9tdHgpOworCXdha2V1cF9vbmUoc2MpOworfQor
CitpbnQKK3B4YV9kbWFjX3RyYW5zZmVyKHN0cnVjdCBkbWFjX2NoYW5uZWwgKmNoYW5uZWwsIGJ1
c19hZGRyX3QgZGVzYykKK3sKKwlzdHJ1Y3QJCXB4YV9kbWFjX3NvZnRjICpzYzsKKworCXNjID0g
ZG1hY19zb2Z0YzsKKworCWlmICgoZGVzYyAmIDB4ZikgIT0gMCkKKwkJcmV0dXJuIChFSU5WQUwp
OworCWlmIChjaGFubmVsLT5kY19idXN5ID09IDEpCisJCXJldHVybiAoRUJVU1kpOworCisJbXR4
X2xvY2tfc3Bpbigmc2MtPnBkX210eCk7CisKKwljaGFubmVsLT5kY19lcnJvciA9IDA7CisKKwli
dXNfc3BhY2Vfd3JpdGVfNChzYy0+cGRfYnN0LCBzYy0+cGRfYnNoLCBETUFDX0REQURSKGNoYW5u
ZWwtPmRjX2lkKSwKKwkgICAgZGVzYyk7CisJYnVzX3NwYWNlX3dyaXRlXzQoc2MtPnBkX2JzdCwg
c2MtPnBkX2JzaCwgRE1BQ19EQ1NSKGNoYW5uZWwtPmRjX2lkKSwKKwkgICAgRENTUl9CVVNFUlJJ
TlRSfERDU1JfRU5ESU5UUnxEQ1NSX1JVTik7CisKKwljaGFubmVsLT5kY19idXN5ID0gMTsKKwor
CW10eF91bmxvY2tfc3Bpbigmc2MtPnBkX210eCk7CisJcmV0dXJuICgwKTsKK30KKworaW50Citw
eGFfZG1hY190cmFuc2Zlcl9zaW5nbGUoc3RydWN0IGRtYWNfY2hhbm5lbCAqY2hhbm5lbCwgYnVz
X2FkZHJfdCBzb3VyY2UsCisgICAgYnVzX2FkZHJfdCB0YXJnZXQsIHVpbnQzMl90IGNvbW1hbmQp
Cit7CisJc3RydWN0CQlweGFfZG1hY19zb2Z0YyAqc2M7CisJdWludDMyX3QJZGNzcjsKKworCXNj
ID0gZG1hY19zb2Z0YzsKKworCWlmIChjaGFubmVsLT5kY19idXN5ID09IDEpCisJCXJldHVybiAo
RUJVU1kpOworCisJbXR4X2xvY2tfc3Bpbigmc2MtPnBkX210eCk7CisKKwljaGFubmVsLT5kY19l
cnJvciA9IDA7CisKKwlkY3NyID0gYnVzX3NwYWNlX3JlYWRfNChzYy0+cGRfYnN0LCBzYy0+cGRf
YnNoLAorCSAgICBETUFDX0RDU1IoY2hhbm5lbC0+ZGNfaWQpKTsKKwlkY3NyICY9IH5EQ1NSX1JV
TjsKKwlkY3NyIHw9IERDU1JfTk9ERVNDRkVUQ0g7CisKKwkvKiBJbnRlcnJ1cHQgd2hlbiB0cmFu
c2ZlciBpcyBjb21wbGV0ZSAqLworCWNvbW1hbmQgfD0gRENNRF9FTkRJUlFFTjsKKworCWJ1c19z
cGFjZV93cml0ZV80KHNjLT5wZF9ic3QsIHNjLT5wZF9ic2gsIERNQUNfRENTUihjaGFubmVsLT5k
Y19pZCksCisJICAgIGRjc3IpOworCWJ1c19zcGFjZV93cml0ZV80KHNjLT5wZF9ic3QsIHNjLT5w
ZF9ic2gsIERNQUNfRFNBRFIoY2hhbm5lbC0+ZGNfaWQpLAorCSAgICBzb3VyY2UpOworCWJ1c19z
cGFjZV93cml0ZV80KHNjLT5wZF9ic3QsIHNjLT5wZF9ic2gsIERNQUNfRFRBRFIoY2hhbm5lbC0+
ZGNfaWQpLAorCSAgICB0YXJnZXQpOworCWJ1c19zcGFjZV93cml0ZV80KHNjLT5wZF9ic3QsIHNj
LT5wZF9ic2gsIERNQUNfRENNRChjaGFubmVsLT5kY19pZCksCisJICAgIGNvbW1hbmQpOworCWRj
c3IgfD0gRENTUl9SVU4gfCBEQ1NSX0JVU0VSUklOVFIgfCBEQ1NSX0VORElOVFI7CisJYnVzX3Nw
YWNlX3dyaXRlXzQoc2MtPnBkX2JzdCwgc2MtPnBkX2JzaCwgRE1BQ19EQ1NSKGNoYW5uZWwtPmRj
X2lkKSwKKwkgICAgZGNzcik7CisKKwljaGFubmVsLT5kY19idXN5ID0gMTsKKworCW10eF91bmxv
Y2tfc3Bpbigmc2MtPnBkX210eCk7CisJcmV0dXJuICgwKTsKK30KKwordm9pZAorcHhhX2RtYWNf
Y2hhbm5lbF9tYXBfdmFsaWQoc3RydWN0IGRtYWNfY2hhbm5lbCAqY2hhbm5lbCwgdWludDMyX3Qg
bWFwX3JlZykKK3sKKwl1aW50MzJfdCB2YWw7CisJc3RydWN0CQlweGFfZG1hY19zb2Z0YyAqc2Mg
PSBkbWFjX3NvZnRjOworCisJdmFsID0gRFJDTVJfTUFQVkxEIHwgY2hhbm5lbC0+ZGNfaWQ7CisJ
YnVzX3NwYWNlX3dyaXRlXzQoc2MtPnBkX2JzdCwgc2MtPnBkX2JzaCwgRE1BQ19EUkNNUihtYXBf
cmVnKSwgdmFsKTsKK30KKwordm9pZAorcHhhX2RtYWNfY2hhbm5lbF9tYXBfaW52YWxpZChzdHJ1
Y3QgZG1hY19jaGFubmVsICpjaGFubmVsLCB1aW50MzJfdCBtYXBfcmVnKQoreworCXN0cnVjdAkJ
cHhhX2RtYWNfc29mdGMgKnNjID0gZG1hY19zb2Z0YzsKKworCWJ1c19zcGFjZV93cml0ZV80KHNj
LT5wZF9ic3QsIHNjLT5wZF9ic2gsIERNQUNfRFJDTVIobWFwX3JlZyksIDApOworfQorCitpbnQK
K3B4YV9kbWFjX3RyYW5zZmVyX2RvbmUoc3RydWN0IGRtYWNfY2hhbm5lbCAqY2hhbm5lbCkKK3sK
KworCXJldHVybiAoIWNoYW5uZWwtPmRjX2J1c3kpOworfQorCitpbnQKK3B4YV9kbWFjX3RyYW5z
ZmVyX2ZhaWxlZChzdHJ1Y3QgZG1hY19jaGFubmVsICpjaGFubmVsKQoreworCisJcmV0dXJuIChj
aGFubmVsLT5kY19lcnJvcik7Cit9CmRpZmYgLXggJypzdm4qJyAtdSAtTiAtZCAtciBmYnNkX2N1
cnJlbnRfMjAwODA4MzAvc3JjL3N5cy9hcm0veHNjYWxlL3B4YS9weGFfbWNpLmMgZmJzZF9qZl9w
cml2L3NyYy9zeXMvYXJtL3hzY2FsZS9weGEvcHhhX21jaS5jCi0tLSBmYnNkX2N1cnJlbnRfMjAw
ODA4MzAvc3JjL3N5cy9hcm0veHNjYWxlL3B4YS9weGFfbWNpLmMJMTk3MC0wMS0wMSAwMjowMDow
MC4wMDAwMDAwMDAgKzAyMDAKKysrIGZic2RfamZfcHJpdi9zcmMvc3lzL2FybS94c2NhbGUvcHhh
L3B4YV9tY2kuYwkyMDA4LTA4LTI5IDE4OjA5OjEzLjAwMDAwMDAwMCArMDIwMApAQCAtMCwwICsx
LDg0OCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSmFjcXVlcyBGb3VyaWUuICBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFV
VEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2Nk
ZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4K
KyNpbmNsdWRlIDxzeXMvc3lzdG0uaD4KKyNpbmNsdWRlIDxzeXMvYmlvLmg+CisjaW5jbHVkZSA8
c3lzL2J1cy5oPgorI2luY2x1ZGUgPHN5cy9jb25mLmg+CisjaW5jbHVkZSA8c3lzL2VuZGlhbi5o
PgorI2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4KKyNpbmNsdWRlIDxzeXMva3RocmVhZC5oPgorI2lu
Y2x1ZGUgPHN5cy9sb2NrLmg+CisjaW5jbHVkZSA8c3lzL21hbGxvYy5oPgorI2luY2x1ZGUgPHN5
cy9tb2R1bGUuaD4KKyNpbmNsdWRlIDxzeXMvbXV0ZXguaD4KKyNpbmNsdWRlIDxzeXMvcXVldWUu
aD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvcm1hbi5oPgorI2lu
Y2x1ZGUgPHN5cy9zeXN0bS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lz
L3RpbWV0Yy5oPgorI2luY2x1ZGUgPHN5cy93YXRjaGRvZy5oPgorCisjaW5jbHVkZSA8bWFjaGlu
ZS9idXMuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL2NwdS5oPgorI2luY2x1ZGUgPG1hY2hpbmUvY3B1
ZnVuYy5oPgorI2luY2x1ZGUgPG1hY2hpbmUvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxtYWNoaW5l
L2ZyYW1lLmg+CisjaW5jbHVkZSA8bWFjaGluZS9pbnRyLmg+CisjaW5jbHVkZSA8YXJtL3hzY2Fs
ZS9weGEvcHhhcmVnLmg+CisjaW5jbHVkZSA8YXJtL3hzY2FsZS9weGEvcHhhdmFyLmg+CisjaW5j
bHVkZSA8ZGV2L21tYy9icmlkZ2UuaD4KKyNpbmNsdWRlIDxkZXYvbW1jL21tY3JlZy5oPgorI2lu
Y2x1ZGUgPGRldi9tbWMvbW1jYnJ2YXIuaD4KKworI2luY2x1ZGUgIm1tY2JyX2lmLmgiCisKKy8v
I2RlZmluZSBERUJVRworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREJHKGZtdCwgLi4uKSBwcmlu
dGYoZm10LCAjI19fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgREJHKGZtdCwgLi4uKQorI2Vu
ZGlmCisKKyNkZWZpbmUgQ0xPQ0tSQVRFX01BWAkyMDAwMDAwMAorI2RlZmluZSBDTE9DS1JBVEVf
TUlOCTMxMjUwMAorI2RlZmluZSBDTE9DS1JBVEUJQ0xPQ0tSQVRFX01BWCAKKyNkZWZpbmUgQkJT
WgkJNTEyCisKK3N0cnVjdCBweGFfbWNpX3NvZnRjIHsKKwl2b2lkICppbnRyaGFuZDsJCQkKKwlk
ZXZpY2VfdCBkZXY7CisJaW50IGZsYWdzOworI2RlZmluZSBDTURfU1RBUlRFRAkxCisjZGVmaW5l
IFNUT1BfU1RBUlRFRAkyCisJc3RydWN0IHJlc291cmNlICppcnFfcmVzOwkKKwlzdHJ1Y3QgcmVz
b3VyY2UJKm1lbV9yZXM7CQorCXN0cnVjdCBtdHggc2NfbXR4OworCXN0cnVjdCBtbWNfaG9zdCBo
b3N0OworCWludCBidXNfYnVzeTsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3Qg
bW1jX2NvbW1hbmQgKmN1cmNtZDsKKwljaGFyIGJvdW5jZV9idWZmZXJbQkJTWl07CisJdWludDMy
X3QgY2xvY2tyYXRlOworCXVpbnQzMl90IGltYXNrOworCXVpbnQzMl90IGNtZGF0OworCWVudW0g
bW1jX3Bvd2VyX21vZGUgcG93ZXJfbW9kZTsKKwl1aW50MzJfdCB4ZmVycmVkOworfTsKKworc3Rh
dGljIGlubGluZSB1aW50OF90CitSRDEoc3RydWN0IHB4YV9tY2lfc29mdGMgKnNjLCBidXNfc2l6
ZV90IG9mZikKK3sKKwlyZXR1cm4gYnVzX3JlYWRfMShzYy0+bWVtX3Jlcywgb2ZmKTsKK30KKwor
c3RhdGljIGlubGluZSB2b2lkCitXUjEoc3RydWN0IHB4YV9tY2lfc29mdGMgKnNjLCBidXNfc2l6
ZV90IG9mZiwgdWludDhfdCB2YWwpCit7CisJYnVzX3dyaXRlXzEoc2MtPm1lbV9yZXMsIG9mZiwg
dmFsKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdAorUkQ0KHN0cnVjdCBweGFfbWNpX3Nv
ZnRjICpzYywgYnVzX3NpemVfdCBvZmYpCit7CisJcmV0dXJuIGJ1c19yZWFkXzQoc2MtPm1lbV9y
ZXMsIG9mZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorV1I0KHN0cnVjdCBweGFfbWNpX3Nv
ZnRjICpzYywgYnVzX3NpemVfdCBvZmYsIHVpbnQzMl90IHZhbCkKK3sKKwlidXNfd3JpdGVfNChz
Yy0+bWVtX3Jlcywgb2ZmLCB2YWwpOworfQorCisvKiBidXMgZW50cnkgcG9pbnRzICovCitzdGF0
aWMgaW50IHB4YV9tY2lfcHJvYmUoZGV2aWNlX3QgZGV2KTsKK3N0YXRpYyBpbnQgcHhhX21jaV9h
dHRhY2goZGV2aWNlX3QgZGV2KTsKK3N0YXRpYyB2b2lkIHB4YV9tY2lfaW50cih2b2lkICopOwor
CisvKiBoZWxwZXIgcm91dGluZXMgKi8KK3N0YXRpYyBpbnQgcHhhX21jaV9hY3RpdmF0ZShkZXZp
Y2VfdCBkZXYpOworc3RhdGljIHZvaWQgcHhhX21jaV9kZWFjdGl2YXRlKGRldmljZV90IGRldik7
CisKKyNkZWZpbmUgUFhBX01DSV9MT0NLKF9zYykJCW10eF9sb2NrKCYoX3NjKS0+c2NfbXR4KQor
I2RlZmluZQlQWEFfTUNJX1VOTE9DSyhfc2MpCQltdHhfdW5sb2NrKCYoX3NjKS0+c2NfbXR4KQor
I2RlZmluZSBQWEFfTUNJX0xPQ0tfSU5JVChfc2MpIFwKKwltdHhfaW5pdCgmX3NjLT5zY19tdHgs
IGRldmljZV9nZXRfbmFtZXVuaXQoX3NjLT5kZXYpLCBcCisJICAgICJtY2kiLCBNVFhfREVGKQor
I2RlZmluZSBQWEFfTUNJX0xPQ0tfREVTVFJPWShfc2MpCW10eF9kZXN0cm95KCZfc2MtPnNjX210
eCk7CisjZGVmaW5lIFBYQV9NQ0lfQVNTRVJUX0xPQ0tFRChfc2MpCW10eF9hc3NlcnQoJl9zYy0+
c2NfbXR4LCBNQV9PV05FRCk7CisjZGVmaW5lIFBYQV9NQ0lfQVNTRVJUX1VOTE9DS0VEKF9zYykg
bXR4X2Fzc2VydCgmX3NjLT5zY19tdHgsIE1BX05PVE9XTkVEKTsKKworc3RhdGljIHZvaWQKK3B4
YV9tY2lfc3RvcF9jbG9jayhzdHJ1Y3QgcHhhX21jaV9zb2Z0YyAqc2MpCit7CisJdV9pbnQzMl90
IHRpbWVvdXQgPSAxMDAwMDsKKwl1X2ludDMyX3QgdmFsOworCisJaWYgKCh2YWwgPSBSRDQoc2Ms
IE1NQ19TVEFUKSkgJiBTVEFUX0NMS19FTikgeworCQkvKiBUcnkgdG8gc3RvcCBjbG9jayAqLwor
CQlXUjQoc2MsIE1NQ19TVFJQQ0wsIFNUUlBDTF9TVE9QKTsJCisJCS8qIFBvbGwgc3RhdHVzIHdp
dGggdGltZW91dCAqLworCQlkbyB7CisJCQlpZiAoKCh2YWwgPSBSRDQoc2MsIE1NQ19TVEFUKSkg
JiBTVEFUX0NMS19FTikgPT0gMCkKKwkJCQlicmVhazsKKwkJCURFTEFZKDEpOwkKKwkJfSB3aGls
ZSAodGltZW91dC0tKTsKKwkJCisJCWlmICh2YWwgJiBTVEFUX0NMS19FTikKKwkJCURCRygiRmFp
bGVkIHRvIHN0b3AgY2xvY2tcbiIpOwkKKwl9Cit9CisKKy8qCisgKiBTdGFydHMgdGhlIE1NQyBj
bG9jay4gQXNzdW1lcyB0aGF0IHNjLT5jbG9ja3JhdGUgaGFzIAorICogYmVlbiBzZXQuCisgKi8K
K3N0YXRpYyB2b2lkCitweGFfbWNpX3N0YXJ0X2Nsb2NrKHN0cnVjdCBweGFfbWNpX3NvZnRjICpz
YykKK3sKKwl1aW50MzJfdCB2YWw7CisKKwl2YWwgPSBSRDQoc2MsIE1NQ19TVEFUKTsKKwlpZiAo
dmFsICYgU1RBVF9DTEtfRU4pCisJCURCRygiY2xvY2sgZW5hYmxlZCBiZWZvcmUgc3RhcnQhXG4i
KTsKKworCURCRygiU3RhcnQgY2xvY2ssIGNsb2NrcmF0ZSA9ICUwOFhcbiIsIHNjLT5jbG9ja3Jh
dGUpOworCVdSNChzYywgTU1DX0NMS1JULCBzYy0+Y2xvY2tyYXRlKTsJCisJV1I0KHNjLCBNTUNf
U1RSUENMLCBTVFJQQ0xfU1RBUlQpOworfQorCisvKgorICogc29mdGMgbG9jayBtdXN0IGJlIGhl
bGQgd2hlbiBtYWtpbmcgdGhpcyBjYWxsISAKKyAqLworc3RhdGljIHZvaWQKK3B4YV9tY2lfaXJx
X2Rpc2FibGUoc3RydWN0IHB4YV9tY2lfc29mdGMgKnNjLCB1aW50MzJfdCBtYXNrKQoreworCXNj
LT5pbWFzayB8PSBtYXNrOworCVdSNChzYywgTU1DX0lfTUFTSywgc2MtPmltYXNrKTsKK30KKwor
LyoKKyAqIHNvZnRjIGxvY2sgbXVzdCBiZSBoZWxkIHdoZW4gbWFraW5nIHRoaXMgY2FsbCEgCisg
Ki8KK3N0YXRpYyB2b2lkCitweGFfbWNpX2lycV9lbmFibGUoc3RydWN0IHB4YV9tY2lfc29mdGMg
KnNjLCB1aW50MzJfdCBtYXNrKQoreworCXNjLT5pbWFzayAmPSB+bWFzazsKKwlXUjQoc2MsIE1N
Q19JX01BU0ssIHNjLT5pbWFzayk7Cit9CisKK3N0YXRpYyBpbnQKK3B4YV9tY2lfcHJvYmUoZGV2
aWNlX3QgZGV2KQoreworCisJZGV2aWNlX3NldF9kZXNjKGRldiwgIk1DSSBtbWMvc2QgaG9zdCBi
cmlkZ2UiKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitweGFfbWNpX2F0dGFjaChk
ZXZpY2VfdCBkZXYpCit7CisJc3RydWN0IHB4YV9tY2lfc29mdGMgKnNjID0gZGV2aWNlX2dldF9z
b2Z0YyhkZXYpOworCWludCBlcnI7CisJZGV2aWNlX3QgY2hpbGQ7CisKKwkvKiAKKwkgKiBQcm9n
cmFtIEdQSU8gZm9yIGFsdGVybmF0ZSBmdW5jdGlvbnMKKwkgKiB1c2VkIGJ5IE1NQyBjb250cm9s
bGVyLiBJcyB0aGlzIHRoZQorCSAqIGNvcnJlY3QgcGxhY2U/CisJICovCisJcHhhX2dwaW9fc2V0
X2Z1bmN0aW9uKDYsIEdQSU9fQUxUX0ZOXzFfT1VUKTsKKwlweGFfZ3Bpb19zZXRfZnVuY3Rpb24o
NTMsIEdQSU9fQUxUX0ZOXzFfT1VUKTsKKwlweGFfZ3Bpb19zZXRfZnVuY3Rpb24oOCwgR1BJT19B
TFRfRk5fMV9PVVQpOworCisJc2MtPmRldiA9IGRldjsKKwlzYy0+aW1hc2sgPSBNTUNfSV9NQVNL
X0FMTDsgCisJCisJZXJyID0gcHhhX21jaV9hY3RpdmF0ZShkZXYpOworCWlmIChlcnIpCisJCWdv
dG8gb3V0OworCisJUFhBX01DSV9MT0NLX0lOSVQoc2MpOworCisJLyogU3RvcCB0aGUgY2xvY2sg
Ki8KKwlweGFfbWNpX3N0b3BfY2xvY2soc2MpOworCS8qIEluaXQgU1BJIGFuZCBSRVNUTyAqLwor
CVdSNChzYywgTU1DX1NQSSwgMCk7CisJV1I0KHNjLCBNTUNfUkVTVE8sIE1NQ19SRVNUT19ERUZB
VUxUKTsKKwkvKiBNYXNrIGFsbCBpbnRlcnJ1cHRzICovCisJV1I0KHNjLCBNTUNfSV9NQVNLLCBz
Yy0+aW1hc2spOworCisJLyoKKwkgKiBBY3RpdmF0ZSB0aGUgaW50ZXJydXB0CisJICovCisJZXJy
ID0gYnVzX3NldHVwX2ludHIoZGV2LCBzYy0+aXJxX3JlcywgSU5UUl9UWVBFX01JU0MgfCBJTlRS
X01QU0FGRSwKKwkgICAgTlVMTCwgcHhhX21jaV9pbnRyLCBzYywgJnNjLT5pbnRyaGFuZCk7CisJ
aWYgKGVycikgeworCQlQWEFfTUNJX0xPQ0tfREVTVFJPWShzYyk7CisJCWdvdG8gb3V0OworCX0K
KwlzYy0+aG9zdC5mX21pbiA9IENMT0NLUkFURV9NSU47CisJc2MtPmhvc3QuZl9tYXggPSBDTE9D
S1JBVEVfTUFYOworCXNjLT5ob3N0Lmhvc3Rfb2NyID0gTU1DX09DUl8zMjBfMzMwIHwgTU1DX09D
Ul8zMzBfMzQwOworCS8vc2MtPmhvc3QuY2FwcyA9IE1NQ19DQVBfNF9CSVRfREFUQTsKKwljaGls
ZCA9IGRldmljZV9hZGRfY2hpbGQoZGV2LCAibW1jIiwgMCk7CisJZGV2aWNlX3NldF9pdmFycyhk
ZXYsICZzYy0+aG9zdCk7CisJZXJyID0gYnVzX2dlbmVyaWNfYXR0YWNoKGRldik7CitvdXQ6Owor
CWlmIChlcnIpCisJCXB4YV9tY2lfZGVhY3RpdmF0ZShkZXYpOworCXJldHVybiAoZXJyKTsKK30K
Kworc3RhdGljIGludAorcHhhX21jaV9hY3RpdmF0ZShkZXZpY2VfdCBkZXYpCit7CisJc3RydWN0
IHB4YV9tY2lfc29mdGMgKnNjOworCWludCByaWQ7CisKKwlzYyA9IGRldmljZV9nZXRfc29mdGMo
ZGV2KTsKKwlyaWQgPSAwOworCXNjLT5tZW1fcmVzID0gYnVzX2FsbG9jX3Jlc291cmNlX2FueShk
ZXYsIFNZU19SRVNfTUVNT1JZLCAmcmlkLAorCSAgICBSRl9BQ1RJVkUpOworCWlmIChzYy0+bWVt
X3JlcyA9PSBOVUxMKQorCQlnb3RvIGVycm91dDsKKwlyaWQgPSAwOworCXNjLT5pcnFfcmVzID0g
YnVzX2FsbG9jX3Jlc291cmNlX2FueShkZXYsIFNZU19SRVNfSVJRLCAmcmlkLAorCSAgICBSRl9B
Q1RJVkUpOworCWlmIChzYy0+aXJxX3JlcyA9PSBOVUxMKQorCQlnb3RvIGVycm91dDsKKwlyZXR1
cm4gKDApOworZXJyb3V0OgorCXB4YV9tY2lfZGVhY3RpdmF0ZShkZXYpOworCXJldHVybiAoRU5P
TUVNKTsKK30KKworc3RhdGljIHZvaWQKK3B4YV9tY2lfZGVhY3RpdmF0ZShkZXZpY2VfdCBkZXYp
Cit7CisJc3RydWN0IHB4YV9tY2lfc29mdGMgKnNjOworCisJc2MgPSBkZXZpY2VfZ2V0X3NvZnRj
KGRldik7CisJaWYgKHNjLT5pbnRyaGFuZCkKKwkJYnVzX3RlYXJkb3duX2ludHIoZGV2LCBzYy0+
aXJxX3Jlcywgc2MtPmludHJoYW5kKTsKKwlzYy0+aW50cmhhbmQgPSAwOworCWJ1c19nZW5lcmlj
X2RldGFjaChzYy0+ZGV2KTsKKwlpZiAoc2MtPm1lbV9yZXMpCisJCWJ1c19yZWxlYXNlX3Jlc291
cmNlKGRldiwgU1lTX1JFU19NRU1PUlksCisJCSAgICBybWFuX2dldF9yaWQoc2MtPm1lbV9yZXMp
LCBzYy0+bWVtX3Jlcyk7CisJc2MtPm1lbV9yZXMgPSAwOworCWlmIChzYy0+aXJxX3JlcykKKwkJ
YnVzX3JlbGVhc2VfcmVzb3VyY2UoZGV2LCBTWVNfUkVTX0lSUSwKKwkJICAgIHJtYW5fZ2V0X3Jp
ZChzYy0+aXJxX3JlcyksIHNjLT5pcnFfcmVzKTsKKwlzYy0+aXJxX3JlcyA9IDA7CisJcmV0dXJu
OworfQorCitzdGF0aWMgaW50CitweGFfbWNpX3VwZGF0ZV9pb3MoZGV2aWNlX3QgYnJkZXYsIGRl
dmljZV90IHJlcWRldikKK3sKKwlzdHJ1Y3QgcHhhX21jaV9zb2Z0YyAqc2M7CisJc3RydWN0IG1t
Y19ob3N0ICpob3N0OworCXN0cnVjdCBtbWNfaW9zICppb3M7CisJdWludDMyX3QgY2xrZGl2Owor
CisJc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGJyZGV2KTsKKwlob3N0ID0gJnNjLT5ob3N0OworCWlv
cyA9ICZob3N0LT5pb3M7CisJCisJaWYgKGlvcy0+Y2xvY2sgPT0gMCkgeworCQlEQkcoImlvcy0+
Y2xvY2sgPT0gMFxuIik7CisJCXB4YV9tY2lfc3RvcF9jbG9jayhzYyk7CisJCS8qIERpc2FibGUg
TU1DIGNsb2NrICovCisJCXB4YV9zZXRfY2tlbihDS0VOX01NQywgMCk7CisJfSBlbHNlIHsKKwkJ
REJHKCJpb3MtPmNsb2NrID0gJWRcbiIsIGlvcy0+Y2xvY2spOworCQkvKiBDYWxjdWxhdGUgY2xv
Y2sgcmF0ZS4KKwkJICogV3JpdGUgb24gbmV4dCBjb21tYW5kLgorCQkgKi8KKwkJY2xrZGl2ID0g
Q0xPQ0tSQVRFIC8gaW9zLT5jbG9jazsKKwkJaWYgKGNsa2RpdiA+ICgxPDw2KSkKKwkJCWNsa2Rp
diA9ICgxPDw2KTsKKwkJc2MtPmNsb2NrcmF0ZSA9IGZscyhjbGtkaXYpIC0gMTsKKwkJLyogRW5h
YmxlIE1NQyBjbG9jayAqLworCQlweGFfc2V0X2NrZW4oQ0tFTl9NTUMsIDEpOworCX0KKworCWlm
IChzYy0+cG93ZXJfbW9kZSAhPSBpb3MtPnBvd2VyX21vZGUpIHsKKwkJc2MtPnBvd2VyX21vZGUg
PSBpb3MtPnBvd2VyX21vZGU7CisKKwkJaWYgKGlvcy0+cG93ZXJfbW9kZSA9PSBwb3dlcl9vbikg
eworCQkJc2MtPmNtZGF0IHw9IENNREFUX0lOSVQ7CisJCQlEQkcoIlNldHRpbmcgSU5JVFxuIik7
CisJCX0KKwl9CisKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgCitweGFfbWNpX3Nl
dHVwX2RhdGEoc3RydWN0IHB4YV9tY2lfc29mdGMgKnNjLCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEp
Cit7CisJdW5zaWduZWQgaW50IG51bWJsb2NrczsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgKnJlcTsK
KworCXJlcSA9IGRhdGEtPm1ycTsKKworCW51bWJsb2NrcyA9IChkYXRhLT5sZW4gKyBCQlNaIC0g
MSkgLyBCQlNaOworCisJaWYgKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfU1RSRUFNKQorCQludW1i
bG9ja3MgPSAweGZmZmY7CisJCisJV1I0KHNjLCBNTUNfQkxLTEVOLCBCQlNaKTsKKwlXUjQoc2Ms
IE1NQ19OT0IsIG51bWJsb2Nrcyk7CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFE
KSB7CisJCTsKKwl9IGVsc2UgeworCQlpZiAoZGF0YS0+bGVuICE9IEJCU1opIAorCQkJcGFuaWMo
Ik11bHRpYmxvY2sgd3JpdGUgc3VwcG9ydCIpOworCQliY29weShkYXRhLT5kYXRhLCBzYy0+Ym91
bmNlX2J1ZmZlciwgZGF0YS0+bGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZv
aWQKK3B4YV9tY2lfc3RhcnRfY21kKHN0cnVjdCBweGFfbWNpX3NvZnRjICpzYywgc3RydWN0IG1t
Y19jb21tYW5kICpjbWQsIHVpbnQzMl90IGNtZGF0KQoreworCXN0cnVjdCBtbWNfZGF0YSAqZGF0
YSA9IE5VTEw7CisJc3RydWN0IG1tY19yZXF1ZXN0ICpyZXEgPSBOVUxMOworCWludCBlcnI7CisK
KwlzYy0+Y3VyY21kID0gY21kOworCWRhdGEgPSBjbWQtPmRhdGE7CisJcmVxID0gc2MtPnJlcTsK
KwkvKmlmIChkYXRhICE9IE5VTEwpCisJCXJlcSA9IGRhdGEtPm1ycTsKKwllbHNlCisJCXJlcSA9
IGNtZC0+bXJxOworCSovCisKKwkvKiBTdG9wIHRoZSBjbG9jayAqLworCXB4YV9tY2lfc3RvcF9j
bG9jayhzYyk7CisKKyNpZmRlZiBSU1BfVFlQRQorI3VuZGVmIFJTUF9UWVBFCisjZW5kaWYKKwor
I2RlZmluZSBSU1BfVFlQRSh4KQkoKHgpICYgTU1DX1JTUF9NQVNLICYgfihNTUNfUlNQX0JVU1l8
TU1DX1JTUF9PUENPREUpKQorCisJaWYgKGNtZC0+ZmxhZ3MgJiBNTUNfUlNQX0JVU1kpCisJCWNt
ZGF0IHw9IENNREFUX0JVU1k7CisJaWYgKE1NQ19SU1AoY21kLT5mbGFncykgPT0gTU1DX1JTUF9O
T05FKQorCQljbWRhdCB8PSBDTURBVF9SRVNQT05TRV9GT1JNQVRfTk87CisJc3dpdGNoIChSU1Bf
VFlQRShjbWQtPmZsYWdzKSkgeworCWNhc2UgUlNQX1RZUEUoTU1DX1JTUF9SMSk6IC8qIHIxLCBy
MWIsIHI2LCByNyAqLworCQljbWRhdCB8PSBDTURBVF9SRVNQT05TRV9GT1JNQVRfUjE7IAorCQli
cmVhazsKKwljYXNlIFJTUF9UWVBFKE1NQ19SU1BfUjIpOgorCQljbWRhdCB8PSBDTURBVF9SRVNQ
T05TRV9GT1JNQVRfUjI7IAorCQlicmVhazsKKwljYXNlIFJTUF9UWVBFKE1NQ19SU1BfUjMpOgor
CQljbWRhdCB8PSBDTURBVF9SRVNQT05TRV9GT1JNQVRfUjM7IAorCQlicmVhazsKKwlkZWZhdWx0
OgorCQlicmVhazsKKwl9CisKKwlEQkcoInJlcSA9ICVwLCBkYXRhID0gJXAsIGNtZCA9ICVwLCBv
cGNvZGUgPSAlZFxuIiwgcmVxLCBkYXRhLCBjbWQsIGNtZC0+b3Bjb2RlKTsKKworI3VuZGVmIFJT
UF9UWVBFCisKKwlpZiAoZGF0YSAhPSBOVUxMKSB7CisJCS8qIFNldHVwIG9mIGRhdGEgdHJhbnNm
ZXIgKi8KKwkJaWYgKChlcnIgPSBweGFfbWNpX3NldHVwX2RhdGEoc2MsIGRhdGEpKSAhPSAwKSB7
CisJCQlEQkcoIkRhdGEgc2V0dXAgZmFpbGVkIDogJWQsICVwLCAlcFxuIiwgZXJyLCByZXEsIHJl
cS0+Y21kKTsKKwkJCS8qIE1hcmsgcmVxdWVzdCBhcyBkb25lICovCisJCQlpZiAocmVxLT5jbWQt
PmZsYWdzICYgU1RPUF9TVEFSVEVEKQorCQkJCXJlcS0+c3RvcC0+ZXJyb3IgPSBNTUNfRVJSX05P
X01FTU9SWTsKKwkJCWVsc2UKKwkJCQlyZXEtPmNtZC0+ZXJyb3IgPSBNTUNfRVJSX05PX01FTU9S
WTsKKwkJCXNjLT5yZXEgPSBOVUxMOworCQkJc2MtPmN1cmNtZCA9IE5VTEw7CisJCQlyZXEtPmRv
bmUocmVxKTsKKwkJCXJldHVybjsKKwkJfQorCQljbWRhdCAmPSB+Q01EQVRfQlVTWTsgCisJCWNt
ZGF0IHw9IENNREFUX0RBVEFfRU47CisJCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1dSSVRF
KQorCQkJY21kYXQgfD0gQ01EQVRfV1JJVEU7CisJCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRB
X1NUUkVBTSkKKwkJCWNtZGF0IHw9IENNREFUX1NUUkVBTV9CTE9DSzsKKwl9CisKKwlEQkcoImNt
ZGF0ID0gJTA4WCBvcGNvZGUgPSAlZFxuIiwgY21kYXQsIGNtZC0+b3Bjb2RlKTsKKwkKKwlXUjQo
c2MsIE1NQ19DTUQsIGNtZC0+b3Bjb2RlKTsgCisJV1I0KHNjLCBNTUNfQVJHSCwgY21kLT5hcmcg
Pj4gMTYpOworCVdSNChzYywgTU1DX0FSR0wsIGNtZC0+YXJnICYgMHhmZmZmKTsKKwlXUjQoc2Ms
IE1NQ19DTURBVCwgY21kYXQpOworCXB4YV9tY2lfc3RhcnRfY2xvY2soc2MpOworCXB4YV9tY2lf
aXJxX2VuYWJsZShzYywgTU1DX0lfRU5EX0NNRF9SRVMpOworCXJldHVybjsKK30KKworc3RhdGlj
IHZvaWQKK3B4YV9tY2lfc3RhcnQoc3RydWN0IHB4YV9tY2lfc29mdGMgKnNjKQoreworCXN0cnVj
dCBtbWNfcmVxdWVzdCAqcmVxOworCXVpbnQzMl90IGNtZGF0OworCisJcmVxID0gc2MtPnJlcTsK
KwlpZiAocmVxID09IE5VTEwpCisJCXJldHVybjsKKwkKKwljbWRhdCA9IHNjLT5jbWRhdDsKKwlz
Yy0+Y21kYXQgJj0gfkNNREFUX0lOSVQ7CisKKwkvLyBhc3NlcnQgbG9ja2VkCisJaWYgKCEoc2Mt
PmZsYWdzICYgQ01EX1NUQVJURUQpKSB7CisJCXNjLT5mbGFncyB8PSBDTURfU1RBUlRFRDsKKwkJ
REJHKCJTdGFydGluZyBDTURcbiIpOworCQlweGFfbWNpX3N0YXJ0X2NtZChzYywgcmVxLT5jbWQs
IGNtZGF0KTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIShzYy0+ZmxhZ3MgJiBTVE9QX1NUQVJURUQp
ICYmIHJlcS0+c3RvcCkgeworCQlEQkcoIlN0YXJ0aW5nIFN0b3BcbiIpOworCQlzYy0+ZmxhZ3Mg
fD0gU1RPUF9TVEFSVEVEOworCQlweGFfbWNpX3N0YXJ0X2NtZChzYywgcmVxLT5zdG9wLCBjbWRh
dCk7CisJCXJldHVybjsKKwl9CisJLyogV2UgbXVzdCBiZSBkb25lIC0tIGJhZCBpZGVhIHRvIGRv
IHRoaXMgd2hpbGUgbG9ja2VkPyAqLworCXNjLT5yZXEgPSBOVUxMOworCXNjLT5jdXJjbWQgPSBO
VUxMOworCXJlcS0+ZG9uZShyZXEpOworfQorCitzdGF0aWMgaW50CitweGFfbWNpX3JlcXVlc3Qo
ZGV2aWNlX3QgYnJkZXYsIGRldmljZV90IHJlcWRldiwgc3RydWN0IG1tY19yZXF1ZXN0ICpyZXEp
Cit7CisJc3RydWN0IHB4YV9tY2lfc29mdGMgKnNjID0gZGV2aWNlX2dldF9zb2Z0YyhicmRldik7
CisKKwlEQkcoIlJlcXVlc3QgOiAlcFxuIiwgcmVxKTsKKworCVBYQV9NQ0lfTE9DSyhzYyk7CisJ
Ly8gWFhYIGRvIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBxdWV1ZSB1cCBtdWx0aXBsZSBjb21tYW5k
cz8KKwkvLyBYWFggc291bmRzIGxpa2UgYSBnb29kIGlkZWEsIGJ1dCBhbGwgcHJvdG9jb2xzIGFy
ZSBzeW5jLCBzbworCS8vIFhYWCBtYXliZSB0aGUgaWRlYSBpcyBuYWl2ZS4uLgorCWlmIChzYy0+
cmVxICE9IE5VTEwpIHsKKwkJUFhBX01DSV9VTkxPQ0soc2MpOworCQlEQkcoInNjLT5yZXEgIT0g
TlVMTFxuIik7CisJCXJldHVybiBFQlVTWTsKKwl9CisJc2MtPnJlcSA9IHJlcTsKKwlzYy0+Zmxh
Z3MgPSAwOworCXB4YV9tY2lfc3RhcnQoc2MpOworCVBYQV9NQ0lfVU5MT0NLKHNjKTsKKwlyZXR1
cm4gKDApOworfQorCitzdGF0aWMgdm9pZAorcHhhX21jaV9jbWRfZG9uZShzdHJ1Y3QgcHhhX21j
aV9zb2Z0YyAqc2MsIHVpbnQzMl90IHN0YXQpCit7CisJc3RydWN0IG1tY19jb21tYW5kICpjbWQ7
CisJdWludDMyX3QgdmFsMCwgdmFsMSwgdmFsMjsKKwlpbnQgaTsKKwlzdGF0aWMgdWludDMyX3Qg
cHJldl9vcGNvZGUgPSAyNTY7CisKKwlpZiAoc2MtPmN1cmNtZCA9PSBOVUxMKQorCQlyZXR1cm47
CisJCisJY21kID0gc2MtPmN1cmNtZDsKKwkKKwlweGFfbWNpX2lycV9kaXNhYmxlKHNjLCBNTUNf
SV9FTkRfQ01EX1JFUyk7CisJCisJLyoKKwkgKiBEaXNjYXJkIHVwcGVyIDggYml0cyBvZiBmaXJz
dCAxNi1iaXQgd29yZC4KKwkgKi8KKwlEQkcoImNtZCByZXNwb25zZSA9ICIpOworCXZhbDAgPSBS
RDQoc2MsIE1NQ19SRVMpICYgMHhmZmZmOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJ
dmFsMSA9IFJENChzYywgTU1DX1JFUykgJiAweGZmZmY7CisJCXZhbDIgPSBSRDQoc2MsIE1NQ19S
RVMpICYgMHhmZmZmOworCQljbWQtPnJlc3BbaV0gPSB2YWwwIDw8IDI0IHwgdmFsMSA8PCA4IHwg
dmFsMiA+PiA4OworCQl2YWwwID0gdmFsMjsKKwkJREJHKCIlMDhYICIsIGNtZC0+cmVzcFtpXSk7
CisJfQorCURCRygiXG4iKTsKKwkKKwljbWQtPmVycm9yID0gTU1DX0VSUl9OT05FOworCisJaWYg
KHN0YXQgJiBTVEFUX1RJTUVPVVRfUkVTUE9OU0UpIHsKKwkJY21kLT5lcnJvciA9IE1NQ19FUlJf
VElNRU9VVDsKKwkJaWYgKGNtZC0+b3Bjb2RlICE9IDggJiYgY21kLT5vcGNvZGUgIT0gNDEgJiYg
Y21kLT5vcGNvZGUgIT0gNTUpIHsKKwkJCURCRygiUmVzcG9uc2UgdGltZW91dCA6IG9wY29kZSA9
ICVkLCBwcmV2ID0gJWRcbiIsIAorCQkJICAgIGNtZC0+b3Bjb2RlLCBwcmV2X29wY29kZSk7CisJ
CX0KKwl9CisJZWxzZSBpZiAoc3RhdCAmIFNUQVRfUkVTX0NSQ19FUlIgJiYgY21kLT5mbGFncyAm
IE1NQ19SU1BfQ1JDKSB7CisJCWNtZC0+ZXJyb3IgPSBNTUNfRVJSX0JBRENSQzsKKwkJREJHKCJj
bWQgY3JjIGVycm9yXG4iKTsKKwl9CisKKwlwcmV2X29wY29kZSA9IGNtZC0+b3Bjb2RlOworCisJ
aWYgKGNtZC0+ZGF0YSAmJiBjbWQtPmVycm9yID09IE1NQ19FUlJfTk9ORSkgeworCQlpZiAoY21k
LT5kYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpIHsKKwkJCXNjLT54ZmVycmVkID0gMDsgCisJ
CQlweGFfbWNpX2lycV9lbmFibGUoc2MsIE1NQ19JX1JYRklGT19SRF9SRVEpOworCQl9CisJCWVs
c2UgaWYgKGNtZC0+ZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9XUklURSkgeworCQkJc2MtPnhmZXJy
ZWQgPSAwOworCQkJcHhhX21jaV9pcnFfZW5hYmxlKHNjLCBNTUNfSV9UWEZJRk9fV1JfUkVRKTsK
KwkJfQorCX0gZWxzZSB7CisJCXB4YV9tY2lfc3RhcnQoc2MpOworCX0KK30KKworc3RhdGljIHZv
aWQKK3B4YV9tY2lfZGF0YV9kb25lKHN0cnVjdCBweGFfbWNpX3NvZnRjICpzYywgdWludDMyX3Qg
c3RhdCkKK3sKKwlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGE7CisJc3RydWN0IG1tY19jb21tYW5kICpj
bWQ7CisKKwlpZiAoc2MtPmN1cmNtZCA9PSBOVUxMIHx8IHNjLT5jdXJjbWQtPmRhdGEgPT0gTlVM
TCkKKwkJcmV0dXJuOworCQorCWNtZCA9IHNjLT5jdXJjbWQ7CisJZGF0YSA9IGNtZC0+ZGF0YTsK
KworCWlmIChzdGF0ICYgU1RBVF9SRUFEX1RJTUVfT1VUKQorCQljbWQtPmVycm9yID0gTU1DX0VS
Ul9USU1FT1VUOworCWVsc2UgaWYgKHN0YXQgJiAoU1RBVF9DUkNfUkVBRF9FUlJPUiB8IFNUQVRf
Q1JDX1dSSVRFX0VSUk9SKSkgeworCQljbWQtPmVycm9yID0gTU1DX0VSUl9CQURDUkM7CisJCURC
RygiQ1JDIGVycm9yIDogJTA4WFxuIiwgc3RhdCk7CisJfQorCWVsc2UgaWYgKGRhdGEtPmZsYWdz
ICYgTU1DX0RBVEFfUkVBRCAmJgorCSAgICAoc3RhdCAmIFNUQVRfUkVDVl9GSUZPX0ZVTEwpKSB7
CisJCURCRygiUlggZmlmbyBmdWxsXG4iKTsKKwl9CisJZWxzZSBpZiAoZGF0YS0+ZmxhZ3MgJiBN
TUNfREFUQV9XUklURSAmJgorCSAgICAoc3RhdCAmIFNUQVRfWE1JVF9GSUZPX0VNUFRZKSkgewor
CQlEQkcoIlRYIGZpZm8gZW1wdHlcbiIpOworCX0KKworCS8qCisJICogRnJvbSBMaW51eDoKKwkg
KiBUaGVyZSBhcHBlYXJzIHRvIGJlIGEgaGFyZHdhcmUgZGVzaWduIGJ1ZyBoZXJlLiAgVGhlcmUg
c2VlbXMgdG8KKwkgKiBiZSBubyB3YXkgdG8gZmluZCBvdXQgaG93IG11Y2ggZGF0YSB3YXMgdHJh
bnNmZXJyZWQgdG8gdGhlIGNhcmQuCisJICogVGhpcyBtZWFucyB0aGF0IGlmIHRoZXJlIHdhcyBh
biBlcnJvciBvbiBhbnkgYmxvY2ssIHdlIG1hcmsgYWxsCisJICogZGF0YSBibG9ja3MgYXMgYmVp
bmcgaW4gZXJyb3IuCisJICovCisJaWYgKGNtZC0+ZXJyb3IgIT0gTU1DX0VSUl9OT05FKSB7CisJ
CURCRygiU2V0dGluZyB0cmFuc2ZlciBsZW4gdG8gMFxuIik7CisJCWRhdGEtPnhmZXJfbGVuID0g
MDsKKwl9CisKKwlweGFfbWNpX2lycV9kaXNhYmxlKHNjLCBNTUNfSV9EQVRBX1RSQU5fRE9ORSk7
CisKKwlweGFfbWNpX3N0YXJ0KHNjKTsKK30KKworc3RhdGljIHZvaWQKK3B4YV9tY2lfeGZlcl9k
YXRhKHN0cnVjdCBweGFfbWNpX3NvZnRjICpzYywgdW5zaWduZWQgY2hhciB3cml0ZSwgdWludDMy
X3Qgc3RhdCkKK3sKKwlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEgPSBOVUxMOworCXN0cnVjdCBtbWNf
cmVxdWVzdCAqcmVxID0gTlVMTDsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCA9IE5VTEw7CisJ
aW50IGk7CisJdW5zaWduZWQgY2hhciAqZGVzdCA9IE5VTEw7CisJdWludDMyX3Qgc3IgPSAwOwor
CisJY21kID0gc2MtPmN1cmNtZDsKKwlkYXRhID0gY21kLT5kYXRhOworCXJlcSA9IHNjLT5yZXE7
CisJCisJc3IgPSBSRDQoc2MsIE1NQ19TVEFUKTsKKworCWlmICh3cml0ZSkgeworCQlweGFfbWNp
X2lycV9kaXNhYmxlKHNjLCBNTUNfSV9UWEZJRk9fV1JfUkVRKTsKKwkJZm9yIChpID0gMDsgaSA8
IDMyOyBpKyspIAorCQkJV1IxKHNjLCBNTUNfVFhGSUZPLCBzYy0+Ym91bmNlX2J1ZmZlcltpICsg
c2MtPnhmZXJyZWRdKTsKKwkJc2MtPnhmZXJyZWQgKz0gMzI7CisJCWlmIChzYy0+eGZlcnJlZCA8
IGRhdGEtPmxlbikKKwkJCXB4YV9tY2lfaXJxX2VuYWJsZShzYywgTU1DX0lfVFhGSUZPX1dSX1JF
USk7CQkKKwl9CisJZWxzZSB7CisJCXB4YV9tY2lfaXJxX2Rpc2FibGUoc2MsIE1NQ19JX1JYRklG
T19SRF9SRVEpOworCQlkZXN0ID0gKHVuc2lnbmVkIGNoYXIgKikoZGF0YS0+ZGF0YSk7CisJCWZv
ciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQkJZGVzdFtpICsgc2MtPnhmZXJyZWRdID0gUkQxKHNj
LCBNTUNfUlhGSUZPKTsJCisJCXNjLT54ZmVycmVkICs9IDMyOworCQlpZiAoc2MtPnhmZXJyZWQg
PCBkYXRhLT5sZW4pCisJCQlweGFfbWNpX2lycV9lbmFibGUoc2MsIE1NQ19JX1JYRklGT19SRF9S
RVEpOworCX0KKworCWlmIChzYy0+eGZlcnJlZCA+PSBkYXRhLT5sZW4pIAorCQlweGFfbWNpX2ly
cV9lbmFibGUoc2MsIE1NQ19JX0RBVEFfVFJBTl9ET05FKTsgCit9CisKK3N0YXRpYyB2b2lkCitw
eGFfbWNpX2ludHIodm9pZCAqYXJnKQoreworCXN0cnVjdCBweGFfbWNpX3NvZnRjICpzYyA9IChz
dHJ1Y3QgcHhhX21jaV9zb2Z0YyopYXJnOworCXVpbnQzMl90IHNyLCBpcjsKKwlzdHJ1Y3QgbW1j
X2RhdGEgKmRhdGEgPSBOVUxMOworCXN0cnVjdCBtbWNfcmVxdWVzdCAqcmVxID0gTlVMTDsKKwlz
dHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCA9IE5VTEw7CisJCisJUFhBX01DSV9MT0NLKHNjKTsKKwor
CWlyID0gUkQ0KHNjLCBNTUNfSV9SRUcpOworCQorCWNtZCA9IHNjLT5jdXJjbWQ7CisJZGF0YSA9
IGNtZC0+ZGF0YTsKKwlyZXEgPSBzYy0+cmVxOworCisJREJHKCJJUiA9ICUwOFhcbiIsIGlyKTsK
KworCWlmIChpciAhPSAwKSB7CisJCXNyID0gUkQ0KHNjLCBNTUNfU1RBVCk7CisKKwkJREJHKCJT
UiA9ICUwOFhcbiIsIHNyKTsKKworCQlpZiAoaXIgJiBNTUNfSV9FTkRfQ01EX1JFUykKKwkJCXB4
YV9tY2lfY21kX2RvbmUoc2MsIHNyKTsKKwkJaWYgKGlyICYgTU1DX0lfUlhGSUZPX1JEX1JFUSkK
KwkJCXB4YV9tY2lfeGZlcl9kYXRhKHNjLCAwLCBzcik7CisJCWlmIChpciAmIE1NQ19JX1RYRklG
T19XUl9SRVEpCisJCQlweGFfbWNpX3hmZXJfZGF0YShzYywgMSwgc3IpOworCQlpZiAoaXIgJiBN
TUNfSV9EQVRBX1RSQU5fRE9ORSkgeworCQkJaWYgKChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1dS
SVRFKSAmJgorCQkJICAgICEoc3IgJiBTVEFUX1BSR19ET05FKSkgeworCQkJCXB4YV9tY2lfaXJx
X2Rpc2FibGUoc2MsIE1NQ19JX0RBVEFfVFJBTl9ET05FKTsKKwkJCQkvKiBXYWl0IGZvciBwcmdf
ZG9uZSAqLworCQkJCXB4YV9tY2lfaXJxX2VuYWJsZShzYywgTU1DX0lfUFJHX0RPTkUpOyAKKwkJ
CX0KKwkJCWVsc2UKKwkJCQlweGFfbWNpX2RhdGFfZG9uZShzYywgc3IpOworCQl9CisJCWlmIChp
ciAmIE1NQ19JX1BSR19ET05FKSB7CisJCQlweGFfbWNpX2lycV9kaXNhYmxlKHNjLCBNTUNfSV9Q
UkdfRE9ORSk7CisJCQlweGFfbWNpX2RhdGFfZG9uZShzYywgc3IpOworCQl9CisJfQorCisJUFhB
X01DSV9VTkxPQ0soc2MpOworfQorCitzdGF0aWMgaW50CitweGFfbWNpX2dldF9ybyhkZXZpY2Vf
dCBicmRldiwgZGV2aWNlX3QgcmVxZGV2KQoreworCXJldHVybiAoLTEpOworfQorCitzdGF0aWMg
aW50CitweGFfbWNpX2FjcXVpcmVfaG9zdChkZXZpY2VfdCBicmRldiwgZGV2aWNlX3QgcmVxZGV2
KQoreworCXN0cnVjdCBweGFfbWNpX3NvZnRjICpzYyA9IGRldmljZV9nZXRfc29mdGMoYnJkZXYp
OworCWludCBlcnIgPSAwOworCisJUFhBX01DSV9MT0NLKHNjKTsKKwl3aGlsZSAoc2MtPmJ1c19i
dXN5KQorCQltc2xlZXAoc2MsICZzYy0+c2NfbXR4LCBQWkVSTywgIm1jaWFoIiwgaHogLyA1KTsK
KwlzYy0+YnVzX2J1c3krKzsKKwlQWEFfTUNJX1VOTE9DSyhzYyk7CisJCisJcmV0dXJuIChlcnIp
OworfQorCitzdGF0aWMgaW50CitweGFfbWNpX3JlbGVhc2VfaG9zdChkZXZpY2VfdCBicmRldiwg
ZGV2aWNlX3QgcmVxZGV2KQoreworCXN0cnVjdCBweGFfbWNpX3NvZnRjICpzYyA9IGRldmljZV9n
ZXRfc29mdGMoYnJkZXYpOworCisJUFhBX01DSV9MT0NLKHNjKTsKKwlzYy0+YnVzX2J1c3ktLTsK
Kwl3YWtldXAoc2MpOworCVBYQV9NQ0lfVU5MT0NLKHNjKTsKKworCXJldHVybiAoMCk7Cit9CisK
K3N0YXRpYyBpbnQKK3B4YV9tY2lfcmVhZF9pdmFyKGRldmljZV90IGJ1cywgZGV2aWNlX3QgY2hp
bGQsIGludCB3aGljaCwgdV9jaGFyICpyZXN1bHQpCit7CisJc3RydWN0IHB4YV9tY2lfc29mdGMg
KnNjID0gZGV2aWNlX2dldF9zb2Z0YyhidXMpOworCisKKwlzd2l0Y2ggKHdoaWNoKSB7CisJZGVm
YXVsdDoKKwkJcmV0dXJuIChFSU5WQUwpOworCWNhc2UgTU1DQlJfSVZBUl9CVVNfTU9ERToKKwkJ
KihpbnQgKilyZXN1bHQgPSBzYy0+aG9zdC5pb3MuYnVzX21vZGU7CisJCWJyZWFrOworCWNhc2Ug
TU1DQlJfSVZBUl9CVVNfV0lEVEg6CisJCSooaW50ICopcmVzdWx0ID0gc2MtPmhvc3QuaW9zLmJ1
c193aWR0aDsKKwkJYnJlYWs7CisJY2FzZSBNTUNCUl9JVkFSX0NISVBfU0VMRUNUOgorCQkqKGlu
dCAqKXJlc3VsdCA9IHNjLT5ob3N0Lmlvcy5jaGlwX3NlbGVjdDsKKwkJYnJlYWs7CisJY2FzZSBN
TUNCUl9JVkFSX0NMT0NLOgorCQkqKGludCAqKXJlc3VsdCA9IHNjLT5ob3N0Lmlvcy5jbG9jazsK
KwkJYnJlYWs7CisJY2FzZSBNTUNCUl9JVkFSX0ZfTUlOOgorCQkqKGludCAqKXJlc3VsdCA9IHNj
LT5ob3N0LmZfbWluOworCQlicmVhazsKKwljYXNlIE1NQ0JSX0lWQVJfRl9NQVg6CisJCSooaW50
ICopcmVzdWx0ID0gc2MtPmhvc3QuZl9tYXg7CisJCWJyZWFrOworCWNhc2UgTU1DQlJfSVZBUl9I
T1NUX09DUjoKKwkJKihpbnQgKilyZXN1bHQgPSBzYy0+aG9zdC5ob3N0X29jcjsKKwkJYnJlYWs7
CisJY2FzZSBNTUNCUl9JVkFSX01PREU6CisJCSooaW50ICopcmVzdWx0ID0gc2MtPmhvc3QubW9k
ZTsKKwkJYnJlYWs7CisJY2FzZSBNTUNCUl9JVkFSX09DUjoKKwkJKihpbnQgKilyZXN1bHQgPSBz
Yy0+aG9zdC5vY3I7CisJCWJyZWFrOworCWNhc2UgTU1DQlJfSVZBUl9QT1dFUl9NT0RFOgorCQkq
KGludCAqKXJlc3VsdCA9IHNjLT5ob3N0Lmlvcy5wb3dlcl9tb2RlOworCQlicmVhazsKKwljYXNl
IE1NQ0JSX0lWQVJfVkREOgorCQkqKGludCAqKXJlc3VsdCA9IHNjLT5ob3N0Lmlvcy52ZGQ7CisJ
CWJyZWFrOworCX0KKwkKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitweGFfbWNpX3dy
aXRlX2l2YXIoZGV2aWNlX3QgYnVzLCBkZXZpY2VfdCBjaGlsZCwgaW50IHdoaWNoLCB1aW50cHRy
X3QgdmFsdWUpCit7CisJc3RydWN0IHB4YV9tY2lfc29mdGMgKnNjID0gZGV2aWNlX2dldF9zb2Z0
YyhidXMpOworCisJc3dpdGNoICh3aGljaCkgeworCWRlZmF1bHQ6CisJCXJldHVybiAoRUlOVkFM
KTsKKwljYXNlIE1NQ0JSX0lWQVJfQlVTX01PREU6CisJCXNjLT5ob3N0Lmlvcy5idXNfbW9kZSA9
IHZhbHVlOworCQlicmVhazsKKwljYXNlIE1NQ0JSX0lWQVJfQlVTX1dJRFRIOgorCQlzYy0+aG9z
dC5pb3MuYnVzX3dpZHRoID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgTU1DQlJfSVZBUl9DSElQ
X1NFTEVDVDoKKwkJc2MtPmhvc3QuaW9zLmNoaXBfc2VsZWN0ID0gdmFsdWU7CisJCWJyZWFrOwor
CWNhc2UgTU1DQlJfSVZBUl9DTE9DSzoKKwkJc2MtPmhvc3QuaW9zLmNsb2NrID0gdmFsdWU7CisJ
CWJyZWFrOworCWNhc2UgTU1DQlJfSVZBUl9NT0RFOgorCQlzYy0+aG9zdC5tb2RlID0gdmFsdWU7
CisJCWJyZWFrOworCWNhc2UgTU1DQlJfSVZBUl9PQ1I6CisJCXNjLT5ob3N0Lm9jciA9IHZhbHVl
OworCQlicmVhazsKKwljYXNlIE1NQ0JSX0lWQVJfUE9XRVJfTU9ERToKKwkJc2MtPmhvc3QuaW9z
LnBvd2VyX21vZGUgPSB2YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBNTUNCUl9JVkFSX1ZERDoKKwkJ
c2MtPmhvc3QuaW9zLnZkZCA9IHZhbHVlOworCQlicmVhazsKKwljYXNlIE1NQ0JSX0lWQVJfSE9T
VF9PQ1I6CisJY2FzZSBNTUNCUl9JVkFSX0ZfTUlOOgorCWNhc2UgTU1DQlJfSVZBUl9GX01BWDoK
KwkJcmV0dXJuIChFSU5WQUwpOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgZGV2aWNl
X21ldGhvZF90IHB4YV9tY2lfbWV0aG9kc1tdID0geworCS8qIGRldmljZV9pZiAqLworCURFVk1F
VEhPRChkZXZpY2VfcHJvYmUsIHB4YV9tY2lfcHJvYmUpLAorCURFVk1FVEhPRChkZXZpY2VfYXR0
YWNoLCBweGFfbWNpX2F0dGFjaCksCisJLypERVZNRVRIT0QoZGV2aWNlX2RldGFjaCwgcHhhX21j
aV9kZXRhY2gpLCovCisKKwkvKiBCdXMgaW50ZXJmYWNlICovCisJREVWTUVUSE9EKGJ1c19yZWFk
X2l2YXIsIHB4YV9tY2lfcmVhZF9pdmFyKSwKKwlERVZNRVRIT0QoYnVzX3dyaXRlX2l2YXIsIHB4
YV9tY2lfd3JpdGVfaXZhciksCisKKwkvKiBtbWNicl9pZiAqLworCURFVk1FVEhPRChtbWNicl91
cGRhdGVfaW9zLCBweGFfbWNpX3VwZGF0ZV9pb3MpLAorCURFVk1FVEhPRChtbWNicl9yZXF1ZXN0
LCBweGFfbWNpX3JlcXVlc3QpLAorCURFVk1FVEhPRChtbWNicl9nZXRfcm8sIHB4YV9tY2lfZ2V0
X3JvKSwKKwlERVZNRVRIT0QobW1jYnJfYWNxdWlyZV9ob3N0LCBweGFfbWNpX2FjcXVpcmVfaG9z
dCksCisJREVWTUVUSE9EKG1tY2JyX3JlbGVhc2VfaG9zdCwgcHhhX21jaV9yZWxlYXNlX2hvc3Qp
LAorCisJezAsIDB9LAorfTsKKworc3RhdGljIGRyaXZlcl90IHB4YV9tY2lfZHJpdmVyID0gewor
CSJweGFfbWNpIiwKKwlweGFfbWNpX21ldGhvZHMsCisJc2l6ZW9mKHN0cnVjdCBweGFfbWNpX3Nv
ZnRjKSwKK307CitzdGF0aWMgZGV2Y2xhc3NfdCBweGFfbWNpX2RldmNsYXNzOworCisKK0RSSVZF
Ul9NT0RVTEUocHhhX21jaSwgcHhhLCBweGFfbWNpX2RyaXZlciwgcHhhX21jaV9kZXZjbGFzcywg
MCwgMCk7CmRpZmYgLXggJypzdm4qJyAtdSAtTiAtZCAtciBmYnNkX2N1cnJlbnRfMjAwODA4MzAv
c3JjL3N5cy9hcm0veHNjYWxlL3B4YS9weGFfb2Jpby5jIGZic2RfamZfcHJpdi9zcmMvc3lzL2Fy
bS94c2NhbGUvcHhhL3B4YV9vYmlvLmMKLS0tIGZic2RfY3VycmVudF8yMDA4MDgzMC9zcmMvc3lz
L2FybS94c2NhbGUvcHhhL3B4YV9vYmlvLmMJMjAwOC0wOC0zMCAwODo0Mzo1Ny4wMDAwMDAwMDAg
KzAyMDAKKysrIGZic2RfamZfcHJpdi9zcmMvc3lzL2FybS94c2NhbGUvcHhhL3B4YV9vYmlvLmMJ
MjAwOC0wOC0yNSAxMzowMjoxOS4wMDAwMDAwMDAgKzAyMDAKQEAgLTIzLDcgKzIzLDcgQEAKICAq
LwogCiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+Ci1fX0ZCU0RJRCgiJEZyZWVCU0Q6IGhlYWQvc3lz
L2FybS94c2NhbGUvcHhhL3B4YV9vYmlvLmMgMTc5NzAxIDIwMDgtMDYtMTAgMDY6MDY6MTVaIGtl
dmxvICQiKTsKK19fRkJTRElEKCIkRnJlZUJTRCQiKTsKIAogI2luY2x1ZGUgPHN5cy9wYXJhbS5o
PgogI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgpAQCAtNzYsNiArNzYsOCBAQAogCXsgInVhcnQiLCBQ
WEEyWDBfQlRVQVJUX0JBU0UsIFBYQTJYMF9CVFVBUlRfU0laRSwgeyBQWEEyWDBfSU5UX0JUVUFS
VCwgMCB9IH0sCiAJeyAidWFydCIsIFBYQTJYMF9TVFVBUlRfQkFTRSwgUFhBMlgwX1NUVUFSVF9T
SVpFLCB7IFBYQTJYMF9JTlRfU1RVQVJULCAwIH0gfSwKIAl7ICJ1YXJ0IiwgUFhBMlgwX0hXVUFS
VF9CQVNFLCBQWEEyWDBfSFdVQVJUX1NJWkUsIHsgUFhBMlgwX0lOVF9IV1VBUlQsIDAgfSB9LAor
CXsgInB4YV9jbGtfbWdyIiwgUFhBMlgwX0NMS01BTl9CQVNFLCBQWEEyWDBfQ0xLTUFOX1NJWkUs
IHsgMCB9IH0sCSAgCQorCXsgInB4YV9tY2kiLCBQWEEyWDBfTU1DX0JBU0UsIFBYQTJYMF9NTUNf
U0laRSwgeyBQWEEyWDBfSU5UX01NQywgMCB9IH0sICAJCQkgCiAJeyAic21pIiwgUFhBMlgwX0NT
MF9TVEFSVCwgUFhBMlgwX0NTX1NJWkUgKiA2LCB7IDAgfSB9LAogCXsgTlVMTCwgMCwgMCwgeyAw
IH0gfQogfTsKQEAgLTI0NCw2ICsyNDYsMTAgQEAKIAkJCSAgICBzdGFydCwgZW5kLCBjb3VudCwg
ZmxhZ3MpKTsKIAkJcmV0dXJuIChOVUxMKTsKIAl9CisJLyogVGVtcCBoYWNrICovCisJaWYgKHJs
ZS0+cmVzICE9IE5VTEwpCisJCXJldHVybiBOVUxMOworCiAJaWYgKHJsZS0+cmVzICE9IE5VTEwp
CiAJCXBhbmljKCJweGFfYWxsb2NfcmVzb3VyY2U6IHJlc291cmNlIGlzIGJ1c3kiKTsKZGlmZiAt
eCAnKnN2bionIC11IC1OIC1kIC1yIGZic2RfY3VycmVudF8yMDA4MDgzMC9zcmMvc3lzL2FybS94
c2NhbGUvcHhhL3B4YXJlZy5oIGZic2RfamZfcHJpdi9zcmMvc3lzL2FybS94c2NhbGUvcHhhL3B4
YXJlZy5oCi0tLSBmYnNkX2N1cnJlbnRfMjAwODA4MzAvc3JjL3N5cy9hcm0veHNjYWxlL3B4YS9w
eGFyZWcuaAkyMDA4LTA4LTMwIDA4OjQzOjU3LjAwMDAwMDAwMCArMDIwMAorKysgZmJzZF9qZl9w
cml2L3NyYy9zeXMvYXJtL3hzY2FsZS9weGEvcHhhcmVnLmgJMjAwOC0wOC0yNiAxMDo0ODoxNi4w
MDAwMDAwMDAgKzAyMDAKQEAgLTMyLDcgKzMyLDcgQEAKICAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCiAg
KiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqCi0gKiAkRnJlZUJTRDogaGVhZC9zeXMv
YXJtL3hzY2FsZS9weGEvcHhhcmVnLmggMTc5NTk1IDIwMDgtMDYtMDYgMDU6MDg6MDlaIGJlbm5v
ICQKKyAqICRGcmVlQlNEJAogICovCiAKIApAQCAtMjEwLDYgKzIxMCw5IEBACiAjZGVmaW5lICBE
Q01EX0lOQ1RSR0FERFIgICgxPDwzMCkJLyogaW5jcmVtZW50IHRhcmdldCBhZGRyZXNzICovCiAj
ZGVmaW5lICBEQ01EX0lOQ1NSQ0FERFIgICgxPDwzMSkJLyogaW5jcmVtZW50IHNvdXJjZSBhZGRy
ZXNzICovCiAKKyNkZWZpbmUgRFJDTVJfTU1DX1JYCTIxCisjZGVmaW5lIERSQ01SX01NQ19UWAky
MgorCiAjaWZuZGVmIF9fQVNTRU1CTEVSX18KIC8qIERNQSBkZXNjcmlwdG9yICovCiBzdHJ1Y3Qg
cHhhX2RtYV9kZXNjIHsKQEAgLTU4Miw2ICs1ODUsNyBAQAogI2RlZmluZSAgQ01EQVRfSU5JVAkJ
KDE8PDYpIC8qIHByZWNlZWRlIGNvbW1hbmQgd2l0aCA4MCBjbG9ja3MgKi8KICNkZWZpbmUgIENN
REFUX01NQ19ETUFfRU4JKDE8PDcpIC8qIERNQSBlbmFibGUgKi8KICNkZWZpbmUgTU1DX1JFU1RP
CTB4MTQJLyogZXhwZWN0ZWQgcmVzcG9uc2UgdGltZSBvdXQgKi8KKyNkZWZpbmUgIE1NQ19SRVNU
T19ERUZBVUxUIDB4NDAgLyogZGVmYXVsdCB2YWx1ZSAqLwogI2RlZmluZSBNTUNfUkRUTyAJMHgx
OAkvKiBleHBlY3RlZCBkYXRhIHJlYWQgdGltZSBvdXQgKi8KICNkZWZpbmUgTU1DX0JMS0xFTgkw
eDFjCS8qIGJsb2NrIGxlbmd0aCBvZiBkYXRhIHRyYW5zYWN0aW9uICovCiAjZGVmaW5lIE1NQ19O
T0IgIAkweDIwCS8qIG51bWJlciBvZiBibG9ja3MgKGJsb2NrIG1vZGUpICovCkBAIC01OTYsNiAr
NjAwLDcgQEAKICNkZWZpbmUgIE1NQ19JX0NMS19JU19PRkYJKDE8PDQpCiAjZGVmaW5lICBNTUNf
SV9SWEZJRk9fUkRfUkVRCSgxPDw1KQogI2RlZmluZSAgTU1DX0lfVFhGSUZPX1dSX1JFUQkoMTw8
NikKKyNkZWZpbmUgIE1NQ19JX01BU0tfQUxMCQkoKDE8PDcpIC0gMSkKICNkZWZpbmUgTU1DX0NN
RCAgCTB4MzAJLyogaW5kZXggb2YgY3VycmVudCBjb21tYW5kICovCiAjZGVmaW5lIE1NQ19BUkdI
IAkweDM0CS8qIE1TVyBwYXJ0IG9mIHRoZSBjdXJyZW50IGNvbW1hbmQgYXJnICovCiAjZGVmaW5l
IE1NQ19BUkdMIAkweDM4CS8qIExTVyBwYXJ0IG9mIHRoZSBjdXJyZW50IGNvbW1hbmQgYXJnICov
CmRpZmYgLXggJypzdm4qJyAtdSAtTiAtZCAtciBmYnNkX2N1cnJlbnRfMjAwODA4MzAvc3JjL3N5
cy9hcm0veHNjYWxlL3B4YS9weGF2YXIuaCBmYnNkX2pmX3ByaXYvc3JjL3N5cy9hcm0veHNjYWxl
L3B4YS9weGF2YXIuaAotLS0gZmJzZF9jdXJyZW50XzIwMDgwODMwL3NyYy9zeXMvYXJtL3hzY2Fs
ZS9weGEvcHhhdmFyLmgJMjAwOC0wOC0zMCAwODo0Mzo1Ny4wMDAwMDAwMDAgKzAyMDAKKysrIGZi
c2RfamZfcHJpdi9zcmMvc3lzL2FybS94c2NhbGUvcHhhL3B4YXZhci5oCTIwMDgtMDgtMjUgMTY6
NTg6NDYuMDAwMDAwMDAwICswMjAwCkBAIC0zNCw3ICszNCw3IEBACiAgKiBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRQogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKgotICogJEZyZWVCU0Q6IGhl
YWQvc3lzL2FybS94c2NhbGUvcHhhL3B4YXZhci5oIDE3OTU5NSAyMDA4LTA2LTA2IDA1OjA4OjA5
WiBiZW5ubyAkCisgKiAkRnJlZUJTRCQKICAqCiAgKi8KIApAQCAtODcsNiArODcsOSBAQAogaW50
CXB4YV9kbWFjX3RyYW5zZmVyX2RvbmUoc3RydWN0IGRtYWNfY2hhbm5lbCAqKTsKIGludAlweGFf
ZG1hY190cmFuc2Zlcl9mYWlsZWQoc3RydWN0IGRtYWNfY2hhbm5lbCAqKTsKIAordm9pZAlweGFf
ZG1hY19jaGFubmVsX21hcF92YWxpZChzdHJ1Y3QgZG1hY19jaGFubmVsICpjaGFubmVsLCB1aW50
MzJfdCBtYXBfcmVnKTsKK3ZvaWQJcHhhX2RtYWNfY2hhbm5lbF9tYXBfaW52YWxpZChzdHJ1Y3Qg
ZG1hY19jaGFubmVsICpjaGFubmVsLCB1aW50MzJfdCBtYXBfcmVnKTsKKwogZW51bSBweGFfZGV2
aWNlX2l2YXJzIHsKIAlQWEFfSVZBUl9CQVNFLAogfTsKQEAgLTEwOSw0ICsxMTIsNyBAQAogCiAj
dW5kZWYgQ1NSX0FDQ0VTU09SCiAKKwordm9pZCBweGFfc2V0X2NrZW4odWludDMyX3QgY2xvY2ss
IHVpbnQzMl90IGVuYWJsZSk7CisKICNlbmRpZiAvKiBfUFhBVkFSX0hfICovCg==
------=_Part_26427_13643661.1220081851637--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?be2f52430808300037y79723a2ascf62c33aec7579f3>