[PATCH v9 07/12] clk: zte: Add zx PLL support infrastructure

Stefan Dösinger <[email protected]> Sun, 02 Aug 2026 23:33:39 +0300
Newsgroups org.infradead.lists.linux-phy,dev.linux.lists.mfd,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-clk,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
SSBhbSBndWVzc2luZyBob3cgbXVjaCBvZiB0aGlzIGlzIHJldXNhYmxlIGFtb25nIG90aGVyIHp4
IGNoaXBzIG9yIGV2ZW4KZGlmZmVyZW50bHkgbmFtZWQgWlRFIHBsYXRmb3JtcyAoaWYgdGhlcmUg
YXJlIGFueSkuIEZyb20gcmVhZGluZyB0aGUgb2xkCnp4Mjk2NyBjb2RlLCBJIHRoaW5rIHRoZSBQ
TEwgY29kZSB3b3VsZCBiZSByZXVzYWJsZSB0aGVyZSwgbWF5YmUgd2l0aApwbGF0Zm9ybS1zcGVj
aWZpYyBiaXRtYXNrcyBidXQgb3RoZXJ3aXNlIHRoZSBzYW1lIGxvZ2ljLgoKU2lnbmVkLW9mZi1i
eTogU3RlZmFuIETDtnNpbmdlciA8c3RlZmFuZG9lc2luZ2VyQGdtYWlsLmNvbT4KCi0tLQoKVmVy
c2lvbiA5OgoqKSBUYWtlIHJlcS0+bWluX3JhdGUgYW5kIHJlcS0+bWF4X3JhdGUgaW50byBhY2Nv
dW50IHdoZW4gbG9va2luZyBmb3IKcG9zc2libGUgUExMIGNvbmZpZ3VyYXRpb25zIChzYXNoaWtv
KS4gSW4gcHJhY3RpY2UgdGhlIGNvZGUgd2lsbCBzdGlsbApvbmx5IGV2ZXIgZW5jb3VudGVyIGEg
Zml4ZWQgcmVxdWVzdCB0byBzZXQgZHBsbCB0byA0OTEuNTIgTUh6LgoKKikgVGhlIHNhbWUgY29k
ZSBzdHlsZSBjaGFuZ2VzIEJyaWFuIHJlcXVlc3RlZCBvbiB0aGUgb3RoZXIgY2xrIHBhdGNoZXMu
CgpWZXJzaW9uIDg6CiopIERvY3VtZW50IHRoZSBiZWhhdmlvciBvZiB1bmxvY2tlZCBQTExzIGJl
dHRlcjogVGhleSBkb24ndCBwYXNzCnRocm91Z2ggdGhlaXIgcmVmZXJlbmNlL3BhcmVudCwgYnV0
IHBhc3MgdGhyb3VnaCB0aGUgZml4ZWQgY2xvY2stMjZtCm9zY2lsbGF0b3IsIGV2ZW4gaWYgdGhl
aXIgcmVmZXJlbmNlIGNsb2NrIGlzIHNvbWV0aGluZyBlbHNlLgoqKSBkcGxsIGhhcyB3b3JraW5n
IGZyYWN0aW9uYWxzLiBBZGQgdGhpcyBpbiB0aGUgY29tbWVudCwgYnV0IHRoZXJlIGlzCm5vIGFj
dHVhbCBjb2RlIHN1cHBvcnQgZm9yIGl0IC0gdGhlIExURSBoYXJkd2FyZSBkb2Vzbid0IG5lZWQg
aXQuCgpBcyBmb3IgU2FzaGlrbydzIGNvbW1lbnRzIG9uIHRoZSAuc2V0X3JhdGUgaW1wbGVtZW50
YXRpb246IEluIHByYWN0aWNlCi5zZXRfcmF0ZSB3aWxsIG9ubHkgZXZlciBzZXQgb25lIHJhdGUs
IDQ5MS41MiBNSHogZm9yIGRwbGwuIEFsbCBvdGhlcgpQTExzIGFyZSBib290bG9hZGVyIGNvbmZp
Z3VyZWQuIERwbGwgY291bGQgYmUgaGFuZGxlZCBieSB3cml0aW5nIGEgbWFnaWMKY29uc3RhbnQg
aW50byBpdHMgY29uZmlnLgoKSSB3YW50IHRvIGhhdmUgdGhlIHJhdGUgZmluZGluZyBjb2RlIGFz
IGRvY3VtZW50YXRpb24sIGFuZCBtYXliZSB0aGVyZQppcyBtb3JlIGVsYWJvcmF0ZSBmdXR1cmUg
dXNlIGZvciBpdCAoZS5nLiBtb3JlIGZsZXhpYmxlIHVuZGVyY2xvY2tpbmcpLApidXQgYXR0ZW1w
dHMgdG8gaGFuZGxlIGV2ZW50dWFsaXRpZXMgbGlrZSByYXRlIHNlYXJjaGVzIG9yIG1pc2NvbmZp
Z3VyZWQKYm9vdGxvYWRlciB2YWx1ZXMgd291bGQgYmUgZGVhZCBjb2RlLgoKVmVyc2lvbiA3Ogoq
KSBBbHdheXMga2VlcCB1bmtub3ducGxsIGVuYWJsZWQgd2hlbiBwcmVwYXJlZCBzbyBkcGxsIGNh
biBhY3F1aXJlIGEKbG9jayBpbiBpdHMgcHJlcGFyZSgpIGZ1bmN0aW9uLgoqKSBDbGVhbiB1cCBl
cnJvciByZXBvcnRpbmcgYSBiaXQgKFNhc2hpa28pCgpWZXJzaW9uIDY6CiopIFVzZSBhYnNfZGlm
ZiB0byBjb21wYXJlIHRhcmdldCBhbmQgY2FuZGlkYXRlIFBMTCByYXRlIChTYXNoaWtvKS4KKikg
VXNlIHJlcS0+YmVzdF9wYXJlbnRfcmF0ZSBpbiB6eDI5X3BsbF9kZXRlcm1pbmVfcmF0ZS4gQWRk
IGEgVE9ETwpjb21tZW50IGFib3V0IHRoZSBwYXJlbnQgcmF0ZSBmbGV4aWJpbGl0eS4KClZlcnNp
b24gNTogRml4IHNvbWUgaXNzdWVzIHBvaW50ZWQgb3V0IGJ5IFNhc2hpa286IE5VTEwgZGV2LAp6
eDI5X3BsbF9yZWNhbGNfcmF0ZSBlcnJvciBoYW5kbGluZywgZGlzYWJsZSBQTEwgYWdhaW4gb24g
ZW5hYmxlIGVycm9yLgotLS0KIGRyaXZlcnMvY2xrL3p0ZS9wbGwtenguYyB8IDU2OCArKysrKysr
KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLQogMSBmaWxlIGNoYW5nZWQs
IDU2NSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMv
Y2xrL3p0ZS9wbGwtenguYyBiL2RyaXZlcnMvY2xrL3p0ZS9wbGwtenguYwppbmRleCBmYzc2YzY1
MjRhMTYuLmU2MWI0NjJlYzBiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvenRlL3BsbC16eC5j
CisrKyBiL2RyaXZlcnMvY2xrL3p0ZS9wbGwtenguYwpAQCAtNCwxNSArNCw1NzcgQEAKICAqLwog
CiAjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+
CisjaW5jbHVkZSA8bGludXgvY29udGFpbmVyX29mLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNl
Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNp
bmNsdWRlIDxsaW51eC9tYXRoLmg+CisjaW5jbHVkZSA8bGludXgvcmF0aW9uYWwuaD4KICNpbmNs
dWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUg
PGxpbnV4L3VuaXRzLmg+CiAKICNpbmNsdWRlICJjbGstenguaCIKIAorLyoKKyAqIFRoaXMgY29k
ZSBoYXMgb25seSBiZWVuIHRlc3RlZCB3aXRoIHp4Mjk3NTIwdjMgUExMcywgYnV0IGZyb20gcmVh
ZGluZyB0aGUgengyOTY3MTggY2xvY2sgY29kZSBpdAorICogbG9va3MgbGlrZSBQTEwgcmVnaXN0
ZXJzIGFyZSBzaW1pbGFyLiBaVEUncyBzb3VyY2VzIGV4cGxhaW4gdGhlIFBMTCByZWdpc3RlciBj
b250ZW50cyBvbmx5IGluIGEKKyAqIC5jbW0gZmlsZSAoQSBMYXV0ZXJiYWNoIFRSQUNFMzIgc2Ny
aXB0KSBhbmQgc29tZSB1bnVzZWQgaGVhZGVycyBpbiB0aGVpciBVLUJvb3QgY29kZSBkdW1wLCB3
aGljaAorICogbWF5IG5vdCBiZSBhY2N1cmF0ZS4gV2hlbiBjYWxjdWxhdGluZyB0aGUgZnJlcXVl
bmNpZXMgZnJvbSB0aGUgZGVmYXVsdCBQTEwgY29uZmlndXJhdGlvbiB0aGUKKyAqIHJlc3VsdHMg
bWF0Y2ggdGhlIGZpeGVkIHJhdGUgY2xvY2tzIGZyb20gdGhlaXIgY2xvY2sgZHJpdmVyLgorICoK
KyAqIFRoZSAyNiBNSHogYW5kIDMyIGtIeiBjbG9ja3MgY2FuIGJlIGVhc2lseSBvYnNlcnZlZCB3
aXRoIHRoZSB0aW1lcnMuIFRoZSAxMDQgTUh6IG91dHB1dCBjYW4gYmUKKyAqIG9ic2VydmVkIHRo
cm91Z2ggdGhlIFVBUlQuIE9uZSAxMjIuODggTUh6IGNsb2NrIGNhbiBiZSBvYnNlcnZlZCB0aHJv
dWdoIHRoZSBURE0gZGV2aWNlLiBBbGwKKyAqIG90aGVycyBjYW4gb25seSBiZSBpbmRpcmVjdGx5
IGluZmVycmVkLCBlLmcuIGJ5IGNvbXBhcmluZyBDUFUgc3BlZWQgb3IgU0RJTyB0cmFuc2ZlciBy
YXRlIGJldHdlZW4KKyAqIHRoZSBmaXhlZCAyNiBNSHogb3NjaWxsYXRvciBhbmQgdGhlIHByb3Zp
ZGVkIFBMTCBmcmVxdWVuY3kuCisgKgorICogVGhlIGZvcm11bGEgdG8gY2FsY3VsYXRlIHRoZSBj
bG9jayBpcyAoKHJlZiAvIHJlZmRpdikgKiBmYmRpdikgLyBwb3N0ZGl2MSAvIHBvc3RkaXYyLiBU
aGUgbWFza3MKKyAqIGFyZSBnaXZlbiBiZWxvdy4gVGhlcmUgYXJlIGEgZmV3IGNvbnRyb2wgZmxh
Z3M6CisgKgorICogQml0IDMxOiBEaXNhYmxlcyB0aGUgUExMLCBidXQgcGFzc2VzIGNsb2NrLTI2
bSB0aHJvdWdoIHVubW9kaWZpZWQuIFdoZXRoZXIgUE9TVERJVl9PVVRfRElTQUJMRQorICogICAg
ICAgICBzdGlsbCBtYXR0ZXJzIGlzIGRpZmZlcmVudCBiZXR3ZWVuIFBMTHMuCisgKiBCaXQgMzA6
IFJldHVybnMgaWYgdGhlIFBMTCBpcyBsb2NrZWQKKyAqIEJpdCAyOTogTm90IG5hbWVkIGluIFpU
RSdzIGNvZGUsIGJ1dCBjYW4gYmUgc2V0LiBUaGVyZSBpcyBubyBvYnZpb3VzIGltcGFjdC4gTG9j
ayB0aW1lcyBhcmUKKyAqICAgICAgICAgdW5jaGFuZ2VkLCBzbyBpdCBkb2Vzbid0IGluZmx1ZW5j
ZSBvciBieXBhc3MgbG9jayBkZXRlY3Rpb24uIEl0IGRvZXNuJ3QgcmFpc2UgYW55IElSUXMgb3IK
KyAqICAgICAgICAgaW5mbHVlbmNlIEdQSU9zLgorICogQml0IDI3OiBHaXZlbiBpdHMgbmFtZSBp
dCBsaWtlbHkgZGlzYWJsZXMgdGhlIERlbHRhLVNpZ21hIE1vZHVsYXRvciwgaWYgb25lIGV4aXN0
cyBhdCBhbGwuIFRoZQorICogICAgICAgICBib290IFJPTSBzZXRzIGl0IG9uIGV2ZXJ5IFBMTC4g
VW5zZXR0aW5nIGl0IG1hcmdpbmFsbHkgZGVjcmVhc2VzIHRoZSB0aW1lIGl0IHRha2VzIHRvCisg
KiAgICAgICAgIGxvY2sgdG8gdGhlIHJlZmVyZW5jZSBjbG9jayAoZnJvbSB+NDAwIHVzIHRvIH4z
MDAgdXMpLgorICogQml0IDI0OiBCeXBhc3NlcyB0aGUgVkNPLCBidXQgc3RpbGwgYXBwbGllcyBy
ZWZkaXYgYW5kIHBvc3RkaXYuIERvZXNuJ3QgbWF0dGVyIGlmIFBMTF9ESVNBQkxFPTEuCisgKgor
ICogTkI6IFNvbWUgUExMcyBoYXZlIGFuIGF1dG9tYXRpYyBieXBhc3MgbG9naWMgdGhhdCBmb3J3
YXJkcyBjbG9jay0yNm0gKFJFR0FSRExFU1Mgb2YgcmVmZXJlbmNlKQorICogd2hlbiB0aGV5IGRv
bid0IGhhdmUgYSBsb2NrLCByZWdhcmRsZXNzIG9mIHJlYXNvbi4gVGhpcyBjYW4gYmUgdHJpZ2dl
cmVkIGJ5IGRpc2FibGluZyB0aGUgUExMLAorICogc2V0dGluZyBhbiBvdXQtb2Ytc3BlYyBWQ08g
ZnJlcXVlbmN5IG9yIGRpc2FibGluZyB0aGUgcGFyZW50LiBUaGlzIHNob3VsZG4ndCBtYXR0ZXIg
aW4gcmVndWxhcgorICogb3BlcmF0aW9uLCBidXQgY2F1c2VkIG1lIHNvbWUgY29uZnVzaW9uIHdo
ZW4gcmV2ZXJzZSBlbmdpbmVlcmluZyB0aGUgY2xvY2sgdHJlZS4gRS5nLiBjbG9jay0yNm0tPgor
ICogdW5rbm93bnBsbChkaXNhYmxlZCkgLT4gZHBsbChlbmFibGVkKSBjb3VudGVyaW50dWl0aXZl
bHkgcmVzdWx0cyBpbiBhIDI2IE1IeiBvdXRwdXQgY2xvY2suCisgKi8KKworI2RlZmluZSBaWDI5
X1BMTF9ESVNBQkxFCQkJQklUKDMxKQorI2RlZmluZSBaWDI5X1BMTF9MT0NLRUQJCQkJQklUKDMw
KQorI2RlZmluZSBaWDI5X1BMTF9MT0NLX0ZJTFRFUgkJCUJJVCgyOSkKKyNkZWZpbmUgWlgyOV9Q
TExfRFNNX0RJU0FCTEUJCQlCSVQoMjcpCisjZGVmaW5lIFpYMjlfUExMX1BBUkVOVF9NQVNLCQkJ
R0VOTUFTSygyNiwgMjUpCisjZGVmaW5lIFpYMjlfUExMX1BBUkVOVF9TSElGVAkJCTI1CisjZGVm
aW5lIFpYMjlfUExMX0JZUEFTUwkJCQlCSVQoMjQpCisjZGVmaW5lIFpYMjlfUExMX1JFRkRJVl9N
QVNLCQkJR0VOTUFTSygyMywgMTgpCisjZGVmaW5lIFpYMjlfUExMX1JFRkRJVl9TSElGVAkJCTE4
CisjZGVmaW5lIFpYMjlfUExMX0ZCRElWX01BU0sJCQlHRU5NQVNLKDE3LCA2KQorI2RlZmluZSBa
WDI5X1BMTF9GQkRJVl9TSElGVAkJCTYKKyNkZWZpbmUgWlgyOV9QTExfUE9TVERJVjFfTUFTSwkJ
CUdFTk1BU0soNSwgMykKKyNkZWZpbmUgWlgyOV9QTExfUE9TVERJVjFfU0hJRlQJCQkzCisjZGVm
aW5lIFpYMjlfUExMX1BPU1RESVYyX01BU0sJCQlHRU5NQVNLKDIsIDApCisjZGVmaW5lIFpYMjlf
UExMX1BPU1RESVYyX1NISUZUCQkJMAorCisvKgorICogVGhlIHNlY29uZCByZWdpc3RlciBoYXMg
YSAyNCBiaXQgZnJhY3Rpb25hbCB2YWx1ZSwgd2hpY2ggb25seSBtYXR0ZXJzIHdoZW4gWlgyOV9Q
TExfRFNNX0RJU0FCTEUKKyAqIGlzIG5vdCBzZXQsIGFuZCBvbmx5IHNlZW1zIHRvIG1hdHRlciBm
b3IgZHBsbC4gWlRFJ3MgZmlybXdhcmUgZG9lcyBub3QgbWFrZSB1c2Ugb2YgdGhlIGZyYWN0aW9u
YWwKKyAqIGFuZCBpdCBpcyB1bmltcGxlbWVudGVkIGluIHRoaXMgZHJpdmVyLiBFeHBlcmltZW50
YWwgdGVzdGluZyBjb25maXJtcyB0aGF0IGl0IGhhcyBhbiBpbXBhY3Qgb24KKyAqIGRwbGwuCisg
KgorICogQml0cyAyNzoyNCBjb250YWluIG1vcmUgZmxhZ3M6CisgKgorICogQml0IDI3OiBTZXR0
aW5nIFpYMjlfUExMX0RBQ0FQIHNsb3dzIGRvd24gdGhlIGxvY2sgdGltZSBhbmQgb2J2aWF0ZXMg
dGhlIHNwZWVkIGdhaW5lZCBmcm9tCisgKiAgICAgICAgICFEU01fRElTQUJMRS4gTm8gb3RoZXIg
ZWZmZWN0IG9ic2VydmVkLgorICoKKyAqIEJpdCAyNjogWlgyOV9QTExfNFBIQVNFX09VVF9ESVNB
QkxFIGlzIHNldCBvbiBzb21lIFBMTHMgb24gYm9vdCBidXQgbm90IG9uIG90aGVycy4gSXQgaXMg
c2V0IG9uCisgKiAgICAgICAgIGJvb3Qgb24gbXBsbCBhbmQgdXBsbCwgYnV0IG5vdCBncGxsLCBk
cGxsIG9yIHVua25vd25wbGwuIEkgYW0gbm90IHN1cmUgd2hhdCBpdCBkb2VzCisgKiAgICAgICAg
IGVpdGhlci4gVGhlIFNESU8gZGV2aWNlcyBicmVhayBpZiB0aGV5IGFyZSBmZWQgZnJvbSBncGxs
IHdpdGggdGhpcyBmbGFnIHNldCwgYnV0IHRoZXkKKyAqICAgICAgICAgd29yayBPSyBpZiB0aGV5
IGFyZSBmZWQgZnJvbSBtcGxsIHdpdGhvdXQgdGhpcyBmbGFnIHNldC4KKyAqCisgKiBCaXQgMjU6
IFpYMjlfUExMX1BPU1RESVZfT1VUX0RJU0FCTEUgc2VlbXMgdG8gZGlzYWJsZSB0aGUgUExMIG91
dHB1dCBlbnRpcmVseS4gV2hldGhlciBpdCBpcworICogICAgICAgICBieXBhc3NlZCBieSBQTExf
RElTQUJMRSBkaWZmZXJzIGJldHdlZW4gUExMcy4gZ3BsbCBzdGlsbCBwcm9kdWNlcyBhbiBvdXRw
dXQgY2xvY2sgaWYKKyAqICAgICAgICAgUExMX0RJU0FCTEUgPSAxIGFuZCBQT1NURElWX0RJU0FC
TEUgPSAxLCBidXQgcHJvZHVjZXMgbm8gb3V0cHV0IGlmIFBMTF9ESVNBQkxFID0gMCBhbmQKKyAq
ICAgICAgICAgUE9TVERJVl9ESVNBQkxFID0gMS4gVGhlIGRwbGwgZmVlZGVyICgidW5rbm93bnBs
bCIpIGF0IDB4MTAwIHByb2R1Y2VzIG5vIG91dHB1dCBjbG9jayBpZgorICogICAgICAgICBib3Ro
IFBMTF9ESVNBQkxFIGFuZCBQT1NURElWX0RJU0FCTEUgYXJlIHNldCB0byAxLgorICoKKyAqIEJp
dCAyNDogWlgyOV9QTExfVkNPX09VVF9ESVNBQkxFIHByb2JhYmx5IGRpc2FibGVzIHRoZSBvdXRw
dXQgb2YgdGhlIFZDTyBjbG9jayB3aXRob3V0CisgKiAgICAgICAgIHBvc3QtVkNPLWRpdmlkZXJz
LCBidXQgdGhlIHJhdyBWQ08gb3V0cHV0IGlzIG5vdCBhIHBvc3NpYmxlIHBhcmVudCBvZiBhbnkg
Y29uc3VtZXIgY2xvY2ssCisgKiAgICAgICAgIHNvIEkgY291bGQgbm90IGNvbmZpcm0gdGhpcy4g
SXQgZG9lcyBub3QgZGlzYWJsZSB0aGUgVkNPIGVudGlyZWx5IC0gdGhhdCdzIHdoYXQKKyAqICAg
ICAgICAgUExMX0RJU0FCTEUgZG9lcy4KKyAqCisgKiBBIHNwaW5sb2NrIHNob3VsZCBub3QgYmUg
bmVlZGVkLiBQTExzIGRvbid0IHNoYXJlIHRoZWlyIHJlZ2lzdGVycyB3aXRoIGFueXRoaW5nIGVs
c2UgYW5kIHRoZQorICogZ2xvYmFsIHByZXBhcmUgbXV0ZXggYW5kIGVuYWJsZSBzcGlubG9jayBz
aG91bGQgYmUgZW5vdWdoLiBCZXdhcmUgb2YgY29uZmxpY3RzIGluIHJlZzIgYmV0d2VlbgorICog
UE9TVERJVl9PVVRfRElTQUJMRSBhbmQgdGhlIGZyYWN0aW9uYWwgdmFsdWUgaW4gY2FzZSB5b3Ug
ZmluZCBvdXQgaG93IGZyYWN0aW9uYWwgZGl2aWRlcnMgd29yaworICogYW5kIGFkZCBzdXBwb3J0
IGZvciB0aGVtLgorICovCisjZGVmaW5lIFpYMjlfUExMX1JFRzJfT0ZGU0VUCQkJNAorI2RlZmlu
ZSBaWDI5X1BMTF9EQUNBUAkJCQlCSVQoMjcpCisjZGVmaW5lIFpYMjlfUExMXzRQSEFTRV9PVVRf
RElTQUJMRQkJQklUKDI2KQorI2RlZmluZSBaWDI5X1BMTF9QT1NURElWX09VVF9ESVNBQkxFCQlC
SVQoMjUpCisjZGVmaW5lIFpYMjlfUExMX1ZDT19PVVRfRElTQUJMRQkJQklUKDI0KQorI2RlZmlu
ZSBaWDI5X1BMTF9GUkFDVAkJCQlHRU5NQVNLKDIzLCAwKQorCisvKgorICogVGhlIFZDTydzIGZy
ZXF1ZW5jeSByYW5nZSBpcyBsaW1pdGVkLiBUaGUgc3RvY2sgc2V0dGluZ3MgcnVuIHRoZSBWQ08g
YmV0d2VlbiA5NjAgYW5kIDEyNDggTUh6LgorICogQWQtaG9jIHRlc3Rpbmcgd2l0aCBncGxsIHN1
Z2dlc3RzIHRoYXQgYXQgbGVhc3QgdGhpcyBQTEwgcmVtYWlucyBzdGFibGUgZG93biB0byBhYm91
dCA3IE1IeiBhbmQKKyAqIHVwIHRvIDIgR0h6IGFuZCBwcm9kdWNlcyBhIGNsb2NrIHRoYXQgY2Fu
IGJlIHVzZWQgYnkgdGhlIFNESU8gY29udHJvbGxlci4gQXR0ZW1wdGluZyB0byBydW4gdGhlCisg
KiBtcGxsIFZDTyBhdCA2MjQgTUh6IGFuZCBzZXR0aW5nIHBvc3RkaXYxID0gcG9zdGRpdjIgPSAx
IC0gd2hpY2ggc2hvdWxkIHJlc3VsdCBpbiB0aGUgc2FtZSBvdXRwdXQKKyAqIGZyZXF1ZW5jeSAt
IG9yIHJ1bm5pbmcgaXQgYXQgMTg3MiBNSHogd2l0aCBhbiBlZmZlY3RpdmUgcG9zdCBkaXZpZGVy
IG9mIDMgY3Jhc2hlcyB0aGUgQ1BVLiBNb3N0CisgKiBsaWtlbHkgdGhlIFBMTHMgYmVjb21lIHVu
c3RhYmxlIG91dHNpZGUgdGhlaXIgY29yZSByYW5nZSBhbmQgdGhlIFNESU8gY29udHJvbGxlciBp
cyBtdWNoIG1vcmUKKyAqIGZvcmdpdmluZyB0aGFuIENQVSBhbmQgRFJBTSBhcmUuCisgKi8KKyNk
ZWZpbmUgWlgyOV9QTExfVkNPX01BWF9GUkVRCQkJKDEzMDAgKiBIWl9QRVJfTUhaKQorI2RlZmlu
ZSBaWDI5X1BMTF9WQ09fTUlOX0ZSRVEJCQkoOTAwICogSFpfUEVSX01IWikKKworc3RydWN0IHp4
MjlfY2xrX3BsbCB7CisJc3RydWN0IGNsa19odwlodzsKKwlzdHJ1Y3QgZGV2aWNlCSpkZXY7CisJ
c3RydWN0IHJlZ21hcAkqbWFwOworCXUxNgkJcmVnOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1
Y3QgengyOV9jbGtfcGxsICp0b196eDI5X2Nsa19wbGwoc3RydWN0IGNsa19odyAqaHcpCit7CisJ
cmV0dXJuIGNvbnRhaW5lcl9vZihodywgc3RydWN0IHp4MjlfY2xrX3BsbCwgaHcpOworfQorCitz
dGF0aWMgaW50IHp4MjlfcGxsX2lzX3ByZXBhcmVkKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0
cnVjdCB6eDI5X2Nsa19wbGwgKnBsbCA9IHRvX3p4MjlfY2xrX3BsbChodyk7CisJaW50IHJlczsK
KworCXJlcyA9IHJlZ21hcF90ZXN0X2JpdHMocGxsLT5tYXAsIHBsbC0+cmVnLCBaWDI5X1BMTF9E
SVNBQkxFKTsKKwlpZiAocmVzIDwgMCkKKwkJcmV0dXJuIHJlczsKKworCXJldHVybiAhcmVzOwor
fQorCitzdGF0aWMgaW50IHp4MjlfcGxsX3ByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCit7CisJ
c3RydWN0IHp4MjlfY2xrX3BsbCAqcGxsID0gdG9fengyOV9jbGtfcGxsKGh3KTsKKwl1MzIgdmFs
ID0gMDsKKwlpbnQgcmVzOworCisJcmVzID0gcmVnbWFwX2NsZWFyX2JpdHMocGxsLT5tYXAsIHBs
bC0+cmVnLCBaWDI5X1BMTF9ESVNBQkxFKTsKKwlpZiAocmVzIDwgMCkKKwkJcmV0dXJuIHJlczsK
KworCS8qIExvY2sgZHVyYXRpb24gaXMgdXN1YWxseSBiZXR3ZWVuIDMwMCB1cyBhbmQgNTAwIHVz
ICovCisJcmVzID0gcmVnbWFwX3JlYWRfcG9sbF90aW1lb3V0KHBsbC0+bWFwLCBwbGwtPnJlZywg
dmFsLCB2YWwgJiBaWDI5X1BMTF9MT0NLRUQsIDUwLCAyMDAwKTsKKwlpZiAocmVzKSB7CisJCXJl
Z21hcF9zZXRfYml0cyhwbGwtPm1hcCwgcGxsLT5yZWcsIFpYMjlfUExMX0RJU0FCTEUpOworCQlk
ZXZfZXJyKHBsbC0+ZGV2LCAiJXM6IFBMTCBwcmVwYXJlIGZhaWxlZDogJWQuIENvbmZpZyB2YWx1
ZSAweCUwOHhcbiIsCisJCQljbGtfaHdfZ2V0X25hbWUoJnBsbC0+aHcpLCByZXMsIHZhbCk7CisJ
fQorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHp4MjlfcGxsX3VucHJlcGFyZShzdHJ1
Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgengyOV9jbGtfcGxsICpwbGwgPSB0b196eDI5X2Ns
a19wbGwoaHcpOworCisJcmVnbWFwX3NldF9iaXRzKHBsbC0+bWFwLCBwbGwtPnJlZywgWlgyOV9Q
TExfRElTQUJMRSk7Cit9CisKK3N0YXRpYyBpbnQgengyOV9wbGxfaXNfZW5hYmxlZChzdHJ1Y3Qg
Y2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgengyOV9jbGtfcGxsICpwbGwgPSB0b196eDI5X2Nsa19w
bGwoaHcpOworCWludCByZXM7CisKKwlyZXMgPSByZWdtYXBfdGVzdF9iaXRzKHBsbC0+bWFwLCBw
bGwtPnJlZyArIFpYMjlfUExMX1JFRzJfT0ZGU0VULAorCQkJICAgICAgIFpYMjlfUExMX1BPU1RE
SVZfT1VUX0RJU0FCTEUpOworCWlmIChyZXMgPCAwKQorCQlyZXR1cm4gcmVzOworCisJcmV0dXJu
ICFyZXM7Cit9CisKK3N0YXRpYyBpbnQgengyOV9wbGxfZW5hYmxlKHN0cnVjdCBjbGtfaHcgKmh3
KQoreworCXN0cnVjdCB6eDI5X2Nsa19wbGwgKnBsbCA9IHRvX3p4MjlfY2xrX3BsbChodyk7CisK
KwlyZXR1cm4gcmVnbWFwX2NsZWFyX2JpdHMocGxsLT5tYXAsIHBsbC0+cmVnICsgWlgyOV9QTExf
UkVHMl9PRkZTRVQsCisJCQkJIFpYMjlfUExMX1BPU1RESVZfT1VUX0RJU0FCTEUpOworfQorCitz
dGF0aWMgdm9pZCB6eDI5X3BsbF9kaXNhYmxlKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVj
dCB6eDI5X2Nsa19wbGwgKnBsbCA9IHRvX3p4MjlfY2xrX3BsbChodyk7CisKKwlyZWdtYXBfc2V0
X2JpdHMocGxsLT5tYXAsIHBsbC0+cmVnICsgWlgyOV9QTExfUkVHMl9PRkZTRVQsCisJCQlaWDI5
X1BMTF9QT1NURElWX09VVF9ESVNBQkxFKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgengy
OV9wbGxfZ2V0X3JhdGUoY29uc3Qgc3RydWN0IHp4MjlfY2xrX3BsbCAqcGxsLCB1bnNpZ25lZCBs
b25nIHBhcmVudF9yYXRlLAorCQkJCSAgICAgICB1MzIgc2V0dGluZykKK3sKKwl1bnNpZ25lZCBs
b25nIHJlZmRpdiwgZmJkaXYsIHBvc3RkaXYxLCBwb3N0ZGl2MiwgZnJlcTsKKwljb25zdCBjaGFy
ICpuYW1lID0gY2xrX2h3X2dldF9uYW1lKCZwbGwtPmh3KTsKKwl1NjQgdmNvOworCisJcmVmZGl2
ID0gKHNldHRpbmcgJiBaWDI5X1BMTF9SRUZESVZfTUFTSykgPj4gWlgyOV9QTExfUkVGRElWX1NI
SUZUOworCWZiZGl2ID0gKHNldHRpbmcgJiBaWDI5X1BMTF9GQkRJVl9NQVNLKSA+PiBaWDI5X1BM
TF9GQkRJVl9TSElGVDsKKwlwb3N0ZGl2MSA9IChzZXR0aW5nICYgWlgyOV9QTExfUE9TVERJVjFf
TUFTSykgPj4gWlgyOV9QTExfUE9TVERJVjFfU0hJRlQ7CisJcG9zdGRpdjIgPSAoc2V0dGluZyAm
IFpYMjlfUExMX1BPU1RESVYyX01BU0spID4+IFpYMjlfUExMX1BPU1RESVYyX1NISUZUOworCWRl
dl9kYmcocGxsLT5kZXYsICIlczogcmVmZXJlbmNlIGNsb2NrICVsdSBIeiwgUExMIHNldHRpbmcg
MHglMDh4XG4iLAorCQluYW1lLCBwYXJlbnRfcmF0ZSwgc2V0dGluZyk7CisKKwlpZiAoIXJlZmRp
diB8fCAhcG9zdGRpdjEgfHwgIXBvc3RkaXYyKSB7CisJCWRldl9lcnIocGxsLT5kZXYsICIlczog
ZGl2aWRlIGJ5IHplcm8gKCVsdSwgJWx1LCAlbHUpXG4iLCBuYW1lLCByZWZkaXYsIHBvc3RkaXYx
LAorCQkJcG9zdGRpdjIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl2Y28gPSBkaXZfdTY0KCh1NjQp
cGFyZW50X3JhdGUgKiBmYmRpdiwgcmVmZGl2KTsKKwlmcmVxID0gZGl2X3U2NChkaXZfdTY0KHZj
bywgcG9zdGRpdjEpLCBwb3N0ZGl2Mik7CisJZGV2X2RiZyhwbGwtPmRldiwgIiVzOiByZWZkaXYg
JWx1IGZiZGl2ICVsdVxuIiwgbmFtZSwgcmVmZGl2LCBmYmRpdik7CisJZGV2X2RiZyhwbGwtPmRl
diwgIiVzOiBwb3N0ZGl2MSAlbHUgcG9zdGRpdjIgJWx1XG4iLCBuYW1lLCBwb3N0ZGl2MSwgcG9z
dGRpdjIpOworCisJZGV2X2RiZyhwbGwtPmRldiwgIiVzOiAlbHUgTUh6XG4iLCBuYW1lLCBmcmVx
IC8gSFpfUEVSX01IWik7CisKKwlyZXR1cm4gZnJlcTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxv
bmcgengyOV9wbGxfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsIHVuc2lnbmVkIGxvbmcg
cGFyZW50X3JhdGUpCit7CisJc3RydWN0IHp4MjlfY2xrX3BsbCAqcGxsID0gdG9fengyOV9jbGtf
cGxsKGh3KTsKKwl1MzIgdmFsOworCWludCByZXM7CisKKwlyZXMgPSByZWdtYXBfcmVhZChwbGwt
Pm1hcCwgcGxsLT5yZWcsICZ2YWwpOworCWlmIChyZXMgPCAwKSB7CisJCWRldl9lcnIocGxsLT5k
ZXYsICIlczogRmFpbGVkIHRvIHJlYWQgUExMIHNldHRpbmdzXG4iLCBjbGtfaHdfZ2V0X25hbWUo
JnBsbC0+aHcpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHp4MjlfcGxsX2dldF9yYXRl
KHBsbCwgcGFyZW50X3JhdGUsIHZhbCk7Cit9CisKK3N0YXRpYyB1MzIgengyOV9wbGxfY2FsY192
YWx1ZXMoY29uc3Qgc3RydWN0IHp4MjlfY2xrX3BsbCAqcGxsLCB1bnNpZ25lZCBsb25nIHBhcmVu
dF9yYXRlLAorCQkJCXVuc2lnbmVkIGxvbmcgcmF0ZSwgdW5zaWduZWQgbG9uZyBtaW5fcmF0ZSwg
dW5zaWduZWQgbG9uZyBtYXhfcmF0ZSkKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgcG9zdGRpdjFf
bWF4ID0gKDEgPDwgaHdlaWdodDMyKFpYMjlfUExMX1BPU1RESVYxX01BU0spKSAtIDE7CisJY29u
c3QgdW5zaWduZWQgaW50IHBvc3RkaXYyX21heCA9ICgxIDw8IGh3ZWlnaHQzMihaWDI5X1BMTF9Q
T1NURElWMl9NQVNLKSkgLSAxOworCXVuc2lnbmVkIGxvbmcgZmJkaXYsIHJlZmRpdiwgYmVzdF9m
YmRpdiA9IDAsIGJlc3RfcmVmZGl2ID0gMDsKKwl1MzIgcG9zdGRpdjEgPSAwLCBwb3N0ZGl2MiA9
IDAsIGksIGosIHNldHRpbmc7CisJY29uc3QgY2hhciAqbmFtZSA9IGNsa19od19nZXRfbmFtZSgm
cGxsLT5odyk7CisJbG9uZyBiZXN0ID0gTE9OR19NQVg7CisKKwkvKgorCSAqIFRoaXMgY29kZSBw
cm9kdWNlcyB0aGUgc2FtZSBWQ08gc2V0dGluZ3MgdGhhdCB0aGUgYm9vdCBsb2FkZXIgYW5kIHN0
b2NrIGZpcm13YXJlIHVzZSBmb3IKKwkgKiB0aGUgc3RhbmRhcmQgZnJlcXVlbmNpZXMuIEl0IGhh
cyBzZWVuIG9ubHkgdmVyeSBsaXR0bGUgbWFudWFsIHRlc3RpbmcgYmV5b25kIHRoYXQuCisJICoK
KwkgKiBUaGUgZ29hbCBpcyB0byBmaW5kIGEgVkNPIHNldHRpbmcgdGhhdCBnZXRzIHVzIGFzIGNs
b3NlIGFzIHBvc3NpYmxlIHRvIHRoZSBkZXNpcmVkIG91dHB1dAorCSAqIHJhdGUsIHdoaWxlIGJl
aW5nIHdpdGhpbiB0aGUgVkNPJ3Mgb3BlcmF0aW5nIGxpbWl0cyBhbmQgYWNoaWV2YWJsZSB3aXRo
IHRoZSBpbnB1dCB2YWx1ZQorCSAqIHJhbmdlLiBJdCBpcyBpdGVyYXRpbmcgb3ZlciBwb3NzaWJs
ZSBwb3N0LVZDTyBkaXZpZGVyIHZhbHVlcyAoMS03KSooMS03KSB0byBsb29rIGZvcgorCSAqIHZh
bGlkIFZDTyB0YXJnZXQgZnJlcXVlbmNpZXMgYW5kIHRoZW4gbG9va3MgZm9yIHJlZmRpdiBhbmQg
ZmJkaXYgdmFsdWVzIHRvIGFjaGlldmUgdGhlCisJICogVkNPIGZyZXF1ZW5jeSBmcm9tIHRoZSBy
ZWZlcmVuY2UgZnJlcXVlbmN5LgorCSAqLworCWZvciAoaiA9IDE7IGogPD0gcG9zdGRpdjJfbWF4
OyBqKyspIHsKKwkJZm9yIChpID0gMTsgaSA8PSBwb3N0ZGl2MV9tYXg7IGkrKykgeworCQkJdTY0
IHZjbyA9ICh1NjQpcmF0ZSAqIGkgKiBqOworCQkJdW5zaWduZWQgbG9uZyBvdXQ7CisKKwkJCWlm
ICh2Y28gPiBaWDI5X1BMTF9WQ09fTUFYX0ZSRVEgfHwgdmNvIDwgWlgyOV9QTExfVkNPX01JTl9G
UkVRKQorCQkJCWNvbnRpbnVlOworCisJCQlyYXRpb25hbF9iZXN0X2FwcHJveGltYXRpb24odmNv
LCBwYXJlbnRfcmF0ZSwKKwkJCQkJCSAgICAoMSA8PCBod2VpZ2h0MzIoWlgyOV9QTExfRkJESVZf
TUFTSykpIC0gMSwKKwkJCQkJCSAgICAoMSA8PCBod2VpZ2h0MzIoWlgyOV9QTExfUkVGRElWX01B
U0spKSAtIDEsCisJCQkJCQkgICAgJmZiZGl2LCAmcmVmZGl2KTsKKwkJCXNldHRpbmcgPSBmYmRp
diA8PCBaWDI5X1BMTF9GQkRJVl9TSElGVDsKKwkJCXNldHRpbmcgfD0gcmVmZGl2IDw8IFpYMjlf
UExMX1JFRkRJVl9TSElGVDsKKwkJCXNldHRpbmcgfD0gaSA8PCBaWDI5X1BMTF9QT1NURElWMV9T
SElGVDsKKwkJCXNldHRpbmcgfD0gaiA8PCBaWDI5X1BMTF9QT1NURElWMl9TSElGVDsKKwkJCW91
dCA9IHp4MjlfcGxsX2dldF9yYXRlKHBsbCwgcGFyZW50X3JhdGUsIHNldHRpbmcpOworCisJCQlp
ZiAob3V0IDwgbWluX3JhdGUgfHwgb3V0ID4gbWF4X3JhdGUpCisJCQkJY29udGludWU7CisKKwkJ
CWlmIChhYnNfZGlmZihvdXQsIHJhdGUpID4gYmVzdCkKKwkJCQljb250aW51ZTsKKworCQkJaWYg
KGFic19kaWZmKG91dCwgcmF0ZSkgPCBiZXN0KSB7CisJCQkJcG9zdGRpdjEgPSBpOworCQkJCXBv
c3RkaXYyID0gajsKKwkJCQliZXN0X2ZiZGl2ID0gZmJkaXY7CisJCQkJYmVzdF9yZWZkaXYgPSBy
ZWZkaXY7CisJCQkJYmVzdCA9IGFic19kaWZmKG91dCwgcmF0ZSk7CisKKwkJCQlpZiAoIWJlc3Qp
CisJCQkJCWdvdG8gc2VhcmNoX2RvbmU7CisJCQl9CisJCX0KKwl9CitzZWFyY2hfZG9uZToKKwor
CWlmICghcG9zdGRpdjEpIHsKKwkJZGV2X2VycihwbGwtPmRldiwgIkRpZCBub3QgZmluZCBhIHNl
dHRpbmcgZm9yICVsdSBIeiwgcGFyZW50ICVsdSBIelxuIiwKKwkJCXJhdGUsIHBhcmVudF9yYXRl
KTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGV2X2RiZyhwbGwtPmRldiwgIiVzOiBwYXJlbnQgcmF0
ZSAlbHVcbiIsIG5hbWUsIHBhcmVudF9yYXRlKTsKKwlkZXZfZGJnKHBsbC0+ZGV2LCAiJXM6IGZv
dW5kIFZDTyBkaXZpZGVycyAldSBhbmQgJXVcbiIsIG5hbWUsIHBvc3RkaXYxLCBwb3N0ZGl2Mik7
CisJZGV2X2RiZyhwbGwtPmRldiwgIiVzOiBWQ08gdGFyZ2V0IHJhdGUgJWx1XG4iLCBuYW1lLCBy
YXRlICogcG9zdGRpdjEgKiBwb3N0ZGl2Mik7CisKKwlkZXZfZGJnKHBsbC0+ZGV2LCAiJXM6IEdv
dCBmYmRpdiA9ICVsdSByZWZkaXYgPSAlbHVcbiIsIG5hbWUsIGJlc3RfZmJkaXYsIGJlc3RfcmVm
ZGl2KTsKKworCXNldHRpbmcgPSBiZXN0X2ZiZGl2IDw8IFpYMjlfUExMX0ZCRElWX1NISUZUOwor
CXNldHRpbmcgfD0gYmVzdF9yZWZkaXYgPDwgWlgyOV9QTExfUkVGRElWX1NISUZUOworCXNldHRp
bmcgfD0gcG9zdGRpdjEgPDwgWlgyOV9QTExfUE9TVERJVjFfU0hJRlQ7CisJc2V0dGluZyB8PSBw
b3N0ZGl2MiA8PCBaWDI5X1BMTF9QT1NURElWMl9TSElGVDsKKwlkZXZfZGJnKHBsbC0+ZGV2LCAi
JXM6IEZpbmFsIHNldHRpbmcgMHglMDh4XG4iLCBuYW1lLCBzZXR0aW5nKTsKKworCXJldHVybiBz
ZXR0aW5nOworfQorCitzdGF0aWMgaW50IHp4MjlfcGxsX2RldGVybWluZV9yYXRlKHN0cnVjdCBj
bGtfaHcgKmh3LCBzdHJ1Y3QgY2xrX3JhdGVfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCB6eDI5
X2Nsa19wbGwgKnBsbCA9IHRvX3p4MjlfY2xrX3BsbChodyk7CisJdW5zaWduZWQgbG9uZyBuZXdf
cmF0ZTsKKwl1MzIgc2V0dGluZzsKKworCS8qCisJICogVE9ETzogRFBMTCBjYW4gc3dpdGNoIGJl
dHdlZW4gdHdvIHBhcmVudHMsIG9uZSBvZiB3aGljaCBpcyBhbm90aGVyIFBMTC4gVGFrZSB0aGlz
IGludG8KKwkgKiBhY2NvdW50IHdoZW4gc2VhcmNoaW5nIHRoZSBjb25maWcgc3BhY2UgYW5kIHNl
dCByZXEtPmJlc3RfcGFyZW50X3JhdGUuCisJICoKKwkgKiBJbiBwcmFjdGljZSBpdCBzaG91bGRu
J3QgbWF0dGVyIHRob3VnaC4gRHBsbCBpcyBhbHdheXMgY29uZmlndXJlZCB0byBhIGZpeGVkIGZy
ZXF1ZW5jeQorCSAqIGFuZCBpcyB0aGUgb25seSBjbG9jayB3aXRoIGEgc3dpdGNoYWJsZSBwYXJl
bnQuCisJICovCisJaWYgKCFyZXEtPmJlc3RfcGFyZW50X3JhdGUpIHsKKwkJZGV2X2VycihwbGwt
PmRldiwgIkRpZCBub3QgZXhwZWN0IGJlc3RfcGFyZW50X3JhdGU9MFxuIik7CisJCXJldHVybiAt
RUlOVkFMOworCX0KKworCXNldHRpbmcgPSB6eDI5X3BsbF9jYWxjX3ZhbHVlcyhwbGwsIHJlcS0+
YmVzdF9wYXJlbnRfcmF0ZSwgcmVxLT5yYXRlLCByZXEtPm1pbl9yYXRlLAorCQkJCSAgICAgICBy
ZXEtPm1heF9yYXRlKTsKKwlpZiAoIXNldHRpbmcpCisJCXJldHVybiAtRUlOVkFMOworCisJbmV3
X3JhdGUgPSB6eDI5X3BsbF9nZXRfcmF0ZShwbGwsIHJlcS0+YmVzdF9wYXJlbnRfcmF0ZSwgc2V0
dGluZyk7CisJaWYgKG5ld19yYXRlICE9IHJlcS0+cmF0ZSkgeworCQlkZXZfd2FybihwbGwtPmRl
diwgIkRpZCBub3QgZmluZCBhbiBleGFjdCBtYXRjaC4gV2FudCAlbHUsIGdvdCAlbHVcbiIsCisJ
CQkgcmVxLT5yYXRlLCBuZXdfcmF0ZSk7CisJCXJlcS0+cmF0ZSA9IG5ld19yYXRlOworCX0KKwor
CXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHp4MjlfcGxsX3NldF9yYXRlKHN0cnVjdCBjbGtf
aHcgKmh3LCB1bnNpZ25lZCBsb25nIHJhdGUsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgcGFyZW50
X3JhdGUpCit7CisJc3RydWN0IHp4MjlfY2xrX3BsbCAqcGxsID0gdG9fengyOV9jbGtfcGxsKGh3
KTsKKwl1MzIgc2V0dGluZzsKKworCS8qCisJICogVE9ETzogSW1wbGVtZW50IGdyYWR1YWwgUExM
IHJhdGUgY2hhbmdlLiBQTExzIGNhbiBiZSBjaGFuZ2VkIHdoaWxlIHRoZXkgYXJlIHJ1bm5pbmcg
YW5kCisJICogZG93bnN0cmVhbSBoYXJkd2FyZSBpcyBnZW5lcmFsbHkgZmluZSB3aXRoIHRoYXQu
IFRoZSBleGNlcHRpb24gaXMgRFJBTSwgd2hpY2ggcmVhZHMKKwkgKiBpbmNvcnJlY3QgdmFsdWVz
IGlmIGNoYW5nZWQgdG9vIGZhc3QuCisJICoKKwkgKiBDaGFuZ2luZyB0aGUgbXBsbCByYXRlIGlz
IHBvdGVudGlhbGx5IHVzZWZ1bCBmb3Igb3Zlci91bmRlcmNsb2NraW5nLiBHYXRpbmcgbXBsbCBp
cworCSAqIHVucmVhbGlzdGljIGJlY2F1c2UgdG9vIG1hbnkgZGV2aWNlcyBkZXBlbmQgb24gaXQu
CisJICovCisJc2V0dGluZyA9IHp4MjlfcGxsX2NhbGNfdmFsdWVzKHBsbCwgcGFyZW50X3JhdGUs
IHJhdGUsIHJhdGUsIHJhdGUpOworCWlmICghc2V0dGluZykKKwkJcmV0dXJuIC1FSU5WQUw7CisK
KwlkZXZfaW5mbyhwbGwtPmRldiwgIiVzOiBTZXR0aW5nIG5ldyBjb25maWd1cmF0aW9uOiAweCUw
OHhcbiIsIGNsa19od19nZXRfbmFtZShodyksIHNldHRpbmcpOworCisJcmV0dXJuIHJlZ21hcF91
cGRhdGVfYml0cyhwbGwtPm1hcCwgcGxsLT5yZWcsIDB4MDBmZmZmZmYsIHNldHRpbmcpOworfQor
CitzdGF0aWMgdTggengyOV9wbGxfZ2V0X3BhcmVudChzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlz
dHJ1Y3QgengyOV9jbGtfcGxsICpwbGwgPSB0b196eDI5X2Nsa19wbGwoaHcpOworCXUzMiB2YWw7
CisJaW50IHJlczsKKworCXJlcyA9IHJlZ21hcF9yZWFkKHBsbC0+bWFwLCBwbGwtPnJlZywgJnZh
bCk7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiAweGZmOworCisJdmFsID0gKHZhbCAmIFpYMjlf
UExMX1BBUkVOVF9NQVNLKSA+PiBaWDI5X1BMTF9QQVJFTlRfU0hJRlQ7CisJZGV2X2RiZyhwbGwt
PmRldiwgIiVzOiBQYXJlbnQgMHgleFxuIiwgY2xrX2h3X2dldF9uYW1lKGh3KSwgdmFsKTsKKwor
CXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgengyOV9wbGxfc2V0X3BhcmVudChzdHJ1Y3Qg
Y2xrX2h3ICpodywgdTggaW5kZXgpCit7CisJc3RydWN0IHp4MjlfY2xrX3BsbCAqcGxsID0gdG9f
engyOV9jbGtfcGxsKGh3KTsKKwl1MzIgaWR4X3NoaWZ0ID0gaW5kZXggPDwgWlgyOV9QTExfUEFS
RU5UX1NISUZUOworCWludCByZXM7CisJdTMyIHZhbDsKKworCXJlcyA9IHJlZ21hcF91cGRhdGVf
Yml0cyhwbGwtPm1hcCwgcGxsLT5yZWcsIFpYMjlfUExMX1BBUkVOVF9NQVNLLCBpZHhfc2hpZnQp
OworCWlmIChyZXMgPCAwKQorCQlyZXR1cm4gcmVzOworCisJcmVzID0gcmVnbWFwX3JlYWQocGxs
LT5tYXAsIHBsbC0+cmVnLCAmdmFsKTsKKwlpZiAocmVzIDwgMCkKKwkJcmV0dXJuIHJlczsKKwor
CWlmICgodmFsICYgWlgyOV9QTExfUEFSRU5UX01BU0spICE9IGlkeF9zaGlmdCkgeworCQlkZXZf
ZXJyKHBsbC0+ZGV2LCAiSGFyZHdhcmUgcmVqZWN0ZWQgUExMIHBhcmVudCAldVxuIiwgaW5kZXgp
OworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB6
eDI5X3BsbF9pbml0KHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCB6eDI5X2Nsa19wbGwg
KnBsbCA9IHRvX3p4MjlfY2xrX3BsbChodyk7CisJY29uc3QgY2hhciAqbmFtZSA9IGNsa19od19n
ZXRfbmFtZShodyk7CisJaW50IHJlczsKKwl1MzIgdmFsOworCisJZGV2X2RiZyhwbGwtPmRldiwg
IiVzOiBpbml0aWFsaXppbmdcbiIsIG5hbWUpOworCisJLyoKKwkgKiBUaGUgZnJhY3Rpb25hbCB2
YWx1ZSBpcyBub3QgeWV0IGltcGxlbWVudGVkLiBJdCB3b3JrcyBhdCBsZWFzdCB3aXRoIGRwbGws
IGJ1dCBJIGhhdmUKKwkgKiBuZXZlciBzZWVuIGl0IHVzZWQgb24gYWN0dWFsIGhhcmR3YXJlLgor
CSAqLworCXJlcyA9IHJlZ21hcF9yZWFkKHBsbC0+bWFwLCBwbGwtPnJlZyArIFpYMjlfUExMX1JF
RzJfT0ZGU0VULCAmdmFsKTsKKwlpZiAocmVzIDwgMCkKKwkJcmV0dXJuIHJlczsKKworCWlmICh2
YWwgJiBaWDI5X1BMTF9GUkFDVCkgeworCQlkZXZfd2FybihwbGwtPmRldiwgIiVzOiB1bnN1cHBv
cnRlZCBub256ZXJvIGZyYWN0aW9uYWwgdmFsdWUgMHglMDhseFxuIiwKKwkJCSBuYW1lLCB2YWwg
JiBaWDI5X1BMTF9GUkFDVCk7CisJfQorCisJLyoKKwkgKiBSZW1vdmUgdGhlIGJ5cGFzcyBmbGFn
IHNvIHdlIGRvbid0IGhhdmUgdG8gYm90aGVyIHdpdGggaXQgaW4gZW5hYmxlL2Rpc2FibGUuIEkg
aGF2ZSBuZXZlcgorCSAqIHNlZW4gaXQgc2V0IGJ5IHRoZSBlYXJsaWVyIGJvb3Qgc3RhZ2VzIGFu
eWhvdy4KKwkgKi8KKwlyZXMgPSByZWdtYXBfY2xlYXJfYml0cyhwbGwtPm1hcCwgcGxsLT5yZWcs
IFpYMjlfUExMX0JZUEFTUyk7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisKKwlyZXMg
PSByZWdtYXBfdGVzdF9iaXRzKHBsbC0+bWFwLCBwbGwtPnJlZywgWlgyOV9QTExfRElTQUJMRSk7
CisJaWYgKHJlcyA+IDApIHsKKwkJLyoKKwkJICogU2V0IFpYMjlfUExMX1BPU1RESVZfT1VUX0RJ
U0FCTEUgZm9yIFBMTHMgdGhhdCBoYXZlIFpYMjlfUExMX0RJU0FCTEUgZm9yCisJCSAqIGNvbnNp
c3RlbmN5IHdpdGggLmVuYWJsZSBhbmQgLnByZXBhcmUuIFRoaXMgZW5zdXJlcyB0aGF0IC5wcmVw
YXJlIGRvZXNuJ3QKKwkJICogaW5hZHZlcnRlbnRseSBlbmFibGUgUExMcyB3aXRob3V0IC5lbmFi
bGUgYmVpbmcgY2FsbGVkLgorCQkgKi8KKwkJcmVzID0gcmVnbWFwX3NldF9iaXRzKHBsbC0+bWFw
LCBwbGwtPnJlZyArIFpYMjlfUExMX1JFRzJfT0ZGU0VULAorCQkJCSAgICAgIFpYMjlfUExMX1BP
U1RESVZfT1VUX0RJU0FCTEUpOworCX0KKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBjb25z
dCBzdHJ1Y3QgY2xrX29wcyB6eDI5X3BsbF9vcHMgPSB7CisJLmluaXQJCT0gengyOV9wbGxfaW5p
dCwKKwkuaXNfcHJlcGFyZWQJPSB6eDI5X3BsbF9pc19wcmVwYXJlZCwKKwkucHJlcGFyZQk9IHp4
MjlfcGxsX3ByZXBhcmUsCisJLnVucHJlcGFyZQk9IHp4MjlfcGxsX3VucHJlcGFyZSwKKwkuaXNf
ZW5hYmxlZAk9IHp4MjlfcGxsX2lzX2VuYWJsZWQsCisJLmVuYWJsZQkJPSB6eDI5X3BsbF9lbmFi
bGUsCisJLmRpc2FibGUJPSB6eDI5X3BsbF9kaXNhYmxlLAorCS5yZWNhbGNfcmF0ZQk9IHp4Mjlf
cGxsX3JlY2FsY19yYXRlLAorCS5kZXRlcm1pbmVfcmF0ZSA9IHp4MjlfcGxsX2RldGVybWluZV9y
YXRlLAorCS5nZXRfcGFyZW50CT0gengyOV9wbGxfZ2V0X3BhcmVudCwKKwkuc2V0X3BhcmVudAk9
IHp4MjlfcGxsX3NldF9wYXJlbnQsCisJLnNldF9yYXRlCT0gengyOV9wbGxfc2V0X3JhdGUsCit9
OworCisvKgorICogQSBQTEwgdGhhdCBjYW4gYmUgYSBwYXJlbnQgb2YgYW5vdGhlciBQTEwgbmVl
ZHMgdG8gcHJvZHVjZSBhbiBvdXRwdXQgc2lnbmFsIHdoZW4gcHJlcGFyZWQsCisgKiBvdGhlcndp
c2UgdGhlIGRvd25zdHJlYW0gUExMJ3MgcHJlcGFyZSgpIHdpbGwgZmFpbCB0byBhY3F1aXJlIGEg
bG9jay4KKyAqLworc3RhdGljIGludCB6eDI5X3BsbF9ub2Rpc2FibGVfaW5pdChzdHJ1Y3QgY2xr
X2h3ICpodykKK3sKKwlzdHJ1Y3QgengyOV9jbGtfcGxsICpwbGwgPSB0b196eDI5X2Nsa19wbGwo
aHcpOworCWNvbnN0IGNoYXIgKm5hbWUgPSBjbGtfaHdfZ2V0X25hbWUoaHcpOworCWludCByZXM7
CisJdTMyIHZhbDsKKworCWRldl9kYmcocGxsLT5kZXYsICIlczogaW5pdGlhbGl6aW5nLCBwcmVw
YXJlLWlzLWVuYWJsZWRcbiIsIG5hbWUpOworCisJcmVzID0gcmVnbWFwX3JlYWQocGxsLT5tYXAs
IHBsbC0+cmVnICsgWlgyOV9QTExfUkVHMl9PRkZTRVQsICZ2YWwpOworCWlmIChyZXMgPCAwKQor
CQlyZXR1cm4gcmVzOworCisJaWYgKHZhbCAmIFpYMjlfUExMX0ZSQUNUKSB7CisJCWRldl93YXJu
KHBsbC0+ZGV2LCAiJXM6IHVuc3VwcG9ydGVkIG5vbnplcm8gZnJhY3Rpb25hbCB2YWx1ZSAweCUw
OGx4XG4iLAorCQkJIG5hbWUsIHZhbCAmIFpYMjlfUExMX0ZSQUNUKTsKKwl9CisKKwlyZXMgPSBy
ZWdtYXBfY2xlYXJfYml0cyhwbGwtPm1hcCwgcGxsLT5yZWcsIFpYMjlfUExMX0JZUEFTUyk7CisJ
aWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisKKwlyZXR1cm4gcmVnbWFwX2NsZWFyX2JpdHMo
cGxsLT5tYXAsIHBsbC0+cmVnICsgWlgyOV9QTExfUkVHMl9PRkZTRVQsCisJCQkJIFpYMjlfUExM
X1BPU1RESVZfT1VUX0RJU0FCTEUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMg
engyOV9wbGxfbm9kaXNhYmxlX29wcyA9IHsKKwkuaW5pdAkJPSB6eDI5X3BsbF9ub2Rpc2FibGVf
aW5pdCwKKwkuaXNfcHJlcGFyZWQJPSB6eDI5X3BsbF9pc19wcmVwYXJlZCwKKwkucHJlcGFyZQk9
IHp4MjlfcGxsX3ByZXBhcmUsCisJLnVucHJlcGFyZQk9IHp4MjlfcGxsX3VucHJlcGFyZSwKKwku
cmVjYWxjX3JhdGUJPSB6eDI5X3BsbF9yZWNhbGNfcmF0ZSwKKwkuZGV0ZXJtaW5lX3JhdGUgPSB6
eDI5X3BsbF9kZXRlcm1pbmVfcmF0ZSwKKwkuZ2V0X3BhcmVudAk9IHp4MjlfcGxsX2dldF9wYXJl
bnQsCisJLnNldF9wYXJlbnQJPSB6eDI5X3BsbF9zZXRfcGFyZW50LAorCS5zZXRfcmF0ZQk9IHp4
MjlfcGxsX3NldF9yYXRlLAorfTsKKwogc3RydWN0IGNsa19odyAqenhfY2xrX3JlZ2lzdGVyX3Bs
bChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKLQkJCQkgICBjb25z
dCBzdHJ1Y3QgenhfcGxsX2Rlc2MgKmRlc2MsCi0JCQkJICAgc3RydWN0IGNsa19odyAqIGNvbnN0
ICpjbG9ja3MpCisJCQkJICAgY29uc3Qgc3RydWN0IHp4X3BsbF9kZXNjICpkZXNjLCBzdHJ1Y3Qg
Y2xrX2h3ICogY29uc3QgKmNsb2NrcykKIHsKLQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwlz
dHJ1Y3QgY2xrX3BhcmVudF9kYXRhIHBhcmVudHNbQ0xLX1pYX01BWF9QQVJFTlRTXTsKKwlzdHJ1
Y3QgY2xrX2luaXRfZGF0YSBpbml0ID0ge307CisJc3RydWN0IHp4MjlfY2xrX3BsbCAqcGxsOwor
CXVuc2lnbmVkIGludCBpOworCWludCByZXM7CisKKwlwbGwgPSBkZXZtX2t6YWxsb2MoZGV2LCBz
aXplb2YoKnBsbCksIEdGUF9LRVJORUwpOworCWlmICghcGxsKQorCQlyZXR1cm4gRVJSX1BUUigt
RU5PTUVNKTsKKworCWlmIChkZXNjLT5mbGFncyAmIENMS19aWF9QTExfUFJFUEFSRV9JU19FTkFC
TEUpCisJCWluaXQub3BzID0gJnp4MjlfcGxsX25vZGlzYWJsZV9vcHM7CisJZWxzZQorCQlpbml0
Lm9wcyA9ICZ6eDI5X3BsbF9vcHM7CisKKwlpZiAoV0FSTl9PTihkZXNjLT5udW1fcGFyZW50cyA+
IEFSUkFZX1NJWkUocGFyZW50cykpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWZv
ciAoaSA9IDA7IGkgPCBkZXNjLT5udW1fcGFyZW50czsgKytpKQorCQlwYXJlbnRzW2ldID0genhf
Z2V0X3BhcmVudCgmZGVzYy0+cGFyZW50c1tpXSwgY2xvY2tzKTsKKworCWluaXQubmFtZSA9IGRl
c2MtPm5hbWU7CisJaW5pdC5wYXJlbnRfZGF0YSA9IHBhcmVudHM7CisJaW5pdC5udW1fcGFyZW50
cyA9IGRlc2MtPm51bV9wYXJlbnRzOworCisJLyoKKwkgKiBEaXNhbGxvdyBsaXZlIHJlcGFyZW50
LCBidXQgYWxsb3cgcmF0ZSBjaGFuZ2VzLiBQTExzIGNhbiBoYW5kbGUgZ3JhZHVhbCBjaGFuZ2Vz
IGZpbmUsIGJ1dAorCSAqIGxhcmdlIG9uZXMgY2F1c2UgYSB0ZW1wb3JhcnkgaW5jb3JyZWN0IG91
dHB1dCwgd2hpY2ggY2FuIGJyZWFrIGRvd25zdHJlYW0gZGV2aWNlcy4KKwkgKiBTZWUgengyOV9w
bGxfc2V0X3JhdGUgZm9yIGNvbnNpZGVyYXRpb25zIG9uIHRoYXQuCisJICovCisJaW5pdC5mbGFn
cyA9IENMS19TRVRfUEFSRU5UX0dBVEU7CisJcGxsLT5ody5pbml0ID0gJmluaXQ7CisJcGxsLT5k
ZXYgPSBkZXY7CisJcGxsLT5tYXAgPSByZWdtYXA7CisJcGxsLT5yZWcgPSBkZXNjLT5yZWc7CisK
KwlyZXMgPSBkZXZtX2Nsa19od19yZWdpc3RlcihkZXYsICZwbGwtPmh3KTsKKwlpZiAocmVzKQor
CQlyZXR1cm4gRVJSX1BUUihyZXMpOworCisJLyoKKwkgKiBTZXQgdGhlIFBMTCByYXRlIG9ubHkg
aWYgdGhlIGJvb3Rsb2FkZXIgbGVmdCBpdCBkaXNhYmxlZC4gS2VlcCB0aGUgYm9vdGxvYWRlciBz
ZXR1cAorCSAqIG90aGVyd2lzZS4KKwkgKi8KKwlyZXMgPSByZWdtYXBfdGVzdF9iaXRzKHBsbC0+
bWFwLCBwbGwtPnJlZywgWlgyOV9QTExfRElTQUJMRSk7CisJaWYgKHJlcyA8IDApCisJCXJldHVy
biBFUlJfUFRSKHJlcyk7CisKKwlpZiAocmVzID4gMCAmJiBkZXNjLT5yYXRlKSB7CisJCWRldl9k
YmcocGxsLT5kZXYsICIlczogc2V0dGluZyB0byAlbHUgSHpcbiIsIGRlc2MtPm5hbWUsIGRlc2Mt
PnJhdGUpOworCQlyZXMgPSBjbGtfc2V0X3JhdGUocGxsLT5ody5jbGssIGRlc2MtPnJhdGUpOwor
CQlpZiAocmVzKQorCQkJcmV0dXJuIEVSUl9QVFIoZGV2X2Vycl9wcm9iZShkZXYsIHJlcywgIiVz
OiBmYWlsZWQgdG8gc2V0IHJhdGVcbiIsCisJCQkJCQkgICAgIGRlc2MtPm5hbWUpKTsKKwl9CisK
KwlyZXR1cm4gJnBsbC0+aHc7CiB9CgotLSAKMi41NC4wCgoKLS0gCmxpbnV4LXBoeSBtYWlsaW5n
IGxpc3QKbGludXgtcGh5QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cHM6Ly9saXN0cy5pbmZyYWRl
YWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcGh5Cg==