[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==