From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Ge Gao MIME-Version: 1.0 Date: Thu, 28 Jun 2012 11:30:27 -0700 Message-ID: Subject: [PATCH 1/4] IIO: Invensense MPU6050/MPU9150 driver submit To: linux-iio@vger.kernel.org Cc: linux-iio-owner@vger.kernel.org, Jonathan Cameron Content-Type: multipart/mixed; boundary=f46d04428cc8c604a304c38c8669 List-ID: --f46d04428cc8c604a304c38c8669 Content-Type: multipart/alternative; boundary=f46d04428cc8c6049c04c38c8667 --f46d04428cc8c6049c04c38c8667 Content-Type: text/plain; charset=ISO-8859-1 Hi All, Attached is the Invensense MPU6050/9150 IIO driver submit. Thanks. Best Regards, Ge GAO --f46d04428cc8c6049c04c38c8667 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

Hi All,

=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 Attached is the Invensen= se MPU6050/9150 IIO driver submit. Thanks.

=A0

Best Regards,

=A0

Ge GAO

=A0

--f46d04428cc8c6049c04c38c8667-- --f46d04428cc8c604a304c38c8669 Content-Type: application/octet-stream; name="0001-Invensense-MPU6050-MPU9150-driver.patch" Content-Disposition: attachment; filename="0001-Invensense-MPU6050-MPU9150-driver.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: 98eaa35256ebe025_0.1 RnJvbSA2ZDQwOTNhNTlkNzdhNjhkNDk3MmY2NDhlYTllYmE2OWU4NTk4MTU5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBHZSBHYW8gPGdnYW9AaW52ZW5zZW5zZS5jb20+CkRhdGU6IFRo dSwgMjggSnVuIDIwMTIgMTA6NTg6MTIgLTA3MDAKU3ViamVjdDogW1BBVENIIDEvNF0gICAgIElu dmVuc2Vuc2UgTVBVNjA1MC9NUFU5MTUwIGRyaXZlci4KCiAgICAgIC0tTVBVNjA1MC9NUFU5MTUw IGRyaXZlci4KICAgICAgLS1TZWNvbmRhcnkgYnVzIGZvciBBS004OTc1L0FLTTg5NjMvQUtNODk3 MiBzdXBwb3J0LgogICAgICAtLWtlcm5lbCBmaXggZm9yIEtmaWZvIHBvbGwgc3VwcG9ydCBmcm9t IEpvbmFudGhhbi4KICAgICAgLS1LZmlmbyBidWcgZml4LiBOZWVkIHRvIGNoZWNrIGF2YWlsYWJs ZSBzcGFjZSBiZWZvcmUgc3RvcmUuCiAgICAgIC0tYWRkIG5ldyBJSU8gdHlwZSBmb3IgcXVhdGVy bmlvbi4KCkNoYW5nZS1JZDogSTQwMjNkMzIyMTkzZmE4OWRmOGNlYjg0ZTZiOTU2MTFiZTQyNjRl NDkKU2lnbmVkLW9mZi1ieTogR2UgR2FvIDxnZ2FvQGludmVuc2Vuc2UuY29tPgotLS0KIGRyaXZl cnMvc3RhZ2luZy9paW8vaW11L0tjb25maWcgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBk cml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICB8ICAgIDMg KwogZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvbXB1NjA1MC9LY29uZmlnICAgICAgICAgICAgfCAg IDEzICsKIGRyaXZlcnMvc3RhZ2luZy9paW8vaW11L21wdTYwNTAvTWFrZWZpbGUgICAgICAgICAg IHwgICAxMSArCiBkcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9tcHU2MDUwL1JFQURNRSAgICAgICAg ICAgICB8ICAyOTYgKysrKysrKysKIC4uLi9zdGFnaW5nL2lpby9pbXUvbXB1NjA1MC9kbXBEZWZh dWx0TVBVNjA1MC5jICAgIHwgIDI5MCArKysrKysrKwogZHJpdmVycy9zdGFnaW5nL2lpby9pbXUv bXB1NjA1MC9kbXBLZXkuaCAgICAgICAgICAgfCAgNDk0ICsrKysrKysrKysrKysKIGRyaXZlcnMv c3RhZ2luZy9paW8vaW11L21wdTYwNTAvZG1wbWFwLmggICAgICAgICAgIHwgIDI2NiArKysrKysr CiBkcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9tcHU2MDUwL2ludl9tcHVfaWlvLmggICAgICB8ICA3 MjcgKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvc3RhZ2luZy9paW8vaW11L21wdTYwNTAv aW52X21wdV9yaW5nLmMgICAgIHwgIDU2MyArKysrKysrKysrKysrKysKIGRyaXZlcnMvc3RhZ2lu Zy9paW8vaW11L21wdTYwNTAvbXB1LmggICAgICAgICAgICAgIHwgIDEwNyArKysKIDExIGZpbGVz IGNoYW5nZWQsIDI3NzEgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9tcHU2MDUwL0tjb25maWcKIGNyZWF0ZSBt b2RlIDEwMDY0NCBkcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9tcHU2MDUwL01ha2VmaWxlCiBjcmVh dGUgbW9kZSAxMDA2NDQgZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvbXB1NjA1MC9SRUFETUUKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9tcHU2MDUwL2RtcERlZmF1 bHRNUFU2MDUwLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9t cHU2MDUwL2RtcEtleS5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9zdGFnaW5nL2lpby9p bXUvbXB1NjA1MC9kbXBtYXAuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvc3RhZ2luZy9p aW8vaW11L21wdTYwNTAvaW52X21wdV9paW8uaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv c3RhZ2luZy9paW8vaW11L21wdTYwNTAvaW52X21wdV9yaW5nLmMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBkcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9tcHU2MDUwL21wdS5oCgpkaWZmIC0tZ2l0IGEvZHJp dmVycy9zdGFnaW5nL2lpby9pbXUvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L0tj b25maWcKaW5kZXggMmMyZjQ3ZC4uZTI3YzI2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5n L2lpby9pbXUvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9LY29uZmlnCkBA IC0xNCw0ICsxNCw1IEBAIGNvbmZpZyBBRElTMTY0MDAKIAkgIGFkaXMxNjM2NSwgYWRpczE2NDAw IGFuZCBhZGlzMTY0MDUgdHJpYXhpYWwgaW5lcnRpYWwgc2Vuc29ycwogCSAgKGFkaXMxNjQwMCBz ZXJpZXMgYWxzbyBoYXZlIG1hZ25ldG9tZXRlcnMpLgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2lu Zy9paW8vaW11L21wdTYwNTAvS2NvbmZpZyIKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMv c3RhZ2luZy9paW8vaW11L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvTWFrZWZp bGUKaW5kZXggMzQwMGExMy4uOTIwZWIxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lp by9pbXUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvTWFrZWZpbGUKQEAg LTUsMyArNSw2IEBACiBhZGlzMTY0MDAteSAgICAgICAgICAgICA6PSBhZGlzMTY0MDBfY29yZS5v CiBhZGlzMTY0MDAtJChDT05GSUdfSUlPX0JVRkZFUikgKz0gYWRpczE2NDAwX3JpbmcubyBhZGlz MTY0MDBfdHJpZ2dlci5vCiBvYmotJChDT05GSUdfQURJUzE2NDAwKSArPSBhZGlzMTY0MDAubwor CitvYmoteSArPSBtcHU2MDUwLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lt dS9tcHU2MDUwL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9tcHU2MDUwL0tjb25m aWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmYTJjMgotLS0gL2Rldi9u dWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L21wdTYwNTAvS2NvbmZpZwpAQCAtMCww ICsxLDEzIEBACisjCisjIGludi1tcHUtNjA1MCBkcml2ZXJzIGZvciBJbnZlbnNlbnNlIE1QVSBk ZXZpY2VzIGFuZCBjb21ib3MKKyMKKworY29uZmlnIElOVl9NUFU2MDUwX0lJTworCXRyaXN0YXRl ICJJbnZlbnNlbnNlIE1QVTYwNTAgZGV2aWNlcyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBTWVNGUyAm JiBJSU8gJiYgSUlPX0tGSUZPX0JVRiAmJiAhSU5WX01QVSAmJiAhSU5WX01QVV9JSU8KKwlkZWZh dWx0IG4KKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgSW52ZW5zZW5zZSBNUFU2 MDUwL01QVTkxNTAgZGV2aWNlcy4gSXQgYWxzbworCSAgc3VwcG9ydHMgQUtNODk3NS9BS004OTYz L0FLTTg5NzIgaW4gdGhlIHNlY29uZGFyeSBidXMuCisJICBUaGlzIGRyaXZlciBjYW4gYmUgYnVp bHQgYXMgYSBtb2R1bGUuIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIGludi1tcHU2MDUw LWlpby4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L21wdTYwNTAvTWFrZWZp bGUgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9tcHU2MDUwL01ha2VmaWxlCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNWU3NDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2 ZXJzL3N0YWdpbmcvaWlvL2ltdS9tcHU2MDUwL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKKyMK KyMgTWFrZWZpbGUgZm9yIEludmVuc2Vuc2UgaW52LW1wdTYwNTAtaWlvIGRldmljZS4KKyMKKwor b2JqLSQoQ09ORklHX0lOVl9NUFU2MDUwX0lJTykgKz0gaW52LW1wdTYwNTAtaWlvLm8KKworaW52 LW1wdTYwNTAtaWlvLW9ianMgOj0gaW52X21wdV9jb3JlLm8KK2ludi1tcHU2MDUwLWlpby1vYmpz ICs9IGludl9tcHVfcmluZy5vCitpbnYtbXB1NjA1MC1paW8tb2JqcyArPSBpbnZfbXB1X21pc2Mu bworaW52LW1wdTYwNTAtaWlvLW9ianMgKz0gZG1wRGVmYXVsdE1QVTYwNTAubworCmRpZmYgLS1n aXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9tcHU2MDUwL1JFQURNRSBiL2RyaXZlcnMvc3Rh Z2luZy9paW8vaW11L21wdTYwNTAvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAuLjgwNmE5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lt dS9tcHU2MDUwL1JFQURNRQpAQCAtMCwwICsxLDI5NiBAQAorS2VybmVsIGRyaXZlciBpbnYtbXB1 LWlpbworQXV0aG9yOiBJbnZlbnNlbnNlIDxodHRwOi8vaW52ZW5zZW5zZS5jb20+CisKK0Rlc2Ny aXB0aW9uCistLS0tLS0tLS0tLQorVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgaG93IHRvIGluc3Rh bGwgdGhlIEludmVuc2Vuc2UgZGV2aWNlIGRyaXZlciBpbnRvIGEKK0xpbnV4IGtlcm5lbC4gQXQg dGhlIG1vbWVudCwgdGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlCitNUFU2MDUwL01QVTkxNTAuIFRo ZSBzbGF2ZSBhZGRyZXNzIG9mIHRoZXNlIGZvdXIgY2hpcHMgYXJlCisweDY4IG9yIDB4NjkuIEhv d2V2ZXIsIHRoZSBhY3R1YWwgc2xhdmUgYWRkcmVzcyBkZXBlbmRzIG9uIHRoZSBib2FyZAorY29u ZmlndXJhdGlvbi4gVGhlIGRyaXZlciBkb2VzIG5vdCBhc3N1bWUgYW55dGhpbmcgYWJvdXQgaXQu CisKK0ZpbGVzIGluY2x1ZGVkIGluIHRoaXMgcGFja2FnZToKK0tjb25maWcKK01ha2VmaWxlCitp bnZfbXB1X2NvcmUuYworaW52X21wdV9taXNjLmMKK2ludl9tcHVfaWlvLmgKK2ludl9tcHVfcmlu Zy5jCitkbXBEZWZhdWx0TVBVNjA1MC5jCitkbXBrZXkuaAorZG1wbWFwLmgKK21wdS5oCitJbmNs dWRpbmcgdGhlIGRyaXZlciBpbiB0aGUgTGludXgga2VybmVsCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCittcHUuaCBzaG91bGQgYmUgYWRkZWQgdG8gImtlcm5lbC9p bmNsdWRlL2xpbnV4Ii4KK090aGVyIGZpbGVzIGxpc3RlZCBzaG91bGQgYmUgYWRkZWQgdG8gdGhl IGRyaXZlcnMvc3RhZ2luZy9paW8vaW11L21wdQorZGlyZWN0b3J5IChvciBhbm90aGVyIGRpcmVj dG9yeSBvZiB5b3VyIGNob29zaW5nKS4gV2hlbiBidWlsZGluZyB0aGUKK2tlcm5lbCwgdGhlIGRy aXZlciB3aWxsIG5vdCBhcHBlYXIgaW4gbWVudWNvbmZpZyB3aXRob3V0IG1vZGlmaWNhdGlvbnMK K3NpbWlsYXIgdG8gdGhvc2UgYmVsb3c6CisKK21vZGlmeSAiZHJpdmVycy9zdGFnaW5nL2lpby9p bXUvS2NvbmZpZyIgbGlrZQorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9tcHUvS2Nv bmZpZyIKKworbW9kaWZ5ICJkcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9NYWtlZmlsZSIKK29iai15 ICs9IG1wdS8KKworQm9hcmQgYW5kIFBsYXRmb3JtIERhdGEKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCitUaGUgYm9hcmQgZmlsZSBuZWVkcyB0byBiZSBtb2RpZmllZCB0byByZWdpc3RlciB0aGUg ZGV2aWNlIG9uIGFuIEkyQyBidXMuIEFuCitpMmNfYm9hcmRfaW5mbyBpbnN0YW5jZSBtdXN0IGJl IGRlZmluZWQgYXMgc2VlbiBiZWxvdy4gVGhlIGhhcmRjb2RlZCB2YWx1ZSBvZgorMTQwIGNvcnJl c3BvbmRzIHRvIHRoZSBHUElPIGlucHV0IHBpbiB3aXJlZCB0byB0aGUgZGV2aWNlJ3MgaW50ZXJy dXB0IHBpbi4KK1RoaXMgcGluIHdpbGwgbW9zdCBsaWtlbHkgYmUgZGlmZmVyZW50IGZvciB5b3Vy IHBsYXRmb3JtLgorcGxhdGZvcm0gZGF0YSBpcyBmb3Igb3JpZW50YXRpb24gbWF0cml4LCAgYW5k IHNlY29uZGFyeSBidXMgc2l0dWF0aW9ucy4KK0ZvciBNUFU5MTUwLCBpdCBpcyByZWdhcmRlZCBh cyBhIE1QVTkxNTAgYW5kIEFLTTg5NzUgaW4gdGhlIHNlY29uZGFyeS4KK1NvIHRoZSBzZWNvbmRh cnkgaTJjIGFkZHJlc3MgbXVzdCBiZSBmaWxsZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIGJvYXJkIGZpbGUg aXMgYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwNHBhbmRhLmMgZm9yIHBhbmRhIGJvYXJk IG9yCittb2RpZnkgdGhlIGJvYXJkIGZpbGUgaW4geW91ciBzeXN0ZW0gYXMgYmVsb3c6CistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9y IEFLTTg5NjMgaW4gdGhlIHNlY29uZGFyeSBpMmMgYnVzIG9mIE1QVTYwNTAsCitzdGF0aWMgc3Ry dWN0IG1wdV9wbGF0Zm9ybV9kYXRhIGd5cm9fcGxhdGZvcm1fZGF0YSA9IHsKKwkuaW50X2NvbmZp ZyAgPSAweDEwLAorCS5sZXZlbF9zaGlmdGVyID0gMCwKKwkub3JpZW50YXRpb24gPSB7ICAtMSwg IDAsICAwLAorCQkJICAgMCwgIDEsICAwLAorCQkJICAgMCwgIDAsIC0xIH0sCisJLnNlY19zbGF2 ZV90eXBlID0gU0VDT05EQVJZX1NMQVZFX1RZUEVfQ09NUEFTUywKKwkuc2VjX3NsYXZlX2lkICAg PSBDT01QQVNTX0lEX0FLODk2MywKKwkuc2Vjb25kYXJ5X2kyY19hZGRyID0gMHgwRQorfTsKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CitGb3IgTVBVOTE1MCwgdGhlIHNlY29uZGFyeSBpMmMgYnVzIGFkZHJlc3MgbXVzdCBiZSBmaWxs ZWQgYXMgYmVsb3cuCitzdGF0aWMgc3RydWN0IG1wdV9wbGF0Zm9ybV9kYXRhIGd5cm9fcGxhdGZv cm1fZGF0YSA9IHsKKwkuaW50X2NvbmZpZyAgPSAweDEwLAorCS5sZXZlbF9zaGlmdGVyID0gMCwK Kwkub3JpZW50YXRpb24gPSB7ICAtMSwgIDAsICAwLAorCQkJICAgMCwgIDEsICAwLAorCQkJICAg MCwgIDAsIC0xIH0sCisJLnNlY19zbGF2ZV90eXBlID0gU0VDT05EQVJZX1NMQVZFX1RZUEVfQ09N UEFTUywKKwkuc2VjX3NsYXZlX2lkICAgPSBDT01QQVNTX0lEX0FLODk3NSwKKwkuc2Vjb25kYXJ5 X2kyY19hZGRyID0gMHgwRQorfTsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmb3IgTVBVNjA1MAorc3RhdGljIHN0cnVjdCBpMmNf Ym9hcmRfaW5mbyBfX2luaXRkYXRhIHNpbmdsZV9jaGlwX2JvYXJkX2luZm9bXSA9IHsKKwl7CisJ CUkyQ19CT0FSRF9JTkZPKCJtcHU2MDUwIiwgMHg2OCksCisJCS5pcnEgPSAoSUhfR1BJT19CQVNF ICsgTVBVSVJRX0dQSU8pLAorCQkucGxhdGZvcm1fZGF0YSA9ICZneXJvX3BsYXRmb3JtX2RhdGEs CisJfSwKK307Citmb3IgTVBVOTE1MAorYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwNHBh bmRhLmMKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBzaW5nbGVfY2hp cF9ib2FyZF9pbmZvW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygibXB1OTE1MCIsIDB4Njgp LAorCQkuaXJxID0gKElIX0dQSU9fQkFTRSArIE1QVUlSUV9HUElPKSwKKwkJLnBsYXRmb3JtX2Rh dGEgPSAmZ3lyb19wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCitJbiB0aGUgX2kyY19pbml0IGZ1 bmN0aW9uLCB0aGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXI6 CisKK2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDRwYW5kYS5jCisgICAgaW4gc3RhdGlj IGludCBfX2luaXQgb21hcDRfcGFuZGFfaTJjX2luaXQodm9pZCkKK29tYXBfcmVnaXN0ZXJfaTJj X2J1cyg0LCA0MDAsIHNpbmdsZV9jaGlwX2JvYXJkX2luZm8sIEFSUkFZX1NJWkUoc2luZ2xlX2No aXBfYm9hcmRfaW5mbykpOworCitJSU8gc3Vic3lzdGVtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWNjZXNzZnVsIGluc3RhbGxhdGlvbiB3aWxsIGNy ZWF0ZSB0d28gZGlyZWN0b3JpZXMgdW5kZXIgL3N5cy9idXMvaWlvL2RldmljZXMKK2lpbzpkZXZp Y2UwCit0cmlnZ2VyMAorVW5kZXIgL2Rldi8gZGlyZXRvcnksIGEgZmlsZSAiaWlvOmRldmljZTAi IHdpbGwgYWxzbyBiZSBjcmVhdGVkKG9yIGlpbzpkZXZpY2VYLCBpZgoreW91IGhhdmUgbW9yZSB0 aGFuIG9uZSBpaW8gZGV2aWNlcykuCitDb21tdW5pY2F0aW5nIHdpdGggdGhlIGRyaXZlciBpbiB1 c2Vyc3BhY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVXBv biBpbnN0YWxsYXRpb24sIHRoZSBkcml2ZXIgZ2VuZXJhdGVzIHNldmVyYWwgZmlsZXMgaW4gc3lz ZnMuIElmIHlvdXIKK3BsYXRmb3JtIGlzIGNvbmZpZ3VyZWQgYXMgZGV0YWlsZWQgYWJvdmUsIG5h dmlnYXRlIHRvIHRoZSBmb2xsb3dpbmcgcGF0aCB0bworZmluZCB0aGVzZSBmaWxlczoKKy9zeXMv YnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2UwCisKK1RoZSBsaXN0IGJlbG93IHByb3ZpZGVzIGEg YnJpZWYgZGVzY3JpcHRpb24gZm9yIGVhY2ggZmlsZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCitGb3IgTVBVNjA1MDoKK3RlbXBlcmF0dXJlIChSZWFkLW9ubHkpCitS ZWFkIHRlbXBlcmF0dXJlIGRhdGEgZGlyZWN0bHkgZnJvbSB0aGUgdGVtcGVyYXR1cmUgcmVnaXN0 ZXIuCisKK3NhbXBsaW5nX2ZyZXF1ZW5jeSAoUmVhZC93cml0ZSkKK0NvbmZpZ3VyZSB0aGUgQURD IHNhbXBsaW5nIHJhdGUgYW5kIEZJRk8gb3V0cHV0IHJhdGUuCisKK3NhbXBsaW5nX2ZyZXF1ZW5j eV9hdmFpbGFibGUocmVhZC1vbmx5KQorc2hvdyBjb21tb25seSB1c2VkIGZyZXF1ZW5jeQorCitj bG9ja19zb3VyY2UgKFJlYWQtb25seSkKK0NoZWNrIHdoaWNoIGNsb2NrLXNvdXJjZSBpcyB1c2Vk IGJ5IHRoZSBjaGlwLgorCitwb3dlcl9zdGF0ZSAoUmVhZC93cml0ZSkKK3R1cm4gb24vb2ZmIHRo ZSBwb3dlciBzdXBwbHkKKworc2VsZl90ZXN0IChyZWFkLW9ubHkpCityZWFkIHRoaXMgZW50cnkg dHJpZ2dlciBzZWxmIHRlc3QuIFRoZSByZXR1cm4gdmFsdWUgaXMgRC4KK0QgaXMgdGhlIHN1Y2Nl c3MvZmFpbC4KK0ZvciBkaWZmZXJlbnQgY2hpcCwgdGhlIHJlc3VsdCBpcyBkaWZmZXJlbnQgZm9y IHN1Y2Nlc3MvZmFpbC4KKzEgbWVhbnMgc3VjY2VzcyAwIG1lYW5zIGZhaWwuIFRoZSBMU0Igb2Yg RCBpcyBmb3IgZ3lybzsgdGhlIGJpdAorbmV4dCB0byBMU0Igb2YgRCBpcyBmb3IgYWNjZWwuIFRo ZSBiaXQgMiBvZiBEIGlzIGZvciBjb21wYXNzIHJlc3VsdC4KKwora2V5IChyZWFkLW9ubHkpCitz aG93IHRoZSBrZXkgdmFsdWUgb2YgdGhpcyBkcml2ZXIuIFVzZWQgYnkgTVBMLgorCitneXJvX21h dHJpeCAocmVhZC1vbmx5KQorc2hvdyB0aGUgb3JpZW50IG1hdHJpeCBvYnRhaW5lZCBmcm9tIGJv YXJkIGZpbGUuCisKK2d5cm9fZW5hYmxlIChyZWFkL3dyaXRlKQorZW5hYmxlL2Rpc2FibGUgZ3ly byBmdW5jdGlvbmFsaXR5LiBhZmZlY3QgcmF3X2d5cm8uIHR1cm4gb2ZmIHRoaXMgd2lsbAorc2h1 dCBkb3duIGd5cm8gYW5kIHNhdmUgcG93ZXIuCisKK2FjY2xfZW5hYmxlIChyZWFkL3dyaXRlKQor ZW5hYmxlL2Rpc2FibGUgYWNjZWxlcm9tZXRlciBmdW5jdGlvbmFsaXR5LiBhZmZlY3QgcmF3X2Fj Y2wuCit0dXJuIG9mZiB0aGlzIHdpbGwgc2h1dCBkb3duIGFjY2VsIGFuZCBzYXZlIHBvd2VyLgor CitmaXJtd2FyZV9sb2FkZWQgKHJlYWQvd3JpdGUpCitGbGFnIGluZGljYXRlIHRoZSB3aGV0aGVy IGZpcm13YXJlIGlzIGxvYWRlZCBvciBub3QgaW4gdGhlIERNUCBlbmdpbmUuCiswIG1lYW5zIG5v IGZpcm13YXJlIGxvYWRlZC4gMSBtZWFucyBmaXJtd2FyZSBpcyBhbHJlYWR5IGxvYWRlZCAuIFRo aXMKK2ZsYWcgY2FuIG9ubHkgYmUgd3JpdHRlbiBhcyAwLiAxIGlzIHVwZGF0ZWQgaW50ZXJuYWxs eS4KKworZG1wX29uKHJlYWQvd3JpdGUpCitUaGlzIGVudHJ5IGNvbnRyb2xzIHdoZXRoZXIgdG8g cnVuIERNUCBvciBub3QuIFRvIGVuYWJsZSBETVAgLAorZmlybXdhcmVfbG9hZGVkIG11c3QgYmUg MS4gd3JpdGUgMSB0byBlbmFibGUgRE1QIGFuZCB3cml0ZSAwIHRvIGRpc2FibGUgZG1wLgorCitk bXBfaW5fb24ocmVhZC93cml0ZSkKK1RoaXMgZW50cnkgY29udHJvbHMgd2hldGhlciBkbXAgaW50 ZXJydXB0IGlzIG9uL29mZi4gZmlybXdhcmVfbG9hZGVkIG11c3QKK2JlIDEuIHNvbWV0aW1lcywg aXQgaXMgZGVzaXJhYmxlIHRoYXQgaW50ZXJydXB0IGlzIG9mZiB3aGlsZSBETVAgaXMgcnVubmlu Zy4KKworZG1wX2V2ZW50X2ludF9vbihyZWFkL3dyaXRlKQorVGhpcyBlbnRyeSBjb250cm9scyB3 aGV0aGVyIGRtcCBldmVudCBpbnRlcnJ1cHQgaXMgb24vb2ZmLiBTZXR0aW5nIHRoaXMgb24KK3dv dWxkIHR1cm4gb2ZmIHRoZSBkYXRhIGludGVycnVwdCBhbmQgdHVybiBvbiB0aGUgZXZlbnQgaW50 ZXJydXB0LiBObyBkYXRhCitpbnRlcnJ1cHQgd291bGQgYmUgZ2VuZXJhdGVkLiBPbmx5IHdoZW4g ZXZlbnQgaGFwcGVucywgZG9lcyBhbiBpbnRlcnJ1cHQKK2dlbmVyYXRlLiBUaGlzIGNhbiBiZSB1 c2VkIGluIHBvd2VyIHNhdmluZyBtb2RlIHdoZW4gc3lzdGVtIGlzIHdhaXRpbmcgZm9yCithIHNw ZWNpYWwgZXZlbnQgdG8gd2FrZSB1cC4KKworZG1wX2Zpcm13YXJlICh3cml0ZSBvbmx5IGJpbmFy eSBmaWxlKQorVGhpcyBpcyB0aGUgZW50cnkgdGhhdCBmaXJtd2FyZSBjb2RlIGlzIGxvYWRlZCBp bnRvLiBJZiB0aGUgYWN0aW9uIGlzIHN1Y2NlZnVsLAorZmlybXdhcmVfbG9hZGVkIHdpbGwgYmUg dXBkYXRlZCBhcyAxLiBJbiBvcmRlciB0byBsb2FkIG5ldyBmaXJtd2FyZSwKK2Zpcm13YXJlX2xv YWRlZCBmbGFnIHNob3VsZCBiZSBzZXQgMC4KKworbHBhX21vZGUocmVhZC13cml0ZSkKK0xvdyBw b3dlciAgYWNjZWxlcm9tZXRlciBtb2RlCitscGFfZnJlcShyZWFkLXdyaXRlKQorbG93IHBvd2Vy IGFjY2VsZXJvbXRlciBmcmVxdWVuY3kuCisKK2FjY2VsX21hdHJpeAorb3JpZW50IG1hdHJpeCBm b3IgYWNjZWwKKworZmxpY2tfbG93ZXIsCitmbGlja191cHBlciwKK2ZsaWNrX2NvdW50ZXIsCitm bGlja19tZXNzYWdlX29uLAorZmxpY2tfaW50X29uLAorZmxpY2tfYXhpcywKK0ZsaWNrIHJlbGF0 ZWQgZW50cnkKKworcGVkb21ldGVyX3RpbWUKK3BlZG9tZXRlcl9zdGVwcywKK1BlZG9tZXRlciBy ZWxhdGVkIGVudHJ5CisKK2V2ZW50X2ZsaWNrCitldmVudF90YXAKK2V2ZW50X29yaWVudGF0aW9u CitldmVudF9kaXNwbGF5X29yaWVudGF0aW9uCitldmVudCByZWxhdGVkIGVudHJ5LiBUaGVzZSBl bnRyeSBtdXN0IHVzZSBwb2xsIHRvIHJlYWQuCisKK3RhcF9vbgorY29udHJvbCB0YXAgZnVuY3Rp b24gb2YgRE1QCisKK2RtcF9pbnRfb24KK3R1cm4gb24vb2ZmIGRtcCBpbnRlcnJ1cHQuCisKK2Rt cF9vdXRwdXRfcmF0ZQorY29udHJvbCBkbXAgb3V0cHV0IHJhdGUgd2hlbiBkbXAgaXMgb24uCisK K3RhcF90aW1lCit0YXBfbWluX2NvdW50Cit0YXBfdGhyZXNob2xkCit0YXAgcmVsYXRlZCBlbnRy aWVzLiBjb250cm9sIHZhcmlvdXMgcGFyYW1ldGVycyBvZiB0YXAgZnVuY3Rpb24uCisKK29yaWVu dGF0aW9uX29uCit0dXJuIG9uL29mZiBvcmllbnRhdGlvbiBmdW5jdGlvbiBvZiBETVAuCisKK2Rp c3BsYXlfb3JpZW50YXRpb25fb24KK3R1cm4gb24vb2ZmIGRpc3BsYXkgb3JpZW50YXRpb24gZnVu Y3Rpb24gb2YgRE1QLgorCitxdWF0ZXJuaW9uX29uCit0dXJuIG9uL29mZiBxdWF0ZXJuaWlvbiBk YXRhIG91dHB1dC4gbXVzdCB1c2UgRE1QLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZm9yIE1QVTkxNTAgYW5kIHNl Y29uZGFyeSBjb21wYXNzCitNUFU5MTUwIGhhcyBldmVyeSBlbnRyeSBNUFU2MDUwIGhhcy4gSXQg aGFzIGFkZGl0aW9uYWwgZW50cmllczoKKworY29tcGFzc19lbmFibGUgKHJlYWQvd3JpdGUpCitl bmFibGUgdGhpcyB3aWxsIGVuYWJsZSBjb21wYXNzIGZ1bmN0aW9uLgorCitjb21wYXNzX21hdHJp eCAocmVhZC1vbmx5KQorY29tcGFzcyBvcmllbnQgbWF0cml4CistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCitsb3cgcG93ZXIgYWNjZWxlcm9tZXRlciBtb2RlCitMb3dlciBwb3dlciBhY2NlbGVy b21ldGVyIG1vZGUgaXMgYSBzcGVjaWFsIG1vZGUuIEl0IHdvcmtzIG9ubHkgZm9yIGFjY2VsZXJv bWV0ZXIuCitJdCBoYXMgdHdvIGVudHJpZXMsIGxwYV9tb2RlIGFuZCBscGFfZnJlcS4gT25seSBN UFU2MDUwIGFuZCBNUFU5MTUwIGhhcyB0aGlzIG1vZGUuCitUbyBydW4gbG93IHBvd2VyIGFjY2Vs IG1vZGUsIHNldCBscGFfbW9kZSB0byAxLCBzZXQgbHBhX2ZyZXEgdG8gMH4zLCB3aGljaCBjb3Jy ZXNwb25kcwordG8gMS4yNUh6LCA1SHosIDIwSHosIDQwSHouICJneXJvX2VuYWJsZSIgYW5kICJj b21wYXNzX2VuYWJsZSIgbXVzdCBiZSB6ZXJvLiAiZG1wX29uIgorbXVzdCBiZSB6ZXJvLgorLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RtcCBldmVudC4KK2RtcCBldmVudCBpcyBldmVudCBv dXQgYnkgdGhlIERNUCB1bml0IGluc2lkZSBNUFUuIE9ubHkgTVBVNjA1MCBhbmQgTVBVOTE1MCBz dXBwb3J0cyB0aGlzLgorVGhlcmUgYXJlIGZvdXIgc3lzZnMgZW50cmVpcywgZXZlbnRfZmxpY2ss IGV2ZW50X3RhcCBhbmQgZXZlbnRfb3JpZW50YXRpb24gYW5kCitldmVudF9kaXNwbGF5X29yaWVu dGF0aW9uLiBUaGVzZSBmb3VyIGV2ZW50cyBtdXN0CitiZSBwb2xsZWQgYmVmb3JlIHJlYWQuIFRo ZSBwcm9wZXIgbWV0aG9kIHRvIHBvbGwgc3lzZnMgaXM6CisxLiBvcGVuIGZpbGUuCisyLiBkdW1t eSByZWFkLgorMy4gcG9sbC4KKzQuIG9uY2UgdGhlIHBvbGwgcGFzc2VkLCB1c2UgZm9wZW4gYW5k IGZyZWFkIHRvIHJlYWQgdGhlIHN5c2ZzIGVudHJ5LgorNS4gaW50ZXJwcmV0IHRoZSBkYXRhLgor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJZiBzdHJlYW1pbmcgdG8gYSB1c2Vyc3BhY2UgYXBwbGlj YXRpb24sIHRoZSByZWNvbW1lbmRlZCB3YXkgdG8gYWNjZXNzIGd5cm8vYWNjZWwvY29tcGFzcwor ZGF0YSBpcyB2aWEgL2Rldi9paW86ZGV2aWNlMC4gRm9sbG93IHRoZXNlIHN0ZXBzIHRvIGdldCBj b25zdGFudCByZWFkaW5ncyBmcm9tCit0aGUgZHJpdmVyOgorCisxLiBXcml0ZSBhIDEgdG8gcG93 ZXJfc3RhdGUgdG8gdHVybiBvbiB0aGUgY2hpcC4gVGhpcyBpcyB0aGUgZGVmYXVsdCBzZXR0aW5n CisgICBhZnRlciBpbnN0YWxsaW5nIHRoZSBkcml2ZXIuCisyLiBXcml0ZSB0aGUgZGVzaXJlZCBv dXRwdXQgcmF0ZSB0byBmaWZvX3JhdGUuCiszLiB3cml0ZSAxIHRvIGVuYWJsZSB0byB0dXJuIG9u IHRoZSBldmVudC4KKzQuIFJlYWQgL2Rldi9paW86ZGV2aWNlMCB0byBnZXQgYSBzdHJpbmcgb2Yg Z3lyby9hY2NlbC9jb21wYXNzIGRhdGEuCis1LiBQYXJzZSB0aGlzIHN0cmluZyB0byBvYnRhaW4g ZWFjaCBneXJvL2FjY2VsL2NvbXBhc3MgZWxlbWVudC4KKzYuIElmIGRtcCBmaXJtd2FyZSBjb2Rl IGlzIGxvYWRlZCwgdXNpbmcgImRtcF9vbiIgdG8gZW5hYmxlL2Rpc2FibGUgZG1wIC4KKzcuIElm IGNvbXBhc3MgaXMgZW5hYmxlZCwgb3V0cHV0IHdpbGwgaGF2ZSBjb21wYXNzIGRhdGEuCis9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgUmVjb21tZW5kZWQgc3lzZnMgZW50 cnkgc2V0dXAgc2VucXVlbmNlCisxLiB3aXRob3V0IERNUCBmaXJtd2FyZQorMS4xIHNldCAicG93 ZXJfc3RhdGUiIHRvIDEsCisxLjIgY2hhbmdlIHNjYWxlIGFuZCBmaWZvIHJhdGUgdmFsdWUgdG8g eW91ciBuZWVkLgorMS4zIGNoYW5nZSBneXJvX2VuYWJsZSBhbmQgYWNjbGVfZW5hYmxlIGFuZCBj b21wYXNzX2VuYWJsZSB0byB5b3VyIG5lZWRzLiBGb3IgZXhhbXBsZSwKK2lmIHlvdSB3YW50IGd5 cm8gb25seSwgc2V0IGFjY2xfZW5hYmxlIHRvIDAgb3Igc2V0IGFjY2xfZW5hYmxlIHRvIHplcm8g YW5kIGNvbXBhc3NfZW5hYmxlIHRvIHplcm8uCitJZiB5b3Ugd2FudCBhY2NlbCBvbmx5LCBzZXQg Z3lyb19lbmFibGUgdG8gMCBvciBzZXQgZ3lyb19lbmFibGUgdG8gemVybyBhbmQgY29tcGFzc19l bmFibGUgdG8gemVyby4KK0lmIHlvdSB3YW50IGNvbXBhc3Mgb25seSwgZGlzYWJsZSBneXJvIGFu ZCBhY2NlbC4KKzEuNCBzZXQgImVuYWJsZSIgdG8gMS4geW91IHdpbGwgZ2V0IG91dHB1dCB5b3Ug d2FudC4KKworMi4gV2l0aCBETVAgZmlybXdhcmUKKzIuMSBzZXQgInBvd2VyX3N0YXRlIiB0byAx LAorMi4yIHdyaXRlICIwIiB0byBmaXJtd2FyZV9sb2FkZWQgaWYgaXQgaXMgbm90IHplcm8gYWxy ZWFkeS4KKzIuMyBsb2FkIGZpcm13YXJlIGludG8gImRtcF9maXJtd2FyZSIgYXMgYSB3aG9sZS4g RG9uJ3Qgc3BsaXQgdGhlIERNUCBmaXJtd2FyZSBpbWFnZS4KKzIuNCBtYWtlIHN1cmUgZmlybXdh cmVfbG9hZGVkIGlzIDEgYWZ0ZXIgbG9hZGluZy4KKzIuNSBtYWtlIG90aGVyIGNvbmZpZ3VyYXRp b25zIHNpbWlsYXIgdG8gdGhlIHNpdHVhdGlvbiBhcyB3aXRob3V0IERNUCBmaXJtd2FyZS4KKzIu NiBzZXQgZG1wX29uIHRvIDEuCisyLjcgc2V0ICJlbmFibGUiIHRvIDEuCis9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGUgZW5hYmxlIGZ1 bmN0aW9uIGlzIHVzaW5nIGVuYWJsZSBlbnRyeSB1bmRlciAiL3N5cy9idXMvaWlvL2RldmljZXMv aWlvOmRldmljZTAvYnVmZmVyIgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQordGVzdCBhcHBsaWNhdGlvbnM6CitUZXN0IGFwcGxpY2F0 aW9uIGlzIG1wdV9paW8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorVG8gcnVuIHdpdGggTVBVOTE1MC9NUFU2MDUwOgordXNpbmcgdGhlIGZvbGxvd2luZyBjb21t YW5kOgorZm9yIG9yaWVudGF0aW9uL3RhcC9mbGljay9kaXNwbGF5IG9yaWVudGF0aW9uIGV2ZW50 OgorbXB1X2lpbyAgLWMgMTAgLWwgMyAtcAorZm9yIG5vcm1hbCBkYXRhIHByaW50CittcHVfaWlv ICAtYyAxMCAtbCAzIC1yCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CitQbGVhc2UgdXNlIG1wdV9paW8uYyBhbmQgaWlvX3V0aWxzLmggYXMgdGhlIHNhbXBsZSBjb2Rl IGZvciB5b3VyIGRldmVsb3BtZW50LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9p bXUvbXB1NjA1MC9kbXBEZWZhdWx0TVBVNjA1MC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUv bXB1NjA1MC9kbXBEZWZhdWx0TVBVNjA1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAuLjU4MDM2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lt dS9tcHU2MDUwL2RtcERlZmF1bHRNUFU2MDUwLmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBD b3B5cmlnaHQgKEMpIDIwMTIgSW52ZW5zZW5zZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUg aXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAq IExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVk IHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBp biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAq IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisj aW5jbHVkZSAiZG1wS2V5LmgiCisjaW5jbHVkZSAiZG1wbWFwLmgiCisKKyNkZWZpbmUgQ0ZHXzI3 ICAgICAgICAgICAgICAgICAgKDI3NDUpCisjZGVmaW5lIENGR18yMCAgICAgICAgICAgICAgICAg ICgyMDc4KQorI2RlZmluZSBDRkdfMjMgICAgICAgICAgICAgICAgICAoMjc0OCkKKyNkZWZpbmUg Q0ZHX0ZJRk9fT05fRVZFTlQgICAgICAgKDI2OTQpCisjZGVmaW5lIENGR19PUklFTlRfSVJRXzEg ICAgICAgICgyNTMzKQorI2RlZmluZSBDR05PVElDRV9JTlRSICAgICAgICAgICAoMjYzNikKKyNk ZWZpbmUgWF9HUlRfWV9UTVAgICAgICAgICAgICAgKDEzMTgpCisjZGVmaW5lIENGR19EUl9JTlQg ICAgICAgICAgICAgICgxMDI5KQorI2RlZmluZSBDRkdfQVVUSCAgICAgICAgICAgICAgICAoMTAz NSkKKyNkZWZpbmUgRkNGR18xICAgICAgICAgICAgICAgICAgKDEwNjIpCisjZGVmaW5lIFNLSVBf WF9HUlRfWV9UTVAgICAgICAgICgxMzE5KQorI2RlZmluZSBTS0lQX0VORF9DT01QQVJFICAgICAg ICAoMTM5NSkKKyNkZWZpbmUgRkNGR18zICAgICAgICAgICAgICAgICAgKDExMTApCisjZGVmaW5l IEZDRkdfMiAgICAgICAgICAgICAgICAgICgxMDY2KQorI2RlZmluZSBFTkRfQ09NUEFSRV9ZX1hf VE1QMiAgICAoMTQxNSkKKyNkZWZpbmUgQ0ZHX0RJU1BMQVlfT1JJRU5UX0lOVCAgKDE3MDYpCisj ZGVmaW5lIEZDRkdfNyAgICAgICAgICAgICAgICAgICgxMDc2KQorI2RlZmluZSBGQ0ZHXzYgICAg ICAgICAgICAgICAgICAoMTEyOCkKKyNkZWZpbmUgTk9fT1JJRU5UX0lOVEVSUlVQVCAgICAgKDE3 MjUpCisjZGVmaW5lIENGR184ICAgICAgICAgICAgICAgICAgICgyNzIzKQorI2RlZmluZSBDRkdf MTUgICAgICAgICAgICAgICAgICAoMjczMSkKKyNkZWZpbmUgQ0ZHXzE2ICAgICAgICAgICAgICAg ICAgKDI3NDkpCisjZGVmaW5lIEVORF9DT01QQVJFX1lfWF9UTVAgICAgICgxMzY3KQorI2RlZmlu ZSBDRkdfNiAgICAgICAgICAgICAgICAgICAoMjc1NikKKyNkZWZpbmUgRU5EX09SSUVOVF8xICAg ICAgICAgICAgKDE3MDkpCisjZGVmaW5lIEVORF9DT01QQVJFX1lfWCAgICAgICAgICgxNDQ0KQor I2RlZmluZSBDRkdfTFBfUVVBVCAgICAgICAgICAgICAoMjcxNykKKyNkZWZpbmUgRU5EX09SSUVO VCAgICAgICAgICAgICAgKDE3MzgpCisjZGVmaW5lIENGR19GTElDS19JTiAgICAgICAgICAgICgy NTg5KQorI2RlZmluZSBDRkdfNyAgICAgICAgICAgICAgICAgICAoMTIyMSkKKyNkZWZpbmUgQ0ZH X01PVElPTl9CSUFTICAgICAgICAgKDEyMjQpCisjZGVmaW5lIFhfR1JUX1kgICAgICAgICAgICAg ICAgICgxMzY4KQorI2RlZmluZSBURU1QTEFCRUwgICAgICAgICAgICAgICAoMjE3OCkKKyNkZWZp bmUgTk9UX1RJTUVfTUlOVVNfMSAgICAgICAgKDE1MjgpCisjZGVmaW5lIEVORF9DT01QQVJFX1lf WF9UTVAzICAgICgxMzk0KQorI2RlZmluZSBYX0dSVF9ZX1RNUDIgICAgICAgICAgICAoMTMzOSkK KworI2RlZmluZSBEXzBfMjIgICAgICAgICAgICAgICAgICAoMjIrNTEyKQorI2RlZmluZSBEXzBf MjQgICAgICAgICAgICAgICAgICAoMjQrNTEyKQorCisjZGVmaW5lIERfMF8zNiAgICAgICAgICAg ICAgICAgICgzNikKKyNkZWZpbmUgRF8wXzUyICAgICAgICAgICAgICAgICAgKDUyKQorI2RlZmlu ZSBEXzBfOTYgICAgICAgICAgICAgICAgICAoOTYpCisjZGVmaW5lIERfMF8xMDQgICAgICAgICAg ICAgICAgICgxMDQpCisjZGVmaW5lIERfMF8xMDggICAgICAgICAgICAgICAgICgxMDgpCisjZGVm aW5lIERfMF8xNjMgICAgICAgICAgICAgICAgICgxNjMpCisjZGVmaW5lIERfMF8xODggICAgICAg ICAgICAgICAgICgxODgpCisjZGVmaW5lIERfMF8xOTIgICAgICAgICAgICAgICAgICgxOTIpCisj ZGVmaW5lIERfMF8yMjQgICAgICAgICAgICAgICAgICgyMjQpCisjZGVmaW5lIERfMF8yMjggICAg ICAgICAgICAgICAgICgyMjgpCisjZGVmaW5lIERfMF8yMzIgICAgICAgICAgICAgICAgICgyMzIp CisjZGVmaW5lIERfMF8yMzYgICAgICAgICAgICAgICAgICgyMzYpCisKKyNkZWZpbmUgRF8xXzIg ICAgICAgICAgICAgICAgICAgKDI1NiArIDIpCisjZGVmaW5lIERfMV80ICAgICAgICAgICAgICAg ICAgICgyNTYgKyA0KQorI2RlZmluZSBEXzFfOCAgICAgICAgICAgICAgICAgICAoMjU2ICsgOCkK KyNkZWZpbmUgRF8xXzEwICAgICAgICAgICAgICAgICAgKDI1NiArIDEwKQorI2RlZmluZSBEXzFf MjQgICAgICAgICAgICAgICAgICAoMjU2ICsgMjQpCisjZGVmaW5lIERfMV8yOCAgICAgICAgICAg ICAgICAgICgyNTYgKyAyOCkKKyNkZWZpbmUgRF8xXzM2ICAgICAgICAgICAgICAgICAgKDI1NiAr IDM2KQorI2RlZmluZSBEXzFfNDAgICAgICAgICAgICAgICAgICAoMjU2ICsgNDApCisjZGVmaW5l IERfMV80NCAgICAgICAgICAgICAgICAgICgyNTYgKyA0NCkKKyNkZWZpbmUgRF8xXzcyICAgICAg ICAgICAgICAgICAgKDI1NiArIDcyKQorI2RlZmluZSBEXzFfNzQgICAgICAgICAgICAgICAgICAo MjU2ICsgNzQpCisjZGVmaW5lIERfMV83OSAgICAgICAgICAgICAgICAgICgyNTYgKyA3OSkKKyNk ZWZpbmUgRF8xXzg4ICAgICAgICAgICAgICAgICAgKDI1NiArIDg4KQorI2RlZmluZSBEXzFfOTAg ICAgICAgICAgICAgICAgICAoMjU2ICsgOTApCisjZGVmaW5lIERfMV85MiAgICAgICAgICAgICAg ICAgICgyNTYgKyA5MikKKyNkZWZpbmUgRF8xXzk2ICAgICAgICAgICAgICAgICAgKDI1NiArIDk2 KQorI2RlZmluZSBEXzFfOTggICAgICAgICAgICAgICAgICAoMjU2ICsgOTgpCisjZGVmaW5lIERf MV8xMDYgICAgICAgICAgICAgICAgICgyNTYgKyAxMDYpCisjZGVmaW5lIERfMV8xMDggICAgICAg ICAgICAgICAgICgyNTYgKyAxMDgpCisjZGVmaW5lIERfMV8xMTIgICAgICAgICAgICAgICAgICgy NTYgKyAxMTIpCisjZGVmaW5lIERfMV8xMjggICAgICAgICAgICAgICAgICgyNTYgKyAxNDQpCisj ZGVmaW5lIERfMV8xNTIgICAgICAgICAgICAgICAgICgyNTYgKyAxMikKKyNkZWZpbmUgRF8xXzE2 MCAgICAgICAgICAgICAgICAgKDI1NiArIDE2MCkKKyNkZWZpbmUgRF8xXzE3NiAgICAgICAgICAg ICAgICAgKDI1NiArIDE3NikKKyNkZWZpbmUgRF8xXzE3OCAgICAgICAgICAgICAgICAgKDI1NiAr IDE3OCkKKyNkZWZpbmUgRF8xXzIxOCAgICAgICAgICAgICAgICAgKDI1NiArIDIxOCkKKyNkZWZp bmUgRF8xXzIzMiAgICAgICAgICAgICAgICAgKDI1NiArIDIzMikKKyNkZWZpbmUgRF8xXzIzNiAg ICAgICAgICAgICAgICAgKDI1NiArIDIzNikKKyNkZWZpbmUgRF8xXzI0MCAgICAgICAgICAgICAg ICAgKDI1NiArIDI0MCkKKyNkZWZpbmUgRF8xXzI0NCAgICAgICAgICAgICAgICAgKDI1NiArIDI0 NCkKKyNkZWZpbmUgRF8xXzI1MCAgICAgICAgICAgICAgICAgKDI1NiArIDI1MCkKKyNkZWZpbmUg RF8xXzI1MiAgICAgICAgICAgICAgICAgKDI1NiArIDI1MikKKyNkZWZpbmUgRF8yXzEyICAgICAg ICAgICAgICAgICAgKDUxMiArIDEyKQorI2RlZmluZSBEXzJfOTYgICAgICAgICAgICAgICAgICAo NTEyICsgOTYpCisjZGVmaW5lIERfMl8xMDggICAgICAgICAgICAgICAgICg1MTIgKyAxMDgpCisj ZGVmaW5lIERfMl8yMDggICAgICAgICAgICAgICAgICg1MTIgKyAyMDgpCisjZGVmaW5lIERfMl8y MjQgICAgICAgICAgICAgICAgICg1MTIgKyAyMjQpCisjZGVmaW5lIERfMl8yMzYgICAgICAgICAg ICAgICAgICg1MTIgKyAyMzYpCisjZGVmaW5lIERfMl8yNDQgICAgICAgICAgICAgICAgICg1MTIg KyAyNDQpCisjZGVmaW5lIERfMl8yNDggICAgICAgICAgICAgICAgICg1MTIgKyAyNDgpCisjZGVm aW5lIERfMl8yNTIgICAgICAgICAgICAgICAgICg1MTIgKyAyNTIpCisKKyNkZWZpbmUgQ1BBU1Nf QklBU19YICAgICAgICAgICAgKDM1ICogMTYgKyA0KQorI2RlZmluZSBDUEFTU19CSUFTX1kgICAg ICAgICAgICAoMzUgKiAxNiArIDgpCisjZGVmaW5lIENQQVNTX0JJQVNfWiAgICAgICAgICAgICgz NSAqIDE2ICsgMTIpCisjZGVmaW5lIENQQVNTX01UWF8wMCAgICAgICAgICAgICgzNiAqIDE2KQor I2RlZmluZSBDUEFTU19NVFhfMDEgICAgICAgICAgICAoMzYgKiAxNiArIDQpCisjZGVmaW5lIENQ QVNTX01UWF8wMiAgICAgICAgICAgICgzNiAqIDE2ICsgOCkKKyNkZWZpbmUgQ1BBU1NfTVRYXzEw ICAgICAgICAgICAgKDM2ICogMTYgKyAxMikKKyNkZWZpbmUgQ1BBU1NfTVRYXzExICAgICAgICAg ICAgKDM3ICogMTYpCisjZGVmaW5lIENQQVNTX01UWF8xMiAgICAgICAgICAgICgzNyAqIDE2ICsg NCkKKyNkZWZpbmUgQ1BBU1NfTVRYXzIwICAgICAgICAgICAgKDM3ICogMTYgKyA4KQorI2RlZmlu ZSBDUEFTU19NVFhfMjEgICAgICAgICAgICAoMzcgKiAxNiArIDEyKQorI2RlZmluZSBDUEFTU19N VFhfMjIgICAgICAgICAgICAoNDMgKiAxNiArIDEyKQorI2RlZmluZSBEX0FDVDAgICAgICAgICAg ICAgICAgICAoNDAgKiAxNikKKyNkZWZpbmUgRF9BQ1NYICAgICAgICAgICAgICAgICAgKDQwICog MTYgKyA0KQorI2RlZmluZSBEX0FDU1kgICAgICAgICAgICAgICAgICAoNDAgKiAxNiArIDgpCisj ZGVmaW5lIERfQUNTWiAgICAgICAgICAgICAgICAgICg0MCAqIDE2ICsgMTIpCisKKyNkZWZpbmUg RkxJQ0tfTVNHICAgICAgICAgICAgICAgKDQ1ICogMTYgKyA0KQorI2RlZmluZSBGTElDS19DT1VO VEVSICAgICAgICAgICAoNDUgKiAxNiArIDgpCisjZGVmaW5lIEZMSUNLX0xPV0VSICAgICAgICAg ICAgICg0NSAqIDE2ICsgMTIpCisjZGVmaW5lIEZMSUNLX1VQUEVSICAgICAgICAgICAgICg0NiAq IDE2ICsgMTIpCisKKyNkZWZpbmUgRF9BVVRIX09VVCAgICAgICAgICAgICAgICg5OTIpCisjZGVm aW5lIERfQVVUSF9JTiAgICAgICAgICAgICAgICAoOTk2KQorI2RlZmluZSBEX0FVVEhfQSAgICAg ICAgICAgICAgICAgKDEwMDApCisjZGVmaW5lIERfQVVUSF9CICAgICAgICAgICAgICAgICAoMTAw NCkKKworI2RlZmluZSBEX1BFRFNURF9CUF9CICAgICAgICAgICg3NjggKyAweDFDKQorI2RlZmlu ZSBEX1BFRFNURF9IUF9BICAgICAgICAgICg3NjggKyAweDc4KQorI2RlZmluZSBEX1BFRFNURF9I UF9CICAgICAgICAgICg3NjggKyAweDdDKQorI2RlZmluZSBEX1BFRFNURF9CUF9BNCAgICAgICAg ICg3NjggKyAweDQwKQorI2RlZmluZSBEX1BFRFNURF9CUF9BMyAgICAgICAgICg3NjggKyAweDQ0 KQorI2RlZmluZSBEX1BFRFNURF9CUF9BMiAgICAgICAgICg3NjggKyAweDQ4KQorI2RlZmluZSBE X1BFRFNURF9CUF9BMSAgICAgICAgICg3NjggKyAweDRDKQorI2RlZmluZSBEX1BFRFNURF9JTlRf VEhSU0ggICAgICg3NjggKyAweDY4KQorI2RlZmluZSBEX1BFRFNURF9DTElQICAgICAgICAgICg3 NjggKyAweDZDKQorI2RlZmluZSBEX1BFRFNURF9TQiAgICAgICAgICAgICg3NjggKyAweDI4KQor I2RlZmluZSBEX1BFRFNURF9TQl9USU1FICAgICAgICg3NjggKyAweDJDKQorI2RlZmluZSBEX1BF RFNURF9QRUFLVEhSU0ggICAgICg3NjggKyAweDk4KQorI2RlZmluZSBEX1BFRFNURF9USU1MICAg ICAgICAgICg3NjggKyAweDJBKQorI2RlZmluZSBEX1BFRFNURF9USU1IICAgICAgICAgICg3Njgg KyAweDJFKQorI2RlZmluZSBEX1BFRFNURF9QRUFLICAgICAgICAgICg3NjggKyAwWDk0KQorI2Rl ZmluZSBEX1BFRFNURF9TVEVQQ1RSICAgICAgICg3NjggKyAweDYwKQorI2RlZmluZSBEX1BFRFNU RF9USU1FQ1RSICAgICAgICg5NjQpCisjZGVmaW5lIERfUEVEU1REX0RFQ0kgICAgICAgICAgKDc2 OCArIDB4QTApCisKKyNkZWZpbmUgRF9IT1NUX05PX01PVCAgICAgICAgICAoOTc2KQorCitzdGF0 aWMgY29uc3Qgc3RydWN0IHRLZXlMYWJlbCBkbXBUQ29uZmlnW10gPSB7CisJe0tFWV9DRkdfMjcs ICAgICAgICAgICAgICAgICAgICBDRkdfMjd9LAorCXtLRVlfQ0ZHXzIwLCAgICAgICAgICAgICAg ICAgICAgQ0ZHXzIwfSwKKwl7S0VZX0NGR18yMywgICAgICAgICAgICAgICAgICAgIENGR18yM30s CisJe0tFWV9DRkdfRklGT19PTl9FVkVOVCwgICAgICAgICBDRkdfRklGT19PTl9FVkVOVH0sCisJ e0tFWV9DRkdfT1JJRU5UX0lSUV8xLCAgICAgICAgICBDRkdfT1JJRU5UX0lSUV8xfSwKKwl7S0VZ X0NHTk9USUNFX0lOVFIsICAgICAgICAgICAgIENHTk9USUNFX0lOVFJ9LAorCXtLRVlfWF9HUlRf WV9UTVAsICAgICAgICAgICAgICAgWF9HUlRfWV9UTVB9LAorCXtLRVlfQ0ZHX0RSX0lOVCwgICAg ICAgICAgICAgICAgQ0ZHX0RSX0lOVH0sCisJe0tFWV9DRkdfQVVUSCwgICAgICAgICAgICAgICAg ICBDRkdfQVVUSH0sCisJe0tFWV9GQ0ZHXzEsICAgICAgICAgICAgICAgICAgICBGQ0ZHXzF9LAor CXtLRVlfU0tJUF9YX0dSVF9ZX1RNUCwgICAgICAgICAgU0tJUF9YX0dSVF9ZX1RNUH0sCisJe0tF WV9TS0lQX0VORF9DT01QQVJFLCAgICAgICAgICBTS0lQX0VORF9DT01QQVJFfSwKKwl7S0VZX0ZD RkdfMywgICAgICAgICAgICAgICAgICAgIEZDRkdfM30sCisJe0tFWV9GQ0ZHXzIsICAgICAgICAg ICAgICAgICAgICBGQ0ZHXzJ9LAorCXtLRVlfRU5EX0NPTVBBUkVfWV9YX1RNUDIsICAgICAgRU5E X0NPTVBBUkVfWV9YX1RNUDJ9LAorCXtLRVlfQ0ZHX0RJU1BMQVlfT1JJRU5UX0lOVCwgICAgQ0ZH X0RJU1BMQVlfT1JJRU5UX0lOVH0sCisJe0tFWV9GQ0ZHXzcsICAgICAgICAgICAgICAgICAgICBG Q0ZHXzd9LAorCXtLRVlfRkNGR182LCAgICAgICAgICAgICAgICAgICAgRkNGR182fSwKKwl7S0VZ X05PX09SSUVOVF9JTlRFUlJVUFQsICAgICAgIE5PX09SSUVOVF9JTlRFUlJVUFR9LAorCXtLRVlf Q0ZHXzgsICAgICAgICAgICAgICAgICAgICAgQ0ZHXzh9LAorCXtLRVlfQ0ZHXzE1LCAgICAgICAg ICAgICAgICAgICAgQ0ZHXzE1fSwKKwl7S0VZX0NGR18xNiwgICAgICAgICAgICAgICAgICAgIENG R18xNn0sCisJe0tFWV9FTkRfQ09NUEFSRV9ZX1hfVE1QLCAgICAgICBFTkRfQ09NUEFSRV9ZX1hf VE1QfSwKKwl7S0VZX0NGR182LCAgICAgICAgICAgICAgICAgICAgIENGR182fSwKKwl7S0VZX0VO RF9PUklFTlRfMSwgICAgICAgICAgICAgIEVORF9PUklFTlRfMX0sCisJe0tFWV9FTkRfQ09NUEFS RV9ZX1gsICAgICAgICAgICBFTkRfQ09NUEFSRV9ZX1h9LAorCXtLRVlfQ0ZHX0xQX1FVQVQsICAg ICAgICAgICAgICAgQ0ZHX0xQX1FVQVR9LAorCXtLRVlfRU5EX09SSUVOVCwgICAgICAgICAgICAg ICAgRU5EX09SSUVOVH0sCisJe0tFWV9DRkdfRkxJQ0tfSU4sICAgICAgICAgICAgICBDRkdfRkxJ Q0tfSU59LAorCXtLRVlfQ0ZHXzcsICAgICAgICAgICAgICAgICAgICAgQ0ZHXzd9LAorCXtLRVlf Q0ZHX01PVElPTl9CSUFTLCAgICAgICAgICAgQ0ZHX01PVElPTl9CSUFTfSwKKwl7S0VZX1hfR1JU X1ksICAgICAgICAgICAgICAgICAgIFhfR1JUX1l9LAorCXtLRVlfVEVNUExBQkVMLCAgICAgICAg ICAgICAgICAgVEVNUExBQkVMfSwKKwl7S0VZX05PVF9USU1FX01JTlVTXzEsICAgICAgICAgIE5P VF9USU1FX01JTlVTXzF9LAorCXtLRVlfRU5EX0NPTVBBUkVfWV9YX1RNUDMsICAgICAgRU5EX0NP TVBBUkVfWV9YX1RNUDN9LAorCXtLRVlfWF9HUlRfWV9UTVAyLCAgICAgICAgICAgICAgWF9HUlRf WV9UTVAyfSwKKwl7S0VZX0RfMF8yMiwgICAgICAgICAgICAgICAgRF8wXzIyfSwKKwl7S0VZX0Rf MF85NiwgICAgICAgICAgICAgICAgRF8wXzk2fSwKKwl7S0VZX0RfMF8xMDQsICAgICAgICAgICAg ICAgRF8wXzEwNH0sCisJe0tFWV9EXzBfMTA4LCAgICAgICAgICAgICAgIERfMF8xMDh9LAorCXtL RVlfRF8xXzM2LCAgICAgICAgICAgICAgIERfMV8zNn0sCisJe0tFWV9EXzFfNDAsICAgICAgICAg ICAgICAgRF8xXzQwfSwKKwl7S0VZX0RfMV80NCwgICAgICAgICAgICAgICBEXzFfNDR9LAorCXtL RVlfRF8xXzcyLCAgICAgICAgICAgICAgIERfMV83Mn0sCisJe0tFWV9EXzFfNzQsICAgICAgICAg ICAgICAgRF8xXzc0fSwKKwl7S0VZX0RfMV83OSwgICAgICAgICAgICAgICBEXzFfNzl9LAorCXtL RVlfRF8xXzg4LCAgICAgICAgICAgICAgIERfMV84OH0sCisJe0tFWV9EXzFfOTAsICAgICAgICAg ICAgICAgRF8xXzkwfSwKKwl7S0VZX0RfMV85MiwgICAgICAgICAgICAgICBEXzFfOTJ9LAorCXtL RVlfRF8xXzE2MCwgICAgICAgICAgICAgICBEXzFfMTYwfSwKKwl7S0VZX0RfMV8xNzYsICAgICAg ICAgICAgICAgRF8xXzE3Nn0sCisJe0tFWV9EXzFfMjE4LCAgICAgICAgICAgICAgIERfMV8yMTh9 LAorCXtLRVlfRF8xXzIzMiwgICAgICAgICAgICAgICBEXzFfMjMyfSwKKwl7S0VZX0RfMV8yNTAs ICAgICAgICAgICAgICAgRF8xXzI1MH0sCisJe0tFWV9ETVBfVEFQV19NSU4sICAgICAgICAgIERN UF9UQVBXX01JTn0sCisJe0tFWV9ETVBfVEFQX1RIUl9YLCAgICAgICAgIERNUF9UQVBfVEhYfSwK Kwl7S0VZX0RNUF9UQVBfVEhSX1ksICAgICAgICAgRE1QX1RBUF9USFl9LAorCXtLRVlfRE1QX1RB UF9USFJfWiwgICAgICAgICBETVBfVEFQX1RIWn0sCisJe0tFWV9ETVBfU0hfVEhfWSwgICAgICAg ICAgIERNUF9TSF9USF9ZfSwKKwl7S0VZX0RNUF9TSF9USF9YLCAgICAgICAgICAgRE1QX1NIX1RI X1h9LAorCXtLRVlfRE1QX1NIX1RIX1osICAgICAgICAgICBETVBfU0hfVEhfWn0sCisJe0tFWV9E TVBfT1JJRU5ULCAgICAgICAgICAgIERNUF9PUklFTlR9LAorCXtLRVlfRF9BVVRIX09VVCwgICAg ICAgICAgICBEX0FVVEhfT1VUfSwKKwl7S0VZX0RfQVVUSF9JTiwgICAgICAgICAgICAgRF9BVVRI X0lOfSwKKwl7S0VZX0RfQVVUSF9BLCAgICAgICAgICAgICAgRF9BVVRIX0F9LAorCXtLRVlfRF9B VVRIX0IsICAgICAgICAgICAgICBEX0FVVEhfQn0sCisJe0tFWV9DUEFTU19CSUFTX1gsICAgICAg ICAgIENQQVNTX0JJQVNfWH0sCisJe0tFWV9DUEFTU19CSUFTX1ksICAgICAgICAgIENQQVNTX0JJ QVNfWX0sCisJe0tFWV9DUEFTU19CSUFTX1osICAgICAgICAgIENQQVNTX0JJQVNfWn0sCisJe0tF WV9DUEFTU19NVFhfMDAsICAgICAgICAgIENQQVNTX01UWF8wMH0sCisJe0tFWV9DUEFTU19NVFhf MDEsICAgICAgICAgIENQQVNTX01UWF8wMX0sCisJe0tFWV9DUEFTU19NVFhfMDIsICAgICAgICAg IENQQVNTX01UWF8wMn0sCisJe0tFWV9DUEFTU19NVFhfMTAsICAgICAgICAgIENQQVNTX01UWF8x MH0sCisJe0tFWV9DUEFTU19NVFhfMTEsICAgICAgICAgIENQQVNTX01UWF8xMX0sCisJe0tFWV9D UEFTU19NVFhfMTIsICAgICAgICAgIENQQVNTX01UWF8xMn0sCisJe0tFWV9DUEFTU19NVFhfMjAs ICAgICAgICAgIENQQVNTX01UWF8yMH0sCisJe0tFWV9DUEFTU19NVFhfMjEsICAgICAgICAgIENQ QVNTX01UWF8yMX0sCisJe0tFWV9DUEFTU19NVFhfMjIsICAgICAgICAgIENQQVNTX01UWF8yMn0s CisJe0tFWV9EX0FDVDAsICAgICAgICAgICAgICAgIERfQUNUMH0sCisJe0tFWV9EX0FDU1gsICAg ICAgICAgICAgICAgIERfQUNTWH0sCisJe0tFWV9EX0FDU1ksICAgICAgICAgICAgICAgIERfQUNT WX0sCisJe0tFWV9EX0FDU1osICAgICAgICAgICAgICAgIERfQUNTWn0sCisJe0tFWV9GTElDS19N U0csICAgICAgICAgICAgIEZMSUNLX01TR30sCisJe0tFWV9GTElDS19DT1VOVEVSLCAgICAgICAg IEZMSUNLX0NPVU5URVJ9LAorCXtLRVlfRkxJQ0tfTE9XRVIsICAgICAgICAgICBGTElDS19MT1dF Un0sCisJe0tFWV9GTElDS19VUFBFUiwgICAgICAgICAgIEZMSUNLX1VQUEVSfSwKKwl7S0VZX0Rf UEVEU1REX0JQX0IsIERfUEVEU1REX0JQX0J9LAorCXtLRVlfRF9QRURTVERfSFBfQSwgRF9QRURT VERfSFBfQX0sCisJe0tFWV9EX1BFRFNURF9IUF9CLCBEX1BFRFNURF9IUF9CfSwKKwl7S0VZX0Rf UEVEU1REX0JQX0E0LCBEX1BFRFNURF9CUF9BNH0sCisJe0tFWV9EX1BFRFNURF9CUF9BMywgRF9Q RURTVERfQlBfQTN9LAorCXtLRVlfRF9QRURTVERfQlBfQTIsIERfUEVEU1REX0JQX0EyfSwKKwl7 S0VZX0RfUEVEU1REX0JQX0ExLCBEX1BFRFNURF9CUF9BMX0sCisJe0tFWV9EX1BFRFNURF9JTlRf VEhSU0gsIERfUEVEU1REX0lOVF9USFJTSH0sCisJe0tFWV9EX1BFRFNURF9DTElQLCBEX1BFRFNU RF9DTElQfSwKKwl7S0VZX0RfUEVEU1REX1NCLCBEX1BFRFNURF9TQn0sCisJe0tFWV9EX1BFRFNU RF9TQl9USU1FLCBEX1BFRFNURF9TQl9USU1FfSwKKwl7S0VZX0RfUEVEU1REX1BFQUtUSFJTSCwg RF9QRURTVERfUEVBS1RIUlNIfSwKKwl7S0VZX0RfUEVEU1REX1RJTUwsICAgICAgRF9QRURTVERf VElNTH0sCisJe0tFWV9EX1BFRFNURF9USU1ILCAgICAgIERfUEVEU1REX1RJTUh9LAorCXtLRVlf RF9QRURTVERfUEVBSywgICAgICBEX1BFRFNURF9QRUFLfSwKKwl7S0VZX0RfUEVEU1REX1NURVBD VFIsICAgRF9QRURTVERfU1RFUENUUn0sCisJe0tFWV9EX1BFRFNURF9USU1FQ1RSLCAgRF9QRURT VERfVElNRUNUUn0sCisJe0tFWV9EX1BFRFNURF9ERUNJLCAgRF9QRURTVERfREVDSX0sCisJe0tF WV9EX0hPU1RfTk9fTU9ULCAgRF9IT1NUX05PX01PVH0KK307CisjZGVmaW5lIE5VTV9MT0NBTF9L RVlTIChzaXplb2YoZG1wVENvbmZpZykvc2l6ZW9mKGRtcFRDb25maWdbMF0pKQorCitzdGF0aWMg c3RydWN0IHRLZXlMYWJlbCBrZXlzW05VTV9LRVlTXTsKKwordW5zaWduZWQgc2hvcnQgaW52X2Rt cF9nZXRfYWRkcmVzcyh1bnNpZ25lZCBzaG9ydCBrZXkpCit7CisJc3RhdGljIGludCBpc1NvcnRl ZDsKKwlpZiAoIWlzU29ydGVkKSB7CisJCWludCBrazsKKwkJZm9yIChrayA9IDA7IGtrIDwgTlVN X0tFWVM7ICsra2spIHsKKwkJCWtleXNba2tdLmFkZHIgPSAweGZmZmY7CisJCQlrZXlzW2trXS5r ZXkgPSBrazsKKwkJfQorCQlmb3IgKGtrID0gMDsga2sgPCBOVU1fTE9DQUxfS0VZUzsgKytraykK KwkJCWtleXNbZG1wVENvbmZpZ1tra10ua2V5XS5hZGRyID0gZG1wVENvbmZpZ1tra10uYWRkcjsK KwkJaXNTb3J0ZWQgPSAxOworCX0KKwlpZiAoa2V5ID49IE5VTV9LRVlTKQorCQlyZXR1cm4gMHhm ZmZmOworCXJldHVybiBrZXlzW2tleV0uYWRkcjsKK30KKy8qKgorICogIEB9CisgKi8KZGlmZiAt LWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L21wdTYwNTAvZG1wS2V5LmggYi9kcml2ZXJz L3N0YWdpbmcvaWlvL2ltdS9tcHU2MDUwL2RtcEtleS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAuLmU4ZTE5NTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcv aWlvL2ltdS9tcHU2MDUwL2RtcEtleS5oCkBAIC0wLDAgKzEsNDk0IEBACisvKgorICogQ29weXJp Z2h0IChDKSAyMDEyIEludmVuc2Vuc2UsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxp Y2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNl bnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRl ciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhl IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJ VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2lmbmRl ZiBETVBLRVlfSF9fCisjZGVmaW5lIERNUEtFWV9IX18KKworI2RlZmluZSBLRVlfQ0ZHXzI1ICAg ICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIEtFWV9DRkdfMjQgICAgICAgICAgICAgICAgICAo S0VZX0NGR18yNSArIDEpCisjZGVmaW5lIEtFWV9DRkdfMjYgICAgICAgICAgICAgICAgICAoS0VZ X0NGR18yNCArIDEpCisjZGVmaW5lIEtFWV9DRkdfMjcgICAgICAgICAgICAgICAgICAoS0VZX0NG R18yNiArIDEpCisjZGVmaW5lIEtFWV9DRkdfMjEgICAgICAgICAgICAgICAgICAoS0VZX0NGR18y NyArIDEpCisjZGVmaW5lIEtFWV9DRkdfMjAgICAgICAgICAgICAgICAgICAoS0VZX0NGR18yMSAr IDEpCisjZGVmaW5lIEtFWV9DRkdfVEFQNCAgICAgICAgICAgICAgICAoS0VZX0NGR18yMCArIDEp CisjZGVmaW5lIEtFWV9DRkdfVEFQNSAgICAgICAgICAgICAgICAoS0VZX0NGR19UQVA0ICsgMSkK KyNkZWZpbmUgS0VZX0NGR19UQVA2ICAgICAgICAgICAgICAgIChLRVlfQ0ZHX1RBUDUgKyAxKQor I2RlZmluZSBLRVlfQ0ZHX1RBUDcgICAgICAgICAgICAgICAgKEtFWV9DRkdfVEFQNiArIDEpCisj ZGVmaW5lIEtFWV9DRkdfVEFQMCAgICAgICAgICAgICAgICAoS0VZX0NGR19UQVA3ICsgMSkKKyNk ZWZpbmUgS0VZX0NGR19UQVAxICAgICAgICAgICAgICAgIChLRVlfQ0ZHX1RBUDAgKyAxKQorI2Rl ZmluZSBLRVlfQ0ZHX1RBUDIgICAgICAgICAgICAgICAgKEtFWV9DRkdfVEFQMSArIDEpCisjZGVm aW5lIEtFWV9DRkdfVEFQMyAgICAgICAgICAgICAgICAoS0VZX0NGR19UQVAyICsgMSkKKyNkZWZp bmUgS0VZX0NGR19UQVBfUVVBTlRJWkUgICAgICAgIChLRVlfQ0ZHX1RBUDMgKyAxKQorI2RlZmlu ZSBLRVlfQ0ZHX1RBUF9KRVJLICAgICAgICAgICAgKEtFWV9DRkdfVEFQX1FVQU5USVpFICsgMSkK KyNkZWZpbmUgS0VZX0NGR19EUl9JTlQgICAgICAgICAgICAgIChLRVlfQ0ZHX1RBUF9KRVJLICsg MSkKKyNkZWZpbmUgS0VZX0NGR19BVVRIICAgICAgICAgICAgICAgIChLRVlfQ0ZHX0RSX0lOVCAr IDEpCisjZGVmaW5lIEtFWV9DRkdfVEFQX1NBVkVfQUNDQiAgICAgICAoS0VZX0NGR19BVVRIICsg MSkKKyNkZWZpbmUgS0VZX0NGR19UQVBfQ0xFQVJfU1RJQ0tZICAgIChLRVlfQ0ZHX1RBUF9TQVZF X0FDQ0IgKyAxKQorI2RlZmluZSBLRVlfQ0ZHX0ZJRk9fT05fRVZFTlQgICAgICAgKEtFWV9DRkdf VEFQX0NMRUFSX1NUSUNLWSArIDEpCisjZGVmaW5lIEtFWV9GQ0ZHX0FDQ0VMX0lOUFVUICAgICAg ICAoS0VZX0NGR19GSUZPX09OX0VWRU5UICsgMSkKKyNkZWZpbmUgS0VZX0ZDRkdfQUNDRUxfSU5J VCAgICAgICAgIChLRVlfRkNGR19BQ0NFTF9JTlBVVCArIDEpCisjZGVmaW5lIEtFWV9DRkdfMjMg ICAgICAgICAgICAgICAgICAoS0VZX0ZDRkdfQUNDRUxfSU5JVCArIDEpCisjZGVmaW5lIEtFWV9G Q0ZHXzEgICAgICAgICAgICAgICAgICAoS0VZX0NGR18yMyArIDEpCisjZGVmaW5lIEtFWV9GQ0ZH XzMgICAgICAgICAgICAgICAgICAoS0VZX0ZDRkdfMSArIDEpCisjZGVmaW5lIEtFWV9GQ0ZHXzIg ICAgICAgICAgICAgICAgICAoS0VZX0ZDRkdfMyArIDEpCisjZGVmaW5lIEtFWV9DRkdfM0QgICAg ICAgICAgICAgICAgICAoS0VZX0ZDRkdfMiArIDEpCisjZGVmaW5lIEtFWV9DRkdfM0IgICAgICAg ICAgICAgICAgICAoS0VZX0NGR18zRCArIDEpCisjZGVmaW5lIEtFWV9DRkdfM0MgICAgICAgICAg ICAgICAgICAoS0VZX0NGR18zQiArIDEpCisjZGVmaW5lIEtFWV9GQ0ZHXzUgICAgICAgICAgICAg ICAgICAoS0VZX0NGR18zQyArIDEpCisjZGVmaW5lIEtFWV9GQ0ZHXzQgICAgICAgICAgICAgICAg ICAoS0VZX0ZDRkdfNSArIDEpCisjZGVmaW5lIEtFWV9GQ0ZHXzcgICAgICAgICAgICAgICAgICAo S0VZX0ZDRkdfNCArIDEpCisjZGVmaW5lIEtFWV9GQ0ZHX0ZTQ0FMRSAgICAgICAgICAgICAoS0VZ X0ZDRkdfNyArIDEpCisjZGVmaW5lIEtFWV9GQ0ZHX0FaICAgICAgICAgICAgICAgICAoS0VZX0ZD RkdfRlNDQUxFICsgMSkKKyNkZWZpbmUgS0VZX0ZDRkdfNiAgICAgICAgICAgICAgICAgIChLRVlf RkNGR19BWiArIDEpCisjZGVmaW5lIEtFWV9GQ0ZHX0xTQjQgICAgICAgICAgICAgICAoS0VZX0ZD RkdfNiArIDEpCisjZGVmaW5lIEtFWV9DRkdfMTIgICAgICAgICAgICAgICAgICAoS0VZX0ZDRkdf TFNCNCArIDEpCisjZGVmaW5lIEtFWV9DRkdfMTQgICAgICAgICAgICAgICAgICAoS0VZX0NGR18x MiArIDEpCisjZGVmaW5lIEtFWV9DRkdfMTUgICAgICAgICAgICAgICAgICAoS0VZX0NGR18xNCAr IDEpCisjZGVmaW5lIEtFWV9DRkdfMTYgICAgICAgICAgICAgICAgICAoS0VZX0NGR18xNSArIDEp CisjZGVmaW5lIEtFWV9DRkdfMTggICAgICAgICAgICAgICAgICAoS0VZX0NGR18xNiArIDEpCisj ZGVmaW5lIEtFWV9DRkdfNiAgICAgICAgICAgICAgICAgICAoS0VZX0NGR18xOCArIDEpCisjZGVm aW5lIEtFWV9DRkdfNyAgICAgICAgICAgICAgICAgICAoS0VZX0NGR182ICsgMSkKKyNkZWZpbmUg S0VZX0NGR180ICAgICAgICAgICAgICAgICAgIChLRVlfQ0ZHXzcgKyAxKQorI2RlZmluZSBLRVlf Q0ZHXzUgICAgICAgICAgICAgICAgICAgKEtFWV9DRkdfNCArIDEpCisjZGVmaW5lIEtFWV9DRkdf MiAgICAgICAgICAgICAgICAgICAoS0VZX0NGR181ICsgMSkKKyNkZWZpbmUgS0VZX0NGR18zICAg ICAgICAgICAgICAgICAgIChLRVlfQ0ZHXzIgKyAxKQorI2RlZmluZSBLRVlfQ0ZHXzEgICAgICAg ICAgICAgICAgICAgKEtFWV9DRkdfMyArIDEpCisjZGVmaW5lIEtFWV9DRkdfRVhURVJOQUwgICAg ICAgICAgICAoS0VZX0NGR18xICsgMSkKKyNkZWZpbmUgS0VZX0NGR184ICAgICAgICAgICAgICAg ICAgIChLRVlfQ0ZHX0VYVEVSTkFMICsgMSkKKyNkZWZpbmUgS0VZX0NGR185ICAgICAgICAgICAg ICAgICAgIChLRVlfQ0ZHXzggKyAxKQorI2RlZmluZSBLRVlfQ0ZHX09SSUVOVF8zICAgICAgICAg ICAgKEtFWV9DRkdfOSArIDEpCisjZGVmaW5lIEtFWV9DRkdfT1JJRU5UXzIgICAgICAgICAgICAo S0VZX0NGR19PUklFTlRfMyArIDEpCisjZGVmaW5lIEtFWV9DRkdfT1JJRU5UXzEgICAgICAgICAg ICAoS0VZX0NGR19PUklFTlRfMiArIDEpCisjZGVmaW5lIEtFWV9DRkdfR1lST19TT1VSQ0UgICAg ICAgICAoS0VZX0NGR19PUklFTlRfMSArIDEpCisjZGVmaW5lIEtFWV9DRkdfT1JJRU5UX0lSUV8x ICAgICAgICAoS0VZX0NGR19HWVJPX1NPVVJDRSArIDEpCisjZGVmaW5lIEtFWV9DRkdfT1JJRU5U X0lSUV8yICAgICAgICAoS0VZX0NGR19PUklFTlRfSVJRXzEgKyAxKQorI2RlZmluZSBLRVlfQ0ZH X09SSUVOVF9JUlFfMyAgICAgICAgKEtFWV9DRkdfT1JJRU5UX0lSUV8yICsgMSkKKyNkZWZpbmUg S0VZX0ZDRkdfTUFHX1ZBTCAgICAgICAgICAgIChLRVlfQ0ZHX09SSUVOVF9JUlFfMyArIDEpCisj ZGVmaW5lIEtFWV9GQ0ZHX01BR19NT1YgICAgICAgICAgICAoS0VZX0ZDRkdfTUFHX1ZBTCArIDEp CisjZGVmaW5lIEtFWV9DRkdfTFBfUVVBVCAgICAgICAgICAgICAoS0VZX0ZDRkdfTUFHX01PViAr IDEpCisKKy8qIE1QVTYwNTAga2V5cyAqLworI2RlZmluZSBLRVlfQ0ZHX0FDQ0VMX0ZJTFRFUiAg ICAgICAgKEtFWV9DRkdfTFBfUVVBVCArIDEpCisjZGVmaW5lIEtFWV9DRkdfTU9USU9OX0JJQVMg ICAgICAgICAoS0VZX0NGR19BQ0NFTF9GSUxURVIgKyAxKQorI2RlZmluZSBLRVlfVEVNUExBQkVM ICAgICAgICAgICAgICAgKEtFWV9DRkdfTU9USU9OX0JJQVMgKyAxKQorCisjZGVmaW5lIEtFWV9E XzBfMjIgICAgICAgICAgICAgICAgICAoS0VZX1RFTVBMQUJFTCArIDEpCisjZGVmaW5lIEtFWV9E XzBfMjQgICAgICAgICAgICAgICAgICAoS0VZX0RfMF8yMiArIDEpCisjZGVmaW5lIEtFWV9EXzBf MzYgICAgICAgICAgICAgICAgICAoS0VZX0RfMF8yNCArIDEpCisjZGVmaW5lIEtFWV9EXzBfNTIg ICAgICAgICAgICAgICAgICAoS0VZX0RfMF8zNiArIDEpCisjZGVmaW5lIEtFWV9EXzBfOTYgICAg ICAgICAgICAgICAgICAoS0VZX0RfMF81MiArIDEpCisjZGVmaW5lIEtFWV9EXzBfMTA0ICAgICAg ICAgICAgICAgICAoS0VZX0RfMF85NiArIDEpCisjZGVmaW5lIEtFWV9EXzBfMTA4ICAgICAgICAg ICAgICAgICAoS0VZX0RfMF8xMDQgKyAxKQorI2RlZmluZSBLRVlfRF8wXzE2MyAgICAgICAgICAg ICAgICAgKEtFWV9EXzBfMTA4ICsgMSkKKyNkZWZpbmUgS0VZX0RfMF8xODggICAgICAgICAgICAg ICAgIChLRVlfRF8wXzE2MyArIDEpCisjZGVmaW5lIEtFWV9EXzBfMTkyICAgICAgICAgICAgICAg ICAoS0VZX0RfMF8xODggKyAxKQorI2RlZmluZSBLRVlfRF8wXzIyNCAgICAgICAgICAgICAgICAg KEtFWV9EXzBfMTkyICsgMSkKKyNkZWZpbmUgS0VZX0RfMF8yMjggICAgICAgICAgICAgICAgIChL RVlfRF8wXzIyNCArIDEpCisjZGVmaW5lIEtFWV9EXzBfMjMyICAgICAgICAgICAgICAgICAoS0VZ X0RfMF8yMjggKyAxKQorI2RlZmluZSBLRVlfRF8wXzIzNiAgICAgICAgICAgICAgICAgKEtFWV9E XzBfMjMyICsgMSkKKworI2RlZmluZSBLRVlfRE1QX1BSRVZQVEFUICAgICAgICAgICAgKEtFWV9E XzBfMjM2ICsgMSkKKyNkZWZpbmUgS0VZX0RfMV8yICAgICAgICAgICAgICAgICAgIChLRVlfRE1Q X1BSRVZQVEFUICsgMSkKKyNkZWZpbmUgS0VZX0RfMV80ICAgICAgICAgICAgICAgICAgIChLRVlf RF8xXzIgKyAxKQorI2RlZmluZSBLRVlfRF8xXzggICAgICAgICAgICAgICAgICAgKEtFWV9EXzFf NCArIDEpCisjZGVmaW5lIEtFWV9EXzFfMTAgICAgICAgICAgICAgICAgICAoS0VZX0RfMV84ICsg MSkKKyNkZWZpbmUgS0VZX0RfMV8yNCAgICAgICAgICAgICAgICAgIChLRVlfRF8xXzEwICsgMSkK KyNkZWZpbmUgS0VZX0RfMV8yOCAgICAgICAgICAgICAgICAgIChLRVlfRF8xXzI0ICsgMSkKKyNk ZWZpbmUgS0VZX0RfMV8zNiAgICAgICAgICAgICAgICAgIChLRVlfRF8xXzI4ICsgMSkKKyNkZWZp bmUgS0VZX0RfMV80MCAgICAgICAgICAgICAgICAgIChLRVlfRF8xXzM2ICsgMSkKKyNkZWZpbmUg S0VZX0RfMV80NCAgICAgICAgICAgICAgICAgIChLRVlfRF8xXzQwICsgMSkKKyNkZWZpbmUgS0VZ X0RfMV83MiAgICAgICAgICAgICAgICAgIChLRVlfRF8xXzQ0ICsgMSkKKyNkZWZpbmUgS0VZX0Rf MV83NCAgICAgICAgICAgICAgICAgIChLRVlfRF8xXzcyICsgMSkKKyNkZWZpbmUgS0VZX0RfMV83 OSAgICAgICAgICAgICAgICAgIChLRVlfRF8xXzc0ICsgMSkKKyNkZWZpbmUgS0VZX0RfMV84OCAg ICAgICAgICAgICAgICAgIChLRVlfRF8xXzc5ICsgMSkKKyNkZWZpbmUgS0VZX0RfMV85MCAgICAg ICAgICAgICAgICAgIChLRVlfRF8xXzg4ICsgMSkKKyNkZWZpbmUgS0VZX0RfMV85MiAgICAgICAg ICAgICAgICAgIChLRVlfRF8xXzkwICsgMSkKKyNkZWZpbmUgS0VZX0RfMV85NiAgICAgICAgICAg ICAgICAgIChLRVlfRF8xXzkyICsgMSkKKyNkZWZpbmUgS0VZX0RfMV85OCAgICAgICAgICAgICAg ICAgIChLRVlfRF8xXzk2ICsgMSkKKyNkZWZpbmUgS0VZX0RfMV8xMDAgICAgICAgICAgICAgICAg IChLRVlfRF8xXzk4ICsgMSkKKyNkZWZpbmUgS0VZX0RfMV8xMDYgICAgICAgICAgICAgICAgIChL RVlfRF8xXzEwMCArIDEpCisjZGVmaW5lIEtFWV9EXzFfMTA4ICAgICAgICAgICAgICAgICAoS0VZ X0RfMV8xMDYgKyAxKQorI2RlZmluZSBLRVlfRF8xXzExMiAgICAgICAgICAgICAgICAgKEtFWV9E XzFfMTA4ICsgMSkKKyNkZWZpbmUgS0VZX0RfMV8xMjggICAgICAgICAgICAgICAgIChLRVlfRF8x XzExMiArIDEpCisjZGVmaW5lIEtFWV9EXzFfMTUyICAgICAgICAgICAgICAgICAoS0VZX0RfMV8x MjggKyAxKQorI2RlZmluZSBLRVlfRF8xXzE2MCAgICAgICAgICAgICAgICAgKEtFWV9EXzFfMTUy ICsgMSkKKyNkZWZpbmUgS0VZX0RfMV8xNjggICAgICAgICAgICAgICAgIChLRVlfRF8xXzE2MCAr IDEpCisjZGVmaW5lIEtFWV9EXzFfMTc1ICAgICAgICAgICAgICAgICAoS0VZX0RfMV8xNjggKyAx KQorI2RlZmluZSBLRVlfRF8xXzE3NiAgICAgICAgICAgICAgICAgKEtFWV9EXzFfMTc1ICsgMSkK KyNkZWZpbmUgS0VZX0RfMV8xNzggICAgICAgICAgICAgICAgIChLRVlfRF8xXzE3NiArIDEpCisj ZGVmaW5lIEtFWV9EXzFfMTc5ICAgICAgICAgICAgICAgICAoS0VZX0RfMV8xNzggKyAxKQorI2Rl ZmluZSBLRVlfRF8xXzIxOCAgICAgICAgICAgICAgICAgKEtFWV9EXzFfMTc5ICsgMSkKKyNkZWZp bmUgS0VZX0RfMV8yMzIgICAgICAgICAgICAgICAgIChLRVlfRF8xXzIxOCArIDEpCisjZGVmaW5l IEtFWV9EXzFfMjM2ICAgICAgICAgICAgICAgICAoS0VZX0RfMV8yMzIgKyAxKQorI2RlZmluZSBL RVlfRF8xXzI0MCAgICAgICAgICAgICAgICAgKEtFWV9EXzFfMjM2ICsgMSkKKyNkZWZpbmUgS0VZ X0RfMV8yNDQgICAgICAgICAgICAgICAgIChLRVlfRF8xXzI0MCArIDEpCisjZGVmaW5lIEtFWV9E XzFfMjUwICAgICAgICAgICAgICAgICAoS0VZX0RfMV8yNDQgKyAxKQorI2RlZmluZSBLRVlfRF8x XzI1MiAgICAgICAgICAgICAgICAgKEtFWV9EXzFfMjUwICsgMSkKKyNkZWZpbmUgS0VZX0RfMl8x MiAgICAgICAgICAgICAgICAgIChLRVlfRF8xXzI1MiArIDEpCisjZGVmaW5lIEtFWV9EXzJfOTYg ICAgICAgICAgICAgICAgICAoS0VZX0RfMl8xMiArIDEpCisjZGVmaW5lIEtFWV9EXzJfMTA4ICAg ICAgICAgICAgICAgICAoS0VZX0RfMl85NiArIDEpCisjZGVmaW5lIEtFWV9EXzJfMjA4ICAgICAg ICAgICAgICAgICAoS0VZX0RfMl8xMDggKyAxKQorI2RlZmluZSBLRVlfRkxJQ0tfTVNHICAgICAg ICAgICAgICAgKEtFWV9EXzJfMjA4ICsgMSkKKyNkZWZpbmUgS0VZX0ZMSUNLX0NPVU5URVIgICAg ICAgICAgIChLRVlfRkxJQ0tfTVNHICsgMSkKKyNkZWZpbmUgS0VZX0ZMSUNLX0xPV0VSICAgICAg ICAgICAgIChLRVlfRkxJQ0tfQ09VTlRFUiArIDEpCisjZGVmaW5lIEtFWV9DRkdfRkxJQ0tfSU4g ICAgICAgICAgICAoS0VZX0ZMSUNLX0xPV0VSICsgMSkKKyNkZWZpbmUgS0VZX0ZMSUNLX1VQUEVS ICAgICAgICAgICAgIChLRVlfQ0ZHX0ZMSUNLX0lOICsgMSkKKyNkZWZpbmUgS0VZX0NHTk9USUNF X0lOVFIgICAgICAgICAgIChLRVlfRkxJQ0tfVVBQRVIgKyAxKQorI2RlZmluZSBLRVlfRF8yXzIy NCAgICAgICAgICAgICAgICAgKEtFWV9DR05PVElDRV9JTlRSICsgMSkKKyNkZWZpbmUgS0VZX0Rf Ml8yNDQgICAgICAgICAgICAgICAgIChLRVlfRF8yXzIyNCArIDEpCisjZGVmaW5lIEtFWV9EXzJf MjQ4ICAgICAgICAgICAgICAgICAoS0VZX0RfMl8yNDQgKyAxKQorI2RlZmluZSBLRVlfRF8yXzI1 MiAgICAgICAgICAgICAgICAgKEtFWV9EXzJfMjQ4ICsgMSkKKworI2RlZmluZSBLRVlfRF9HWVJP X0JJQVNfWCAgICAgICAgICAgICAgIChLRVlfRF8yXzI1MiArIDEpCisjZGVmaW5lIEtFWV9EX0dZ Uk9fQklBU19ZICAgICAgICAgICAgICAgKEtFWV9EX0dZUk9fQklBU19YICsgMSkKKyNkZWZpbmUg S0VZX0RfR1lST19CSUFTX1ogICAgICAgICAgICAgICAoS0VZX0RfR1lST19CSUFTX1kgKyAxKQor I2RlZmluZSBLRVlfRF9HWVJPX0VOQUJMRSAgICAgICAgICAgICAgIChLRVlfRF9HWVJPX0JJQVNf WiArIDEpCisjZGVmaW5lIEtFWV9EX0FDQ0VMX0VOQUJMRSAgICAgICAgICAgICAgKEtFWV9EX0dZ Uk9fRU5BQkxFICsgMSkKKyNkZWZpbmUgS0VZX0RfUVVBVF9FTkFCTEUgICAgICAgICAgICAgICAo S0VZX0RfQUNDRUxfRU5BQkxFICsgMSkKKyNkZWZpbmUgS0VZX0RfQ1JfVElNRV9HICAgICAgICAg ICAgICAgICAoS0VZX0RfUVVBVF9FTkFCTEUgKyAxKQorI2RlZmluZSBLRVlfRF9DUl9USU1FX0Eg ICAgICAgICAgICAgICAgIChLRVlfRF9DUl9USU1FX0cgKyAxKQorI2RlZmluZSBLRVlfRF9DUl9U SU1FX1EgICAgICAgICAgICAgICAgIChLRVlfRF9DUl9USU1FX0EgKyAxKQorI2RlZmluZSBLRVlf RF9DU19UQVggICAgICAgICAgICAgICAgICAgIChLRVlfRF9DUl9USU1FX1EgKyAxKQorI2RlZmlu ZSBLRVlfRF9DU19UQVkgICAgICAgICAgICAgICAgICAgIChLRVlfRF9DU19UQVggKyAxKQorI2Rl ZmluZSBLRVlfRF9DU19UQVogICAgICAgICAgICAgICAgICAgIChLRVlfRF9DU19UQVkgKyAxKQor CisjZGVmaW5lIEtFWV9EX0NTX1RHWCAgICAgICAgICAgICAgICAgICAgKEtFWV9EX0NTX1RBWiAr IDEpCisjZGVmaW5lIEtFWV9EX0NTX1RHWSAgICAgICAgICAgICAgICAgICAgKEtFWV9EX0NTX1RH WCArIDEpCisjZGVmaW5lIEtFWV9EX0NTX1RHWiAgICAgICAgICAgICAgICAgICAgKEtFWV9EX0NT X1RHWSArIDEpCisjZGVmaW5lIEtFWV9EX0NTX1RRMCAgICAgICAgICAgICAgICAgICAgKEtFWV9E X0NTX1RHWiArIDEpCisjZGVmaW5lIEtFWV9EX0NTX1RRMSAgICAgICAgICAgICAgICAgICAgKEtF WV9EX0NTX1RRMCArIDEpCisjZGVmaW5lIEtFWV9EX0NTX1RRMiAgICAgICAgICAgICAgICAgICAg KEtFWV9EX0NTX1RRMSArIDEpCisjZGVmaW5lIEtFWV9EX0NTX1RRMyAgICAgICAgICAgICAgICAg ICAgKEtFWV9EX0NTX1RRMiArIDEpCisKKy8qIENvbXBhc3Mga2V5cyAqLworI2RlZmluZSBLRVlf Q1BBU1NfQklBU19YICAgICAgICAgICAgKEtFWV9EX0NTX1RRMyArIDEpCisjZGVmaW5lIEtFWV9D UEFTU19CSUFTX1kgICAgICAgICAgICAoS0VZX0NQQVNTX0JJQVNfWCArIDEpCisjZGVmaW5lIEtF WV9DUEFTU19CSUFTX1ogICAgICAgICAgICAoS0VZX0NQQVNTX0JJQVNfWSArIDEpCisjZGVmaW5l IEtFWV9DUEFTU19NVFhfMDAgICAgICAgICAgICAoS0VZX0NQQVNTX0JJQVNfWiArIDEpCisjZGVm aW5lIEtFWV9DUEFTU19NVFhfMDEgICAgICAgICAgICAoS0VZX0NQQVNTX01UWF8wMCArIDEpCisj ZGVmaW5lIEtFWV9DUEFTU19NVFhfMDIgICAgICAgICAgICAoS0VZX0NQQVNTX01UWF8wMSArIDEp CisjZGVmaW5lIEtFWV9DUEFTU19NVFhfMTAgICAgICAgICAgICAoS0VZX0NQQVNTX01UWF8wMiAr IDEpCisjZGVmaW5lIEtFWV9DUEFTU19NVFhfMTEgICAgICAgICAgICAoS0VZX0NQQVNTX01UWF8x MCArIDEpCisjZGVmaW5lIEtFWV9DUEFTU19NVFhfMTIgICAgICAgICAgICAoS0VZX0NQQVNTX01U WF8xMSArIDEpCisjZGVmaW5lIEtFWV9DUEFTU19NVFhfMjAgICAgICAgICAgICAoS0VZX0NQQVNT X01UWF8xMiArIDEpCisjZGVmaW5lIEtFWV9DUEFTU19NVFhfMjEgICAgICAgICAgICAoS0VZX0NQ QVNTX01UWF8yMCArIDEpCisjZGVmaW5lIEtFWV9DUEFTU19NVFhfMjIgICAgICAgICAgICAoS0VZ X0NQQVNTX01UWF8yMSArIDEpCisKKy8qIEdlc3R1cmUgS2V5cyAqLworI2RlZmluZSBLRVlfRE1Q X1RBUFdfTUlOICAgICAgICAgICAgKEtFWV9DUEFTU19NVFhfMjIgKyAxKQorI2RlZmluZSBLRVlf RE1QX1RBUF9USFJfWCAgICAgICAgICAgKEtFWV9ETVBfVEFQV19NSU4gKyAxKQorI2RlZmluZSBL RVlfRE1QX1RBUF9USFJfWSAgICAgICAgICAgKEtFWV9ETVBfVEFQX1RIUl9YICsgMSkKKyNkZWZp bmUgS0VZX0RNUF9UQVBfVEhSX1ogICAgICAgICAgIChLRVlfRE1QX1RBUF9USFJfWSArIDEpCisj ZGVmaW5lIEtFWV9ETVBfU0hfVEhfWSAgICAgICAgICAgICAoS0VZX0RNUF9UQVBfVEhSX1ogKyAx KQorI2RlZmluZSBLRVlfRE1QX1NIX1RIX1ggICAgICAgICAgICAgKEtFWV9ETVBfU0hfVEhfWSAr IDEpCisjZGVmaW5lIEtFWV9ETVBfU0hfVEhfWiAgICAgICAgICAgICAoS0VZX0RNUF9TSF9USF9Y ICsgMSkKKyNkZWZpbmUgS0VZX0RNUF9PUklFTlQgICAgICAgICAgICAgIChLRVlfRE1QX1NIX1RI X1ogKyAxKQorI2RlZmluZSBLRVlfRF9BQ1QwICAgICAgICAgICAgICAgICAgKEtFWV9ETVBfT1JJ RU5UICsgMSkKKyNkZWZpbmUgS0VZX0RfQUNTWCAgICAgICAgICAgICAgICAgIChLRVlfRF9BQ1Qw ICsgMSkKKyNkZWZpbmUgS0VZX0RfQUNTWSAgICAgICAgICAgICAgICAgIChLRVlfRF9BQ1NYICsg MSkKKyNkZWZpbmUgS0VZX0RfQUNTWiAgICAgICAgICAgICAgICAgIChLRVlfRF9BQ1NZICsgMSkK KworI2RlZmluZSBLRVlfWF9HUlRfWV9UTVAgICAgICAgICAgICAgKEtFWV9EX0FDU1ogKyAxKQor I2RlZmluZSBLRVlfU0tJUF9YX0dSVF9ZX1RNUCAgICAgICAgKEtFWV9YX0dSVF9ZX1RNUCArIDEp CisjZGVmaW5lIEtFWV9TS0lQX0VORF9DT01QQVJFICAgICAgICAoS0VZX1NLSVBfWF9HUlRfWV9U TVAgKyAxKQorI2RlZmluZSBLRVlfRU5EX0NPTVBBUkVfWV9YX1RNUDIgICAgKEtFWV9TS0lQX0VO RF9DT01QQVJFICsgMSkKKyNkZWZpbmUgS0VZX0NGR19ESVNQTEFZX09SSUVOVF9JTlQgIChLRVlf RU5EX0NPTVBBUkVfWV9YX1RNUDIgKyAxKQorI2RlZmluZSBLRVlfTk9fT1JJRU5UX0lOVEVSUlVQ VCAgICAgKEtFWV9DRkdfRElTUExBWV9PUklFTlRfSU5UICsgMSkKKyNkZWZpbmUgS0VZX0VORF9D T01QQVJFX1lfWF9UTVAgICAgIChLRVlfTk9fT1JJRU5UX0lOVEVSUlVQVCArIDEpCisjZGVmaW5l IEtFWV9FTkRfT1JJRU5UXzEgICAgICAgICAgICAoS0VZX0VORF9DT01QQVJFX1lfWF9UTVAgKyAx KQorI2RlZmluZSBLRVlfRU5EX0NPTVBBUkVfWV9YICAgICAgICAgKEtFWV9FTkRfT1JJRU5UXzEg KyAxKQorI2RlZmluZSBLRVlfRU5EX09SSUVOVCAgICAgICAgICAgICAgKEtFWV9FTkRfQ09NUEFS RV9ZX1ggKyAxKQorI2RlZmluZSBLRVlfWF9HUlRfWSAgICAgICAgICAgICAgICAgKEtFWV9FTkRf T1JJRU5UICsgMSkKKyNkZWZpbmUgS0VZX05PVF9USU1FX01JTlVTXzEgICAgICAgIChLRVlfWF9H UlRfWSArIDEpCisjZGVmaW5lIEtFWV9FTkRfQ09NUEFSRV9ZX1hfVE1QMyAgICAoS0VZX05PVF9U SU1FX01JTlVTXzEgKyAxKQorI2RlZmluZSBLRVlfWF9HUlRfWV9UTVAyICAgICAgICAgICAgKEtF WV9FTkRfQ09NUEFSRV9ZX1hfVE1QMyArIDEpCisKKy8qIEF1dGhlbnRpY2F0ZSBLZXlzICovCisj ZGVmaW5lIEtFWV9EX0FVVEhfT1VUICAgICAgICAgICAgICAoS0VZX1hfR1JUX1lfVE1QMiArIDEp CisjZGVmaW5lIEtFWV9EX0FVVEhfSU4gICAgICAgICAgICAgICAoS0VZX0RfQVVUSF9PVVQgKyAx KQorI2RlZmluZSBLRVlfRF9BVVRIX0EgICAgICAgICAgICAgICAgKEtFWV9EX0FVVEhfSU4gKyAx KQorI2RlZmluZSBLRVlfRF9BVVRIX0IgICAgICAgICAgICAgICAgKEtFWV9EX0FVVEhfQSArIDEp CisKKy8qIFBlZG9tZXRlciBzdGFuZGFsb25lIG9ubHkga2V5cyAqLworI2RlZmluZSBLRVlfRF9Q RURTVERfQlBfQiAgICAgICAgICAgKEtFWV9EX0FVVEhfQiArIDEpCisjZGVmaW5lIEtFWV9EX1BF RFNURF9IUF9BICAgICAgICAgICAoS0VZX0RfUEVEU1REX0JQX0IgKyAxKQorI2RlZmluZSBLRVlf RF9QRURTVERfSFBfQiAgICAgICAgICAgKEtFWV9EX1BFRFNURF9IUF9BICsgMSkKKyNkZWZpbmUg S0VZX0RfUEVEU1REX0JQX0E0ICAgICAgICAgIChLRVlfRF9QRURTVERfSFBfQiArIDEpCisjZGVm aW5lIEtFWV9EX1BFRFNURF9CUF9BMyAgICAgICAgICAoS0VZX0RfUEVEU1REX0JQX0E0ICsgMSkK KyNkZWZpbmUgS0VZX0RfUEVEU1REX0JQX0EyICAgICAgICAgIChLRVlfRF9QRURTVERfQlBfQTMg KyAxKQorI2RlZmluZSBLRVlfRF9QRURTVERfQlBfQTEgICAgICAgICAgKEtFWV9EX1BFRFNURF9C UF9BMiArIDEpCisjZGVmaW5lIEtFWV9EX1BFRFNURF9JTlRfVEhSU0ggICAgICAoS0VZX0RfUEVE U1REX0JQX0ExICsgMSkKKyNkZWZpbmUgS0VZX0RfUEVEU1REX0NMSVAgICAgICAgICAgIChLRVlf RF9QRURTVERfSU5UX1RIUlNIICsgMSkKKyNkZWZpbmUgS0VZX0RfUEVEU1REX1NCICAgICAgICAg ICAgIChLRVlfRF9QRURTVERfQ0xJUCArIDEpCisjZGVmaW5lIEtFWV9EX1BFRFNURF9TQl9USU1F ICAgICAgICAoS0VZX0RfUEVEU1REX1NCICsgMSkKKyNkZWZpbmUgS0VZX0RfUEVEU1REX1BFQUtU SFJTSCAgICAgIChLRVlfRF9QRURTVERfU0JfVElNRSArIDEpCisjZGVmaW5lIEtFWV9EX1BFRFNU RF9USU1MICAgICAgICAgICAoS0VZX0RfUEVEU1REX1BFQUtUSFJTSCArIDEpCisjZGVmaW5lIEtF WV9EX1BFRFNURF9USU1IICAgICAgICAgICAoS0VZX0RfUEVEU1REX1RJTUwgKyAxKQorI2RlZmlu ZSBLRVlfRF9QRURTVERfUEVBSyAgICAgICAgICAgKEtFWV9EX1BFRFNURF9USU1IICsgMSkKKyNk ZWZpbmUgS0VZX0RfUEVEU1REX1RJTUVDVFIgICAgICAgIChLRVlfRF9QRURTVERfUEVBSyArIDEp CisjZGVmaW5lIEtFWV9EX1BFRFNURF9TVEVQQ1RSICAgICAgICAoS0VZX0RfUEVEU1REX1RJTUVD VFIgKyAxKQorI2RlZmluZSBLRVlfRF9QRURTVERfV0FMS1RJTUUgICAgICAgKEtFWV9EX1BFRFNU RF9TVEVQQ1RSICsgMSkKKyNkZWZpbmUgS0VZX0RfUEVEU1REX0RFQ0kgICAgICAgICAgIChLRVlf RF9QRURTVERfV0FMS1RJTUUgKyAxKQorCisvKkhvc3QgQmFzZWQgTm8gTW90aW9uKi8KKyNkZWZp bmUgS0VZX0RfSE9TVF9OT19NT1QgICAgICAgICAgIChLRVlfRF9QRURTVERfREVDSSArIDEpCisK Ky8qIEVJUyBrZXlzICovCisjZGVmaW5lIEtFWV9QX0VJU19GSUZPX0ZPT1RFUiAgICAgICAoS0VZ X0RfSE9TVF9OT19NT1QgKyAxKQorI2RlZmluZSBLRVlfUF9FSVNfRklGT19ZU0hJRlQgICAgICAg KEtFWV9QX0VJU19GSUZPX0ZPT1RFUiArIDEpCisjZGVmaW5lIEtFWV9QX0VJU19EQVRBX1JBVEUg ICAgICAgICAoS0VZX1BfRUlTX0ZJRk9fWVNISUZUICsgMSkKKyNkZWZpbmUgS0VZX1BfRUlTX0ZJ Rk9fWFNISUZUICAgICAgIChLRVlfUF9FSVNfREFUQV9SQVRFICsgMSkKKyNkZWZpbmUgS0VZX1Bf RUlTX0ZJRk9fU1lOQyAgICAgICAgIChLRVlfUF9FSVNfRklGT19YU0hJRlQgKyAxKQorI2RlZmlu ZSBLRVlfUF9FSVNfRklGT19aU0hJRlQgICAgICAgKEtFWV9QX0VJU19GSUZPX1NZTkMgKyAxKQor I2RlZmluZSBLRVlfUF9FSVNfRklGT19SRUFEWSAgICAgICAgKEtFWV9QX0VJU19GSUZPX1pTSElG VCArIDEpCisjZGVmaW5lIEtFWV9ETVBfRk9PVEVSICAgICAgICAgICAgICAoS0VZX1BfRUlTX0ZJ Rk9fUkVBRFkgKyAxKQorI2RlZmluZSBLRVlfRE1QX0lOVFhfSEMgICAgICAgICAgICAgKEtFWV9E TVBfRk9PVEVSICsgMSkKKyNkZWZpbmUgS0VZX0RNUF9JTlRYX1BIICAgICAgICAgICAgIChLRVlf RE1QX0lOVFhfSEMgKyAxKQorI2RlZmluZSBLRVlfRE1QX0lOVFhfU0ggICAgICAgICAgICAgKEtF WV9ETVBfSU5UWF9QSCArIDEpCisjZGVmaW5lIEtFWV9ETVBfQUlOVl9TSCAgICAgICAgICAgICAo S0VZX0RNUF9JTlRYX1NIICsgMSkKKyNkZWZpbmUgS0VZX0RNUF9BX0lOVl9YSCAgICAgICAgICAg IChLRVlfRE1QX0FJTlZfU0ggKyAxKQorI2RlZmluZSBLRVlfRE1QX0FJTlZfUEggICAgICAgICAg ICAgKEtFWV9ETVBfQV9JTlZfWEggKyAxKQorI2RlZmluZSBLRVlfRE1QX0NUSFhfSCAgICAgICAg ICAgICAgKEtFWV9ETVBfQUlOVl9QSCArIDEpCisjZGVmaW5lIEtFWV9ETVBfQ1RIWV9IICAgICAg ICAgICAgICAoS0VZX0RNUF9DVEhYX0ggKyAxKQorI2RlZmluZSBLRVlfRE1QX0NUSFpfSCAgICAg ICAgICAgICAgKEtFWV9ETVBfQ1RIWV9IICsgMSkKKyNkZWZpbmUgS0VZX0RNUF9OQ1RIWF9IICAg ICAgICAgICAgIChLRVlfRE1QX0NUSFpfSCArIDEpCisjZGVmaW5lIEtFWV9ETVBfTkNUSFlfSCAg ICAgICAgICAgICAoS0VZX0RNUF9OQ1RIWF9IICsgMSkKKyNkZWZpbmUgS0VZX0RNUF9OQ1RIWl9I ICAgICAgICAgICAgIChLRVlfRE1QX05DVEhZX0ggKyAxKQorI2RlZmluZSBLRVlfRE1QX0NUU1Ff WEggICAgICAgICAgICAgKEtFWV9ETVBfTkNUSFpfSCArIDEpCisjZGVmaW5lIEtFWV9ETVBfQ1RT UV9ZSCAgICAgICAgICAgICAoS0VZX0RNUF9DVFNRX1hIICsgMSkKKyNkZWZpbmUgS0VZX0RNUF9D VFNRX1pIICAgICAgICAgICAgIChLRVlfRE1QX0NUU1FfWUggKyAxKQorI2RlZmluZSBLRVlfRE1Q X0lOVFhfSCAgICAgICAgICAgICAgKEtFWV9ETVBfQ1RTUV9aSCArIDEpCisjZGVmaW5lIEtFWV9E TVBfSU5UWV9IICAgICAgICAgICAgICAoS0VZX0RNUF9JTlRYX0ggKyAxKQorI2RlZmluZSBLRVlf RE1QX0lOVFpfSCAgICAgICAgICAgICAgKEtFWV9ETVBfSU5UWV9IICsgMSkKKyNkZWZpbmUgS0VZ X0RNUF9IUFhfSCAgICAgICAgICAgICAgIChLRVlfRE1QX0lOVFpfSCArIDEpCisjZGVmaW5lIEtF WV9ETVBfSFBZX0ggICAgICAgICAgICAgICAoS0VZX0RNUF9IUFhfSCArIDEpCisjZGVmaW5lIEtF WV9ETVBfSFBaX0ggICAgICAgICAgICAgICAoS0VZX0RNUF9IUFlfSCArIDEpCisKKy8qIFN0cmVh bSBrZXlzICovCisjZGVmaW5lIEtFWV9TVFJFQU1fUF9HWVJPX1ogICAgICAgICAoS0VZX0RNUF9I UFpfSCArIDEpCisjZGVmaW5lIEtFWV9TVFJFQU1fUF9HWVJPX1kgICAgICAgICAoS0VZX1NUUkVB TV9QX0dZUk9fWiArIDEpCisjZGVmaW5lIEtFWV9TVFJFQU1fUF9HWVJPX1ggICAgICAgICAoS0VZ X1NUUkVBTV9QX0dZUk9fWSArIDEpCisjZGVmaW5lIEtFWV9TVFJFQU1fUF9URU1QICAgICAgICAg ICAoS0VZX1NUUkVBTV9QX0dZUk9fWCArIDEpCisjZGVmaW5lIEtFWV9TVFJFQU1fUF9BVVhfWSAg ICAgICAgICAoS0VZX1NUUkVBTV9QX1RFTVAgKyAxKQorI2RlZmluZSBLRVlfU1RSRUFNX1BfQVVY X1ggICAgICAgICAgKEtFWV9TVFJFQU1fUF9BVVhfWSArIDEpCisjZGVmaW5lIEtFWV9TVFJFQU1f UF9BVVhfWiAgICAgICAgICAoS0VZX1NUUkVBTV9QX0FVWF9YICsgMSkKKyNkZWZpbmUgS0VZX1NU UkVBTV9QX0FDQ0VMX1kgICAgICAgIChLRVlfU1RSRUFNX1BfQVVYX1ogKyAxKQorI2RlZmluZSBL RVlfU1RSRUFNX1BfQUNDRUxfWCAgICAgICAgKEtFWV9TVFJFQU1fUF9BQ0NFTF9ZICsgMSkKKyNk ZWZpbmUgS0VZX1NUUkVBTV9QX0ZPT1RFUiAgICAgICAgIChLRVlfU1RSRUFNX1BfQUNDRUxfWCAr IDEpCisjZGVmaW5lIEtFWV9TVFJFQU1fUF9BQ0NFTF9aICAgICAgICAoS0VZX1NUUkVBTV9QX0ZP T1RFUiArIDEpCisKKyNkZWZpbmUgTlVNX0tFWVMgICAgICAgICAgICAgICAgICAgIChLRVlfU1RS RUFNX1BfQUNDRUxfWiArIDEpCisKK3N0cnVjdCB0S2V5TGFiZWwgIHsKKwl1bnNpZ25lZCBzaG9y dCBrZXk7CisJdW5zaWduZWQgc2hvcnQgYWRkcjsKK307CisKKyNkZWZpbmUgRElOQTBBIDB4MGEK KyNkZWZpbmUgRElOQTIyIDB4MjIKKyNkZWZpbmUgRElOQTQyIDB4NDIKKyNkZWZpbmUgRElOQTVB IDB4NWEKKworI2RlZmluZSBESU5BMDYgMHgwNgorI2RlZmluZSBESU5BMEUgMHgwZQorI2RlZmlu ZSBESU5BMTYgMHgxNgorI2RlZmluZSBESU5BMUUgMHgxZQorI2RlZmluZSBESU5BMjYgMHgyNgor I2RlZmluZSBESU5BMkUgMHgyZQorI2RlZmluZSBESU5BMzYgMHgzNgorI2RlZmluZSBESU5BM0Ug MHgzZQorI2RlZmluZSBESU5BNDYgMHg0NgorI2RlZmluZSBESU5BNEUgMHg0ZQorI2RlZmluZSBE SU5BNTYgMHg1NgorI2RlZmluZSBESU5BNUUgMHg1ZQorI2RlZmluZSBESU5BNjYgMHg2NgorI2Rl ZmluZSBESU5BNkUgMHg2ZQorI2RlZmluZSBESU5BNzYgMHg3NgorI2RlZmluZSBESU5BN0UgMHg3 ZQorCisjZGVmaW5lIERJTkEwMCAweDAwCisjZGVmaW5lIERJTkEwOCAweDA4CisjZGVmaW5lIERJ TkExMCAweDEwCisjZGVmaW5lIERJTkExOCAweDE4CisjZGVmaW5lIERJTkEyMCAweDIwCisjZGVm aW5lIERJTkEyOCAweDI4CisjZGVmaW5lIERJTkEzMCAweDMwCisjZGVmaW5lIERJTkEzOCAweDM4 CisjZGVmaW5lIERJTkE0MCAweDQwCisjZGVmaW5lIERJTkE0OCAweDQ4CisjZGVmaW5lIERJTkE1 MCAweDUwCisjZGVmaW5lIERJTkE1OCAweDU4CisjZGVmaW5lIERJTkE2MCAweDYwCisjZGVmaW5l IERJTkE2OCAweDY4CisjZGVmaW5lIERJTkE3MCAweDcwCisjZGVmaW5lIERJTkE3OCAweDc4CisK KyNkZWZpbmUgRElOQTA0IDB4MDQKKyNkZWZpbmUgRElOQTBDIDB4MGMKKyNkZWZpbmUgRElOQTE0 IDB4MTQKKyNkZWZpbmUgRElOQTFDIDB4MUMKKyNkZWZpbmUgRElOQTI0IDB4MjQKKyNkZWZpbmUg RElOQTJDIDB4MmMKKyNkZWZpbmUgRElOQTM0IDB4MzQKKyNkZWZpbmUgRElOQTNDIDB4M2MKKyNk ZWZpbmUgRElOQTQ0IDB4NDQKKyNkZWZpbmUgRElOQTRDIDB4NGMKKyNkZWZpbmUgRElOQTU0IDB4 NTQKKyNkZWZpbmUgRElOQTVDIDB4NWMKKyNkZWZpbmUgRElOQTY0IDB4NjQKKyNkZWZpbmUgRElO QTZDIDB4NmMKKyNkZWZpbmUgRElOQTc0IDB4NzQKKyNkZWZpbmUgRElOQTdDIDB4N2MKKworI2Rl ZmluZSBESU5BMDEgMHgwMQorI2RlZmluZSBESU5BMDkgMHgwOQorI2RlZmluZSBESU5BMTEgMHgx MQorI2RlZmluZSBESU5BMTkgMHgxOQorI2RlZmluZSBESU5BMjEgMHgyMQorI2RlZmluZSBESU5B MjkgMHgyOQorI2RlZmluZSBESU5BMzEgMHgzMQorI2RlZmluZSBESU5BMzkgMHgzOQorI2RlZmlu ZSBESU5BNDEgMHg0MQorI2RlZmluZSBESU5BNDkgMHg0OQorI2RlZmluZSBESU5BNTEgMHg1MQor I2RlZmluZSBESU5BNTkgMHg1OQorI2RlZmluZSBESU5BNjEgMHg2MQorI2RlZmluZSBESU5BNjkg MHg2OQorI2RlZmluZSBESU5BNzEgMHg3MQorI2RlZmluZSBESU5BNzkgMHg3OQorCisjZGVmaW5l IERJTkEyNSAweDI1CisjZGVmaW5lIERJTkEyRCAweDJkCisjZGVmaW5lIERJTkEzNSAweDM1Cisj ZGVmaW5lIERJTkEzRCAweDNkCisjZGVmaW5lIERJTkE0RCAweDRkCisjZGVmaW5lIERJTkE1NSAw eDU1CisjZGVmaW5lIERJTkE1RCAweDVECisjZGVmaW5lIERJTkE2RCAweDZkCisjZGVmaW5lIERJ TkE3NSAweDc1CisjZGVmaW5lIERJTkE3RCAweDdkCisKKyNkZWZpbmUgRElOQURDIDB4ZGMKKyNk ZWZpbmUgRElOQUYyIDB4ZjIKKyNkZWZpbmUgRElOQUFCIDB4YWIKKyNkZWZpbmUgRElOQUFBIDB4 YWEKKyNkZWZpbmUgRElOQUYxIDB4ZjEKKyNkZWZpbmUgRElOQURGIDB4ZGYKKyNkZWZpbmUgRElO QURBIDB4ZGEKKyNkZWZpbmUgRElOQUIxIDB4YjEKKyNkZWZpbmUgRElOQUI5IDB4YjkKKyNkZWZp bmUgRElOQUYzIDB4ZjMKKyNkZWZpbmUgRElOQThCIDB4OGIKKyNkZWZpbmUgRElOQUEzIDB4YTMK KyNkZWZpbmUgRElOQTkxIDB4OTEKKyNkZWZpbmUgRElOQUI2IDB4YjYKKyNkZWZpbmUgRElOQUI0 IDB4YjQKKworCisjZGVmaW5lIERJTkMwMCAweDAwCisjZGVmaW5lIERJTkMwMSAweDAxCisjZGVm aW5lIERJTkMwMiAweDAyCisjZGVmaW5lIERJTkMwMyAweDAzCisjZGVmaW5lIERJTkMwOCAweDA4 CisjZGVmaW5lIERJTkMwOSAweDA5CisjZGVmaW5lIERJTkMwQSAweDBhCisjZGVmaW5lIERJTkMw QiAweDBiCisjZGVmaW5lIERJTkMxMCAweDEwCisjZGVmaW5lIERJTkMxMSAweDExCisjZGVmaW5l IERJTkMxMiAweDEyCisjZGVmaW5lIERJTkMxMyAweDEzCisjZGVmaW5lIERJTkMxOCAweDE4Cisj ZGVmaW5lIERJTkMxOSAweDE5CisjZGVmaW5lIERJTkMxQSAweDFhCisjZGVmaW5lIERJTkMxQiAw eDFiCisKKyNkZWZpbmUgRElOQzIwIDB4MjAKKyNkZWZpbmUgRElOQzIxIDB4MjEKKyNkZWZpbmUg RElOQzIyIDB4MjIKKyNkZWZpbmUgRElOQzIzIDB4MjMKKyNkZWZpbmUgRElOQzI4IDB4MjgKKyNk ZWZpbmUgRElOQzI5IDB4MjkKKyNkZWZpbmUgRElOQzJBIDB4MmEKKyNkZWZpbmUgRElOQzJCIDB4 MmIKKyNkZWZpbmUgRElOQzMwIDB4MzAKKyNkZWZpbmUgRElOQzMxIDB4MzEKKyNkZWZpbmUgRElO QzMyIDB4MzIKKyNkZWZpbmUgRElOQzMzIDB4MzMKKyNkZWZpbmUgRElOQzM4IDB4MzgKKyNkZWZp bmUgRElOQzM5IDB4MzkKKyNkZWZpbmUgRElOQzNBIDB4M2EKKyNkZWZpbmUgRElOQzNCIDB4M2IK KworI2RlZmluZSBESU5DNDAgMHg0MAorI2RlZmluZSBESU5DNDEgMHg0MQorI2RlZmluZSBESU5D NDIgMHg0MgorI2RlZmluZSBESU5DNDMgMHg0MworI2RlZmluZSBESU5DNDggMHg0OAorI2RlZmlu ZSBESU5DNDkgMHg0OQorI2RlZmluZSBESU5DNEEgMHg0YQorI2RlZmluZSBESU5DNEIgMHg0Ygor I2RlZmluZSBESU5DNTAgMHg1MAorI2RlZmluZSBESU5DNTEgMHg1MQorI2RlZmluZSBESU5DNTIg MHg1MgorI2RlZmluZSBESU5DNTMgMHg1MworI2RlZmluZSBESU5DNTggMHg1OAorI2RlZmluZSBE SU5DNTkgMHg1OQorI2RlZmluZSBESU5DNUEgMHg1YQorI2RlZmluZSBESU5DNUIgMHg1YgorCisj ZGVmaW5lIERJTkM2MCAweDYwCisjZGVmaW5lIERJTkM2MSAweDYxCisjZGVmaW5lIERJTkM2MiAw eDYyCisjZGVmaW5lIERJTkM2MyAweDYzCisjZGVmaW5lIERJTkM2OCAweDY4CisjZGVmaW5lIERJ TkM2OSAweDY5CisjZGVmaW5lIERJTkM2QSAweDZhCisjZGVmaW5lIERJTkM2QiAweDZiCisjZGVm aW5lIERJTkM3MCAweDcwCisjZGVmaW5lIERJTkM3MSAweDcxCisjZGVmaW5lIERJTkM3MiAweDcy CisjZGVmaW5lIERJTkM3MyAweDczCisjZGVmaW5lIERJTkM3OCAweDc4CisjZGVmaW5lIERJTkM3 OSAweDc5CisjZGVmaW5lIERJTkM3QSAweDdhCisjZGVmaW5lIERJTkM3QiAweDdiCisjZGVmaW5l IERJTkQ0MCAweDQwCisjZGVmaW5lIERJTkE4MCAweDgwCisjZGVmaW5lIERJTkE5MCAweDkwCisj ZGVmaW5lIERJTkFBMCAweGEwCisjZGVmaW5lIERJTkFDOSAweGM5CisjZGVmaW5lIERJTkFDQiAw eGNiCisjZGVmaW5lIERJTkFDRCAweGNkCisjZGVmaW5lIERJTkFDRiAweGNmCisjZGVmaW5lIERJ TkFDOCAweGM4CisjZGVmaW5lIERJTkFDQSAweGNhCisjZGVmaW5lIERJTkFDQyAweGNjCisjZGVm aW5lIERJTkFDRSAweGNlCisjZGVmaW5lIERJTkFEOCAweGQ4CisjZGVmaW5lIERJTkFERCAweGRk CisjZGVmaW5lIERJTkFGOCAweGYwCisjZGVmaW5lIERJTkFGRSAweGZlCisKKyNkZWZpbmUgRElO QkY4IDB4ZjgKKyNkZWZpbmUgRElOQUMwIDB4YjAKKyNkZWZpbmUgRElOQUMxIDB4YjEKKyNkZWZp bmUgRElOQUMyIDB4YjQKKyNkZWZpbmUgRElOQUMzIDB4YjUKKyNkZWZpbmUgRElOQUM0IDB4YjgK KyNkZWZpbmUgRElOQUM1IDB4YjkKKyNkZWZpbmUgRElOQkMwIDB4YzAKKyNkZWZpbmUgRElOQkMy IDB4YzIKKyNkZWZpbmUgRElOQkM0IDB4YzQKKyNkZWZpbmUgRElOQkM2IDB4YzYKKworI2VuZGlm CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9tcHU2MDUwL2RtcG1hcC5oIGIv ZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvbXB1NjA1MC9kbXBtYXAuaApuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwLi40MjBlMTlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9z dGFnaW5nL2lpby9pbXUvbXB1NjA1MC9kbXBtYXAuaApAQCAtMCwwICsxLDI2NiBAQAorLyoKKyog Q29weXJpZ2h0IChDKSAyMDEyIEludmVuc2Vuc2UsIEluYy4KKyoKKyogVGhpcyBzb2Z0d2FyZSBp cyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiBM aWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb24sIGFuZAorKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVu ZGVyIHRob3NlIHRlcm1zLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhl IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZ IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKi8KKworI2lmbmRlZiBE TVBNQVBfSAorI2RlZmluZSBETVBNQVBfSAorCisjZGVmaW5lIERNUF9QVEFUICAgIDAKKyNkZWZp bmUgRE1QX1hHWVIgICAgMgorI2RlZmluZSBETVBfWUdZUiAgICA0CisjZGVmaW5lIERNUF9aR1lS ICAgIDYKKyNkZWZpbmUgRE1QX1hBQ0MgICAgOAorI2RlZmluZSBETVBfWUFDQyAgICAxMAorI2Rl ZmluZSBETVBfWkFDQyAgICAxMgorI2RlZmluZSBETVBfQURDMSAgICAxNAorI2RlZmluZSBETVBf QURDMiAgICAxNgorI2RlZmluZSBETVBfQURDMyAgICAxOAorI2RlZmluZSBETVBfQklBU1VOQyAg ICAyMAorI2RlZmluZSBETVBfRklGT1JUICAgIDIyCisjZGVmaW5lIERNUF9JTlZHU0ZIICAgIDI0 CisjZGVmaW5lIERNUF9JTlZHU0ZMICAgIDI2CisjZGVmaW5lIERNUF8xSCAgICAyOAorI2RlZmlu ZSBETVBfMUwgICAgMzAKKyNkZWZpbmUgRE1QX0JMUEZTVENIICAgIDMyCisjZGVmaW5lIERNUF9C TFBGU1RDTCAgICAzNAorI2RlZmluZSBETVBfQkxQRlNYSCAgICAzNgorI2RlZmluZSBETVBfQkxQ RlNYTCAgICAzOAorI2RlZmluZSBETVBfQkxQRlNZSCAgICA0MAorI2RlZmluZSBETVBfQkxQRlNZ TCAgICA0MgorI2RlZmluZSBETVBfQkxQRlNaSCAgICA0NAorI2RlZmluZSBETVBfQkxQRlNaTCAg ICA0NgorI2RlZmluZSBETVBfQkxQRk1UQyAgICA0OAorI2RlZmluZSBETVBfU01DICAgIDUwCisj ZGVmaW5lIERNUF9CTFBGTVhIICAgIDUyCisjZGVmaW5lIERNUF9CTFBGTVhMICAgIDU0CisjZGVm aW5lIERNUF9CTFBGTVlIICAgIDU2CisjZGVmaW5lIERNUF9CTFBGTVlMICAgIDU4CisjZGVmaW5l IERNUF9CTFBGTVpIICAgIDYwCisjZGVmaW5lIERNUF9CTFBGTVpMICAgIDYyCisjZGVmaW5lIERN UF9CTFBGQyAgICA2NAorI2RlZmluZSBETVBfU01DVEggICAgNjYKKyNkZWZpbmUgRE1QXzBIMiAg ICA2OAorI2RlZmluZSBETVBfMEwyICAgIDcwCisjZGVmaW5lIERNUF9CRVJSMkggICAgNzIKKyNk ZWZpbmUgRE1QX0JFUlIyTCAgICA3NAorI2RlZmluZSBETVBfQkVSUjJOSCAgICA3NgorI2RlZmlu ZSBETVBfU01DSU5DICAgIDc4CisjZGVmaW5lIERNUF9BTkdWQlhIICAgIDgwCisjZGVmaW5lIERN UF9BTkdWQlhMICAgIDgyCisjZGVmaW5lIERNUF9BTkdWQllIICAgIDg0CisjZGVmaW5lIERNUF9B TkdWQllMICAgIDg2CisjZGVmaW5lIERNUF9BTkdWQlpIICAgIDg4CisjZGVmaW5lIERNUF9BTkdW QlpMICAgIDkwCisjZGVmaW5lIERNUF9CRVJSMUggICAgOTIKKyNkZWZpbmUgRE1QX0JFUlIxTCAg ICA5NAorI2RlZmluZSBETVBfQVRDSCAgICA5NgorI2RlZmluZSBETVBfQklBU1VOQ1NGICAgIDk4 CisjZGVmaW5lIERNUF9BQ1QySCAgICAxMDAKKyNkZWZpbmUgRE1QX0FDVDJMICAgIDEwMgorI2Rl ZmluZSBETVBfR1NGSCAgICAxMDQKKyNkZWZpbmUgRE1QX0dTRkwgICAgMTA2CisjZGVmaW5lIERN UF9HSCAgICAxMDgKKyNkZWZpbmUgRE1QX0dMICAgIDExMAorI2RlZmluZSBETVBfMF81SCAgICAx MTIKKyNkZWZpbmUgRE1QXzBfNUwgICAgMTE0CisjZGVmaW5lIERNUF8wXzBIICAgIDExNgorI2Rl ZmluZSBETVBfMF8wTCAgICAxMTgKKyNkZWZpbmUgRE1QXzFfMEggICAgMTIwCisjZGVmaW5lIERN UF8xXzBMICAgIDEyMgorI2RlZmluZSBETVBfMV81SCAgICAxMjQKKyNkZWZpbmUgRE1QXzFfNUwg ICAgMTI2CisjZGVmaW5lIERNUF9UTVAxQUggICAgMTI4CisjZGVmaW5lIERNUF9UTVAxQUwgICAg MTMwCisjZGVmaW5lIERNUF9UTVAyQUggICAgMTMyCisjZGVmaW5lIERNUF9UTVAyQUwgICAgMTM0 CisjZGVmaW5lIERNUF9UTVAzQUggICAgMTM2CisjZGVmaW5lIERNUF9UTVAzQUwgICAgMTM4Cisj ZGVmaW5lIERNUF9UTVA0QUggICAgMTQwCisjZGVmaW5lIERNUF9UTVA0QUwgICAgMTQyCisjZGVm aW5lIERNUF9YQUNDVyAgICAxNDQKKyNkZWZpbmUgRE1QX1RNUDUgICAgMTQ2CisjZGVmaW5lIERN UF9YQUNDQiAgICAxNDgKKyNkZWZpbmUgRE1QX1RNUDggICAgMTUwCisjZGVmaW5lIERNUF9ZQUND QiAgICAxNTIKKyNkZWZpbmUgRE1QX1RNUDkgICAgMTU0CisjZGVmaW5lIERNUF9aQUNDQiAgICAx NTYKKyNkZWZpbmUgRE1QX1RNUDEwICAgIDE1OAorI2RlZmluZSBETVBfRFpIICAgIDE2MAorI2Rl ZmluZSBETVBfRFpMICAgIDE2MgorI2RlZmluZSBETVBfWEdDSCAgICAxNjQKKyNkZWZpbmUgRE1Q X1hHQ0wgICAgMTY2CisjZGVmaW5lIERNUF9ZR0NIICAgIDE2OAorI2RlZmluZSBETVBfWUdDTCAg ICAxNzAKKyNkZWZpbmUgRE1QX1pHQ0ggICAgMTcyCisjZGVmaW5lIERNUF9aR0NMICAgIDE3NAor I2RlZmluZSBETVBfWUFDQ1cgICAgMTc2CisjZGVmaW5lIERNUF9UTVA3ICAgIDE3OAorI2RlZmlu ZSBETVBfQUZCMUggICAgMTgwCisjZGVmaW5lIERNUF9BRkIxTCAgICAxODIKKyNkZWZpbmUgRE1Q X0FGQjJIICAgIDE4NAorI2RlZmluZSBETVBfQUZCMkwgICAgMTg2CisjZGVmaW5lIERNUF9NQUdG QkggICAgMTg4CisjZGVmaW5lIERNUF9NQUdGQkwgICAgMTkwCisjZGVmaW5lIERNUF9RVDFIICAg IDE5MgorI2RlZmluZSBETVBfUVQxTCAgICAxOTQKKyNkZWZpbmUgRE1QX1FUMkggICAgMTk2Cisj ZGVmaW5lIERNUF9RVDJMICAgIDE5OAorI2RlZmluZSBETVBfUVQzSCAgICAyMDAKKyNkZWZpbmUg RE1QX1FUM0wgICAgMjAyCisjZGVmaW5lIERNUF9RVDRIICAgIDIwNAorI2RlZmluZSBETVBfUVQ0 TCAgICAyMDYKKyNkZWZpbmUgRE1QX0NUUkwxSCAgICAyMDgKKyNkZWZpbmUgRE1QX0NUUkwxTCAg ICAyMTAKKyNkZWZpbmUgRE1QX0NUUkwySCAgICAyMTIKKyNkZWZpbmUgRE1QX0NUUkwyTCAgICAy MTQKKyNkZWZpbmUgRE1QX0NUUkwzSCAgICAyMTYKKyNkZWZpbmUgRE1QX0NUUkwzTCAgICAyMTgK KyNkZWZpbmUgRE1QX0NUUkw0SCAgICAyMjAKKyNkZWZpbmUgRE1QX0NUUkw0TCAgICAyMjIKKyNk ZWZpbmUgRE1QX0NUUkxTMSAgICAyMjQKKyNkZWZpbmUgRE1QX0NUUkxTRjEgICAgMjI2CisjZGVm aW5lIERNUF9DVFJMUzIgICAgMjI4CisjZGVmaW5lIERNUF9DVFJMU0YyICAgIDIzMAorI2RlZmlu ZSBETVBfQ1RSTFMzICAgIDIzMgorI2RlZmluZSBETVBfQ1RSTFNGTkxMICAgIDIzNAorI2RlZmlu ZSBETVBfQ1RSTFM0ICAgIDIzNgorI2RlZmluZSBETVBfQ1RSTFNGTkwyICAgIDIzOAorI2RlZmlu ZSBETVBfQ1RSTFNGTkwgICAgMjQwCisjZGVmaW5lIERNUF9UTVAzMCAgICAyNDIKKyNkZWZpbmUg RE1QX0NUUkxTRkpUICAgIDI0NAorI2RlZmluZSBETVBfVE1QMzEgICAgMjQ2CisjZGVmaW5lIERN UF9UTVAxMSAgICAyNDgKKyNkZWZpbmUgRE1QX0NUUkxTRjJfMiAgICAyNTAKKyNkZWZpbmUgRE1Q X1RNUDEyICAgIDI1MgorI2RlZmluZSBETVBfQ1RSTFNGMV8yICAgIDI1NAorI2RlZmluZSBETVBf UFJFVlBUQVQgICAgMjU2CisjZGVmaW5lIERNUF9BQ0NaQiAgICAyNTgKKyNkZWZpbmUgRE1QX0FD Q1hCICAgIDI2NAorI2RlZmluZSBETVBfQUNDWUIgICAgMjY2CisjZGVmaW5lIERNUF8xSEIgICAg MjcyCisjZGVmaW5lIERNUF8xTEIgICAgMjc0CisjZGVmaW5lIERNUF8wSCAgICAyNzYKKyNkZWZp bmUgRE1QXzBMICAgIDI3OAorI2RlZmluZSBETVBfQVNSMjJIICAgIDI4MAorI2RlZmluZSBETVBf QVNSMjJMICAgIDI4MgorI2RlZmluZSBETVBfQVNSNkggICAgMjg0CisjZGVmaW5lIERNUF9BU1I2 TCAgICAyODYKKyNkZWZpbmUgRE1QX1RNUDEzICAgIDI4OAorI2RlZmluZSBETVBfVE1QMTQgICAg MjkwCisjZGVmaW5lIERNUF9GSU5UWEggICAgMjkyCisjZGVmaW5lIERNUF9GSU5UWEwgICAgMjk0 CisjZGVmaW5lIERNUF9GSU5UWUggICAgMjk2CisjZGVmaW5lIERNUF9GSU5UWUwgICAgMjk4Cisj ZGVmaW5lIERNUF9GSU5UWkggICAgMzAwCisjZGVmaW5lIERNUF9GSU5UWkwgICAgMzAyCisjZGVm aW5lIERNUF9UTVAxQkggICAgMzA0CisjZGVmaW5lIERNUF9UTVAxQkwgICAgMzA2CisjZGVmaW5l IERNUF9UTVAyQkggICAgMzA4CisjZGVmaW5lIERNUF9UTVAyQkwgICAgMzEwCisjZGVmaW5lIERN UF9UTVAzQkggICAgMzEyCisjZGVmaW5lIERNUF9UTVAzQkwgICAgMzE0CisjZGVmaW5lIERNUF9U TVA0QkggICAgMzE2CisjZGVmaW5lIERNUF9UTVA0QkwgICAgMzE4CisjZGVmaW5lIERNUF9TVFhH ICAgIDMyMAorI2RlZmluZSBETVBfWkNUWEcgICAgMzIyCisjZGVmaW5lIERNUF9TVFlHICAgIDMy NAorI2RlZmluZSBETVBfWkNUWUcgICAgMzI2CisjZGVmaW5lIERNUF9TVFpHICAgIDMyOAorI2Rl ZmluZSBETVBfWkNUWkcgICAgMzMwCisjZGVmaW5lIERNUF9DVFJMU0ZKVDIgICAgMzMyCisjZGVm aW5lIERNUF9DVFJMU0ZKVENOVCAgICAzMzQKKyNkZWZpbmUgRE1QX1BWWEcgICAgMzM2CisjZGVm aW5lIERNUF9UTVAxNSAgICAzMzgKKyNkZWZpbmUgRE1QX1BWWUcgICAgMzQwCisjZGVmaW5lIERN UF9UTVAxNiAgICAzNDIKKyNkZWZpbmUgRE1QX1BWWkcgICAgMzQ0CisjZGVmaW5lIERNUF9UTVAx NyAgICAzNDYKKyNkZWZpbmUgRE1QX01OTUZMQUdIICAgIDM1MgorI2RlZmluZSBETVBfTU5NRkxB R0wgICAgMzU0CisjZGVmaW5lIERNUF9NTk1UTUggICAgMzU2CisjZGVmaW5lIERNUF9NTk1UTUwg ICAgMzU4CisjZGVmaW5lIERNUF9NTk1UTVRIUkggICAgMzYwCisjZGVmaW5lIERNUF9NTk1UTVRI UkwgICAgMzYyCisjZGVmaW5lIERNUF9NTk1USFJIICAgIDM2NAorI2RlZmluZSBETVBfTU5NVEhS TCAgICAzNjYKKyNkZWZpbmUgRE1QX0FDQ1FENEggICAgMzY4CisjZGVmaW5lIERNUF9BQ0NRRDRM ICAgIDM3MAorI2RlZmluZSBETVBfQUNDUUQ1SCAgICAzNzIKKyNkZWZpbmUgRE1QX0FDQ1FENUwg ICAgMzc0CisjZGVmaW5lIERNUF9BQ0NRRDZIICAgIDM3NgorI2RlZmluZSBETVBfQUNDUUQ2TCAg ICAzNzgKKyNkZWZpbmUgRE1QX0FDQ1FEN0ggICAgMzgwCisjZGVmaW5lIERNUF9BQ0NRRDdMICAg IDM4MgorI2RlZmluZSBETVBfQUNDUUQwSCAgICAzODQKKyNkZWZpbmUgRE1QX0FDQ1FEMEwgICAg Mzg2CisjZGVmaW5lIERNUF9BQ0NRRDFIICAgIDM4OAorI2RlZmluZSBETVBfQUNDUUQxTCAgICAz OTAKKyNkZWZpbmUgRE1QX0FDQ1FEMkggICAgMzkyCisjZGVmaW5lIERNUF9BQ0NRRDJMICAgIDM5 NAorI2RlZmluZSBETVBfQUNDUUQzSCAgICAzOTYKKyNkZWZpbmUgRE1QX0FDQ1FEM0wgICAgMzk4 CisjZGVmaW5lIERNUF9YTjJIICAgIDQwMAorI2RlZmluZSBETVBfWE4yTCAgICA0MDIKKyNkZWZp bmUgRE1QX1hOMUggICAgNDA0CisjZGVmaW5lIERNUF9YTjFMICAgIDQwNgorI2RlZmluZSBETVBf WU4ySCAgICA0MDgKKyNkZWZpbmUgRE1QX1lOMkwgICAgNDEwCisjZGVmaW5lIERNUF9ZTjFIICAg IDQxMgorI2RlZmluZSBETVBfWU4xTCAgICA0MTQKKyNkZWZpbmUgRE1QX1lIICAgIDQxNgorI2Rl ZmluZSBETVBfWUwgICAgNDE4CisjZGVmaW5lIERNUF9CMEggICAgNDIwCisjZGVmaW5lIERNUF9C MEwgICAgNDIyCisjZGVmaW5lIERNUF9BMUggICAgNDI0CisjZGVmaW5lIERNUF9BMUwgICAgNDI2 CisjZGVmaW5lIERNUF9BMkggICAgNDI4CisjZGVmaW5lIERNUF9BMkwgICAgNDMwCisjZGVmaW5l IERNUF9TRU0xICAgIDQzMgorI2RlZmluZSBETVBfRklGT0NOVCAgICA0MzQKKyNkZWZpbmUgRE1Q X1NIX1RIX1ggICAgNDM2CisjZGVmaW5lIERNUF9QQUNLRVQgICAgNDM4CisjZGVmaW5lIERNUF9T SF9USF9ZICAgIDQ0MAorI2RlZmluZSBETVBfRk9PVEVSICAgIDQ0MgorI2RlZmluZSBETVBfU0hf VEhfWiAgICA0NDQKKyNkZWZpbmUgRE1QX1RFTVAyOSAgICA0NDgKKyNkZWZpbmUgRE1QX1RFTVAz MCAgICA0NTAKKyNkZWZpbmUgRE1QX1hBQ0NCX1BSRSAgICA0NTIKKyNkZWZpbmUgRE1QX1hBQ0NC X1BSRUwgICAgNDU0CisjZGVmaW5lIERNUF9ZQUNDQl9QUkUgICAgNDU2CisjZGVmaW5lIERNUF9Z QUNDQl9QUkVMICAgIDQ1OAorI2RlZmluZSBETVBfWkFDQ0JfUFJFICAgIDQ2MAorI2RlZmluZSBE TVBfWkFDQ0JfUFJFTCAgICA0NjIKKyNkZWZpbmUgRE1QX1RNUDIyICAgIDQ2NAorI2RlZmluZSBE TVBfVEFQX1RJTUVSICAgIDQ2NgorI2RlZmluZSBETVBfVEFQX1RIWCAgICA0NjgKKyNkZWZpbmUg RE1QX1RBUF9USFkgICAgNDcyCisjZGVmaW5lIERNUF9UQVBfVEhaICAgIDQ3NgorI2RlZmluZSBE TVBfVEFQV19NSU4gICAgNDc4CisjZGVmaW5lIERNUF9UTVAyNSAgICA0ODAKKyNkZWZpbmUgRE1Q X1RNUDI2ICAgIDQ4MgorI2RlZmluZSBETVBfVE1QMjcgICAgNDg0CisjZGVmaW5lIERNUF9UTVAy OCAgICA0ODYKKyNkZWZpbmUgRE1QX09SSUVOVCAgICA0ODgKKyNkZWZpbmUgRE1QX1RIUlNIICAg IDQ5MAorI2RlZmluZSBETVBfRU5ESUFOSCAgICA0OTIKKyNkZWZpbmUgRE1QX0VORElBTkwgICAg NDk0CisjZGVmaW5lIERNUF9CTFBGTk1UQ0ggICAgNDk2CisjZGVmaW5lIERNUF9CTFBGTk1UQ0wg ICAgNDk4CisjZGVmaW5lIERNUF9CTFBGTk1YSCAgICA1MDAKKyNkZWZpbmUgRE1QX0JMUEZOTVhM ICAgIDUwMgorI2RlZmluZSBETVBfQkxQRk5NWUggICAgNTA0CisjZGVmaW5lIERNUF9CTFBGTk1Z TCAgICA1MDYKKyNkZWZpbmUgRE1QX0JMUEZOTVpIICAgIDUwOAorI2RlZmluZSBETVBfQkxQRk5N WkwgICAgNTEwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUv bXB1NjA1MC9pbnZfbXB1X2lpby5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvbXB1NjA1MC9p bnZfbXB1X2lpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NThkNGEK LS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9tcHU2MDUwL2ludl9t cHVfaWlvLmgKQEAgLTAsMCArMSw3MjcgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMiBJbnZl bnNlbnNlLCBJbmMuCisqCisqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1 Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyogbWF5IGJlIGNv cGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoKKyog VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1 c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs aWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y IG1vcmUgZGV0YWlscy4KKyoKKyovCisKKyNpZm5kZWYgX0lOVl9NUFVfSUlPX0hfCisjZGVmaW5l IF9JTlZfTVBVX0lJT19IXworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGlu dXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGlu dXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgIi4vbXB1 LmgiCisjaW5jbHVkZSAiLi4vLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vLi4vYnVmZmVyLmgiCisj aW5jbHVkZSAiZG1wS2V5LmgiCisvKioKKyAqICBzdHJ1Y3QgaW52X3JlZ19tYXBfcyAtIE5vdGFi bGUgc2xhdmUgcmVnaXN0ZXJzLgorICogIEBzYW1wbGVfcmF0ZV9kaXY6CURpdmlkZXIgYXBwbGll ZCB0byBneXJvIG91dHB1dCByYXRlLgorICogIEBscGY6CQlDb25maWd1cmVzIGludGVybmFsIExQ Ri4KKyAqICBAYmFua19zZWw6CQlTZWxlY3RzIGJldHdlZW4gbWVtb3J5IGJhbmtzLgorICogIEB1 c2VyX2N0cmw6CQlFbmFibGVzL3Jlc2V0cyB0aGUgRklGTy4KKyAqICBAZmlmb19lbjoJCURldGVy bWluZXMgd2hpY2ggZGF0YSB3aWxsIGFwcGVhciBpbiBGSUZPLgorICogIEBneXJvX2NvbmZpZzoJ Z3lybyBjb25maWcgcmVnaXN0ZXIuCisgKiAgQGFjY2xfY29uZmlnOglhY2NlbCBjb25maWcgcmVn aXN0ZXIKKyAqICBAZmlmb19jb3VudF9oOglVcHBlciBieXRlIG9mIEZJRk8gY291bnQuCisgKiAg QGZpZm9fcl93OgkJRklGTyByZWdpc3Rlci4KKyAqICBAcmF3X2d5cm8JCUFkZHJlc3Mgb2YgZmly c3QgZ3lybyByZWdpc3Rlci4KKyAqICBAcmF3X2FjY2wJCUFkZHJlc3Mgb2YgZmlyc3QgYWNjZWwg cmVnaXN0ZXIuCisgKiAgQHRlbXBlcmF0dXJlCXRlbXBlcmF0dXJlIHJlZ2lzdGVyCisgKiAgQGlu dF9lbmFibGU6CUludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIuCisgKiAgQGludF9zdGF0dXM6CUlu dGVycnVwdCBmbGFncy4KKyAqICBAcHdyX21nbXRfMToJQ29udHJvbHMgY2hpcCdzIHBvd2VyIHN0 YXRlIGFuZCBjbG9jayBzb3VyY2UuCisgKiAgQHB3cl9tZ210XzI6CUNvbnRyb2xzIHBvd2VyIHN0 YXRlIG9mIGluZGl2aWR1YWwgc2Vuc29ycy4KKyAqICBAbWVtX3N0YXJ0X2FkZHI6CUFkZHJlc3Mg b2YgZmlyc3QgbWVtb3J5IHJlYWQuCisgKiAgQG1lbV9yX3c6CQlBY2Nlc3MgdG8gbWVtb3J5Lgor ICogIEBwcmdtX3N0cnRfYWRkcmgJZmlybXdhcmUgcHJvZ3JhbSBzdGFydCBhZGRyZXNzIHJlZ2lz dGVyCisgKi8KK3N0cnVjdCBpbnZfcmVnX21hcF9zIHsKKwl1bnNpZ25lZCBjaGFyIHNhbXBsZV9y YXRlX2RpdjsKKwl1bnNpZ25lZCBjaGFyIGxwZjsKKwl1bnNpZ25lZCBjaGFyIGJhbmtfc2VsOwor CXVuc2lnbmVkIGNoYXIgdXNlcl9jdHJsOworCXVuc2lnbmVkIGNoYXIgZmlmb19lbjsKKwl1bnNp Z25lZCBjaGFyIGd5cm9fY29uZmlnOworCXVuc2lnbmVkIGNoYXIgYWNjbF9jb25maWc7CisJdW5z aWduZWQgY2hhciBmaWZvX2NvdW50X2g7CisJdW5zaWduZWQgY2hhciBmaWZvX3JfdzsKKwl1bnNp Z25lZCBjaGFyIHJhd19neXJvOworCXVuc2lnbmVkIGNoYXIgcmF3X2FjY2w7CisJdW5zaWduZWQg Y2hhciB0ZW1wZXJhdHVyZTsKKwl1bnNpZ25lZCBjaGFyIGludF9lbmFibGU7CisJdW5zaWduZWQg Y2hhciBpbnRfc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgcHdyX21nbXRfMTsKKwl1bnNpZ25lZCBj aGFyIHB3cl9tZ210XzI7CisJdW5zaWduZWQgY2hhciBtZW1fc3RhcnRfYWRkcjsKKwl1bnNpZ25l ZCBjaGFyIG1lbV9yX3c7CisJdW5zaWduZWQgY2hhciBwcmdtX3N0cnRfYWRkcmg7Cit9OworLypk ZXZpY2UgZW51bSAqLworZW51bSBpbnZfZGV2aWNlcyB7CisJSU5WX01QVTYwNTAsCisJSU5WX01Q VTkxNTAsCisJSU5WX05VTV9QQVJUUworfTsKKworLyoqCisgKiAgc3RydWN0IHRlc3Rfc2V0dXBf dCAtIHNldCB1cCBwYXJhbWV0ZXJzIGZvciBzZWxmIHRlc3QuCisgKiAgQGd5cm9fc2Vuczogc2Vu c2l0aXR5IGZvciBneXJvLgorICogIEBzYW1wbGVfcmF0ZTogc2FtcGxlIHJhdGUsIGkuZSwgZmlm byByYXRlLgorICogIEBscGY6CWxvdyBwYXNzIGZpbHRlci4KKyAqICBAZnNyOglmdWxsIHNjYWxl IHJhbmdlLgorICogIEBhY2NsX2ZzOglhY2NlbCBmdWxsIHNjYWxlIHJhbmdlLgorICogIEBhY2Ns X3NlbnM6CWFjY2VsIHNlbnNpdGl2aXR5CisgKi8KK3N0cnVjdCB0ZXN0X3NldHVwX3QgeworCWlu dCBneXJvX3NlbnM7CisJaW50IHNhbXBsZV9yYXRlOworCWludCBscGY7CisJaW50IGZzcjsKKwlp bnQgYWNjbF9mczsKKwl1bnNpZ25lZCBpbnQgYWNjbF9zZW5zWzNdOworfTsKKworLyoqCisgKiAg c3RydWN0IGludl9od19zIC0gT3RoZXIgaW1wb3J0YW50IGhhcmR3YXJlIGluZm9ybWF0aW9uLgor ICogIEBudW1fcmVnOglOdW1iZXIgb2YgcmVnaXN0ZXJzIG9uIGRldmljZS4KKyAqICBAbmFtZTog ICAgICBuYW1lIG9mIHRoZSBjaGlwCisgKi8KK3N0cnVjdCBpbnZfaHdfcyB7CisJdW5zaWduZWQg Y2hhciBudW1fcmVnOworCXVuc2lnbmVkIGNoYXIgKm5hbWU7Cit9OworCisvKioKKyAqICBzdHJ1 Y3QgaW52X2NoaXBfY29uZmlnX3MgLSBDYWNoZWQgY2hpcCBjb25maWd1cmF0aW9uIGRhdGEuCisg KiAgQGZzcjoJCUZ1bGwgc2NhbGUgcmFuZ2UuCisgKiAgQGxwZjoJCURpZ2l0YWwgbG93IHBhc3Mg ZmlsdGVyIGZyZXF1ZW5jeS4KKyAqICBAY2xrX3NyYzoJCUNsb2NrIHNvdXJjZS4KKyAqICBAYWNj bF9mczoJCWFjY2VsIGZ1bGwgc2NhbGUgcmFuZ2UuCisgKiAgQHNlbGZfdGVzdF9ydW5fb25jZSBm bGFnIGZvciBzZWxmIHRlc3QgcnVuIGV2ZXIuCisgKiAgQGhhc19jb21wYXNzOgloYXMgY29tcGFz cyBvciBub3QuCisgKiAgQGVuYWJsZToJCW1hc3RlciBlbmFibGUgdG8gZW5hYmxlIG91dHB1dAor ICogIEBhY2NsX2VuYWJsZToJZW5hYmxlIGFjY2VsIGZ1bmN0aW9uYWxpdHkKKyAqICBAYWNjbF9m aWZvX2VuYWJsZToJZW5hYmxlIGFjY2VsIGRhdGEgb3V0cHV0CisgKiAgQGd5cm9fZW5hYmxlOgll bmFibGUgZ3lybyBmdW5jdGlvbmFsaXR5CisgKiAgQGd5cm9fZmlmb19lbmFibGU6CWVuYWJsZSBn eXJvIGRhdGEgb3V0cHV0CisgKiAgQGNvbXBhc3NfZW5hYmxlOgllbmFibGUgY29tcGFzcworICog IEBjb21wYXNzX2ZpZm9fZW5hYmxlOiBlbmFibGUgY29tcGFzcyBkYXRhIG91dHB1dAorICogIEBp c19hc2xlZXA6CQkxIGlmIGNoaXAgaXMgcG93ZXJlZCBkb3duLgorICogIEBkbXBfb246CQlkbXAg aXMgb24vb2ZmLgorICogIEBkbXBfaW50X29uOiAgICAgICAgZG1wIGludGVycnVwdCBvbi9vZmYu CisgKiAgQGRtcF9ldmVudF9pbnRfb246ICBkbXAgZXZlbnQgaW50ZXJydXB0IG9uL29mZi4KKyAq ICBAb3JpZW50YXRpb25fb246CWRtcCBpcyBvbi9vZmYuCisgKiAgQGZpcm13YXJlX2xvYWRlZDoJ ZmxhZyBpbmRpY2F0ZSBmaXJtd2FyZSBsb2FkZWQgb3Igbm90LgorICogIEBscGFfbW9kOgkJbG93 IHBvd2VyIG1vZGUuCisgKiAgQHRhcF9vbjoJCXRhcCBvbi9vZmYuCisgKiAgQGZsaWNrX2ludF9v bjoJZmxpY2sgaW50ZXJydXB0IG9uL29mZi4KKyAqICBAcXVhdGVybmlvbl9vbjoJc2VuZCBxdWF0 ZXJuaW9uIGRhdGEgb24vb2ZmLgorICogIEBkaXNwbGF5X29yaWVudF9vbjoJZGlzcGxheSBvcmll bnRhdGlvbiBvbi9vZmYuCisgKiAgQGxwYV9mcmVxOgkJbG93IHBvd2VyIGZyZXF1ZW5jeQorICog IEBwcm9nX3N0YXJ0X2FkZHI6CWZpcm13YXJlIHByb2dyYW0gc3RhcnQgYWRkcmVzcy4KKyAqICBA ZG1wX291dHB1dF9yYXRlOiAgIGRtcCBvdXRwdXQgcmF0ZS4KKyAqICBAZmlmb19yYXRlOgkJRklG TyB1cGRhdGUgcmF0ZS4KKyAqLworc3RydWN0IGludl9jaGlwX2NvbmZpZ19zIHsKKwl1bnNpZ25l ZCBpbnQgZnNyOjI7CisJdW5zaWduZWQgaW50IGxwZjozOworCXVuc2lnbmVkIGludCBjbGtfc3Jj OjE7CisJdW5zaWduZWQgaW50IGFjY2xfZnM6MjsKKwl1bnNpZ25lZCBpbnQgc2VsZl90ZXN0X3J1 bl9vbmNlOjE7CisJdW5zaWduZWQgaW50IGhhc19jb21wYXNzOjE7CisJdW5zaWduZWQgaW50IGVu YWJsZToxOworCXVuc2lnbmVkIGludCBhY2NsX2VuYWJsZToxOworCXVuc2lnbmVkIGludCBhY2Ns X2ZpZm9fZW5hYmxlOjE7CisJdW5zaWduZWQgaW50IGd5cm9fZW5hYmxlOjE7CisJdW5zaWduZWQg aW50IGd5cm9fZmlmb19lbmFibGU6MTsKKwl1bnNpZ25lZCBpbnQgY29tcGFzc19lbmFibGU6MTsK Kwl1bnNpZ25lZCBpbnQgY29tcGFzc19maWZvX2VuYWJsZToxOworCXVuc2lnbmVkIGludCBpc19h c2xlZXA6MTsKKwl1bnNpZ25lZCBpbnQgZG1wX29uOjE7CisJdW5zaWduZWQgaW50IGRtcF9pbnRf b246MTsKKwl1bnNpZ25lZCBpbnQgZG1wX2V2ZW50X2ludF9vbjoxOworCXVuc2lnbmVkIGludCBv cmllbnRhdGlvbl9vbjoxOworCXVuc2lnbmVkIGludCBmaXJtd2FyZV9sb2FkZWQ6MTsKKwl1bnNp Z25lZCBpbnQgbHBhX21vZGU6MTsKKwl1bnNpZ25lZCBpbnQgdGFwX29uOjE7CisJdW5zaWduZWQg aW50IGZsaWNrX2ludF9vbjoxOworCXVuc2lnbmVkIGludCBxdWF0ZXJuaW9uX29uOjE7CisJdW5z aWduZWQgaW50IGRpc3BsYXlfb3JpZW50X29uOjE7CisJdW5zaWduZWQgc2hvcnQgbHBhX2ZyZXE7 CisJdW5zaWduZWQgc2hvcnQgIHByb2dfc3RhcnRfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCBmaWZv X3JhdGU7CisJdW5zaWduZWQgc2hvcnQgZG1wX291dHB1dF9yYXRlOworfTsKKworLyoqCisgKiAg c3RydWN0IGludl9jaGlwX2luZm9fcyAtIENoaXAgcmVsYXRlZCBpbmZvcm1hdGlvbi4KKyAqICBA cHJvZHVjdF9pZDoJUHJvZHVjdCBpZC4KKyAqICBAcHJvZHVjdF9yZXZpc2lvbjoJUHJvZHVjdCBy ZXZpc2lvbi4KKyAqICBAc2lsaWNvbl9yZXZpc2lvbjoJU2lsaWNvbiByZXZpc2lvbi4KKyAqICBA c29mdHdhcmVfcmV2aXNpb246CXNvZnR3YXJlIHJldmlzaW9uLgorICogIEBtdWx0aToJCWFjY2Vs IHNwZWNpZmljIG11bHRpcGxpZXIuCisgKiAgQGNvbXBhc3Nfc2VuczoJY29tcGFzcyBzZW5zaXRp dml0eS4KKyAqICBAZ3lyb19zZW5zX3RyaW06CUd5cm8gc2Vuc2l0aXZpdHkgdHJpbSBmYWN0b3Iu CisgKiAgQGFjY2xfc2Vuc190cmltOiAgICBhY2NlbCBzZW5zaXRpdml0eSB0cmltIGZhY3Rvci4K KyAqLworc3RydWN0IGludl9jaGlwX2luZm9fcyB7CisJdW5zaWduZWQgY2hhciBwcm9kdWN0X2lk OworCXVuc2lnbmVkIGNoYXIgcHJvZHVjdF9yZXZpc2lvbjsKKwl1bnNpZ25lZCBjaGFyIHNpbGlj b25fcmV2aXNpb247CisJdW5zaWduZWQgY2hhciBzb2Z0d2FyZV9yZXZpc2lvbjsKKwl1bnNpZ25l ZCBjaGFyIG11bHRpOworCXVuc2lnbmVkIGNoYXIgY29tcGFzc19zZW5zWzNdOworCXVuc2lnbmVk IGxvbmcgZ3lyb19zZW5zX3RyaW07CisJdW5zaWduZWQgbG9uZyBhY2NsX3NlbnNfdHJpbTsKK307 CisKKy8qKgorICogIHN0cnVjdCBpbnZfZmxpY2tfcyBzdHJ1Y3R1cmUgdG8gc3RvcmUgZmxpY2sg ZGF0YS4KKyAqICBAbG93ZXI6CWxvd2VyIGJvdW5kIG9mIGZsaWNrLgorICogIEB1cHBlcjogICAg IHVwcGVyIGJvdW5kIG9mIGZsaWNrLgorICogIEBjb3VudGVyOgljb3VudGVyIG9mIGZsaWNrLgor ICogIEBtc2dfb247ICAgIG1lc3NhZ2UgdG8gY2FycnkgZmxpY2sKKyAqICBAYXhpczogICAgICBh eGlzIG9mIGZsaWNrCisgKi8KK3N0cnVjdCBpbnZfZmxpY2tfcyB7CisJaW50IGxvd2VyOworCWlu dCB1cHBlcjsKKwlpbnQgY291bnRlcjsKKwlpbnQgbXNnX29uOworCWludCBheGlzOworfTsKKwor ZW51bSBpbnZfY2hhbm5lbF9udW0geworCUlOVl9DSEFOTkVMX05VTV9HWVJPID0gNCwKKwlJTlZf Q0hBTk5FTF9OVU1fR1lST19BQ0NMID0gNywKKwlJTlZfQ0hBTk5FTF9OVU1fR1lST19BQ0NMX1FV QU5URVJOSU9OID0gMTEsCisJSU5WX0NIQU5ORUxfTlVNX0dZUk9fQUNDTF9RVUFOVEVSTklPTl9N QUdOID0gMTQsCit9OworCisvKioKKyAqICBzdHJ1Y3QgaW52X3RhcF9zIHN0cnVjdHVyZSB0byBz dG9yZSB0YXAgZGF0YS4KKyAqICBAbWluX2NvdW50OiAgbWluaW11bSB0YXBzIGNvdW50ZWQuCisg KiAgQHRocmVzaDogICAgdGFwIHRocmVzaG9sZC4KKyAqICBAdGltZToJdGFwIHRpbWUuCisgKi8K K3N0cnVjdCBpbnZfdGFwX3MgeworCXVuc2lnbmVkIHNob3J0IG1pbl9jb3VudDsKKwl1bnNpZ25l ZCBzaG9ydCB0aHJlc2g7CisJdW5zaWduZWQgc2hvcnQgdGltZTsKK307CitzdHJ1Y3QgaW52X21w dV9zbGF2ZTsKKy8qKgorICogIHN0cnVjdCBpbnZfbXB1X2lpb19zIC0gRHJpdmVyIHN0YXRlIHZh cmlhYmxlcy4KKyAqICBAY2hpcF9jb25maWc6CUNhY2hlZCBhdHRyaWJ1dGUgaW5mb3JtYXRpb24u CisgKiAgQGNoaXBfaW5mbzoJCUNoaXAgaW5mb3JtYXRpb24gZnJvbSByZWFkLW9ubHkgcmVnaXN0 ZXJzLgorICogIEB0cmlnOyAgICAgICAgICAgICAgaWlvIHRyaWdnZXIuCisgKiAgQGZsaWNrOgkJ ZmxpY2sgZGF0YSBzdHJ1Y3R1cmUKKyAqICBAdGFwOiAgICAgICAgICAgICAgIHRhcCBkYXRhIHN0 cnVjdHVyZQorICogIEByZWc6CQlNYXAgb2YgaW1wb3J0YW50IHJlZ2lzdGVycy4KKyAqICBAaHc6 CQlPdGhlciBoYXJkd2FyZS1zcGVjaWZpYyBpbmZvcm1hdGlvbi4KKyAqICBAY2hpcF90eXBlOgkJ Y2hpcCB0eXBlLgorICogIEB0aW1lX3N0YW1wX2xvY2s6CXNwaW4gbG9jayB0byB0aW1lIHN0YW1w LgorICogIEBjbGllbnQ6CQlpMmMgY2xpZW50IGhhbmRsZS4KKyAqICBAcGxhdF9kYXRhOgkJcGxh dGZvcm0gZGF0YS4KKyAqICBAbXB1X3NsYXZlOgkJbXB1IHNsYXZlIGhhbmRsZS4KKyAqICBpbnQg KCpzZXRfcG93ZXJfc3RhdGUpKHN0cnVjdCBpbnZfbXB1X2lpb19zICosIGludCBvbik6IGZ1bmN0 aW9uIHB0cgorICogIGludCAoKnN3aXRjaF9neXJvX2VuZ2luZSkoc3RydWN0IGludl9tcHVfaWlv X3MgKiwgaW50IG9uKTogZnVuY3Rpb24gcHRyCisgKiAgaW50ICgqc3dpdGNoX2FjY2xfZW5naW5l KShzdHJ1Y3QgaW52X21wdV9paW9fcyAqLCBpbnQgb24pOiBmdW5jdGlvbiBwdHIKKyAqICBpbnQg KCppbml0X2NvbmZpZykoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik6IGZ1bmN0aW9uIHB0cgor ICogdm9pZCAoKnNldHVwX3JlZykoc3RydWN0IGludl9yZWdfbWFwX3MgKnJlZyk6IGZ1bmN0aW9u IHB0cgorICogIEB0aW1lc3RhbXBzOiAgICAgICAga2ZpZm8gcXVldWUgdG8gc3RvcmUgdGltZSBz dGFtcC4KKyAqICBAY29tcGFzc19zdF91cHBlcjogIGNvbXBhc3Mgc2VsZiB0ZXN0IHVwcGVyIGxp bWl0LgorICogIEBjb21wYXNzX3N0X2xvd2VyOiAgY29tcGFzcyBzZWxmIHRlc3QgbG93ZXIgbGlt aXQuCisgKiAgQGlycTogICAgICAgICAgICAgICBpcnEgbnVtYmVyIHN0b3JlLgorICogIEBhY2Nl bF9iaWFzOiAgICAgICAgYWNjZWwgYmlhcyBzdG9yZS4KKyAqICBAZ3lyb19iaWFzOiAgICAgICAg IGd5cm8gYmlhcyBzdG9yZS4KKyAqICBAcmF3X2d5cm86ICAgICAgICAgIHJhdyBneXJvIGRhdGEu CisgKiAgQHJhd19hY2NlbDogICAgICAgICByYXcgYWNjZWwgZGF0YS4KKyAqICBAcmF3X2NvbXBh c3M6ICAgICAgIHJhdyBjb21wYXNzLgorICogIEBjb21wYXNzX3NjYWxlOiAgICAgY29tcGFzcyBz Y2FsZS4KKyAqICBAaTJjX2FkZHI6ICAgICAgICAgIGkyYyBhZGRyZXNzLgorICogIEBjb21wYXNz X2RpdmlkZXI6ICAgc2xvdyBkb3duIGNvbXBhc3MgcmF0ZS4KKyAqICBAY29tcGFzc19jb3VudGVy OiAgIHNsb3cgZG93biBjb21wYXNzIHJhdGUuCisgKiAgQHNhbXBsZV9kaXZpZGVyOiAgICBzYW1w bGUgZGl2aWRlciBmb3IgZG1wLgorICogIEBmaWZvX2RpdmlkZXI6ICAgICAgZmlmbyBkaXZpZGVy IGZvciBkbXAuCisgKiAgQG9yaWVudF9kYXRhOiAgICAgICBvcmllbnRhdGlvbiBkYXRhLgorICog IEBkaXNwbGF5X29yaWVudF9kYXRhOmRpc3BsYXkgb3JpZW50IGRhdGEuCisgKiAgQHRhcF9kYXRh OiAgICAgICAgICB0YXAgZGF0YS4KKyAqICBAbnVtX2NoYW5uZWxzOiAgICAgIG51bWJlciBvZiBj aGFubmVscyBmb3IgY3VycmVudCBjaGlwLgorICogIEBzbF9oYW5kbGU6ICAgICAgICAgSGFuZGxl IHRvIEkyQyBwb3J0LgorICogIEBpcnFfZHVyX25zOiAgICAgICAgZHVyYXRpb24gYmV0d2VlbiBl YWNoIGlycS4KKyAqICBAbGFzdF9pc3JfdGltZTogICAgIGxhc3QgaXNyIHRpbWUuCisgKi8KK3N0 cnVjdCBpbnZfbXB1X2lpb19zIHsKKyNkZWZpbmUgVElNRVNUQU1QX0ZJRk9fU0laRSAxNgorCXN0 cnVjdCBpbnZfY2hpcF9jb25maWdfcyBjaGlwX2NvbmZpZzsKKwlzdHJ1Y3QgaW52X2NoaXBfaW5m b19zIGNoaXBfaW5mbzsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgICp0cmlnOworCXN0cnVjdCBpbnZf ZmxpY2tfcyBmbGljazsKKwlzdHJ1Y3QgaW52X3RhcF9zICAgdGFwOworCXN0cnVjdCBpbnZfcmVn X21hcF9zIHJlZzsKKwljb25zdCBzdHJ1Y3QgaW52X2h3X3MgKmh3OworCWVudW0gICBpbnZfZGV2 aWNlcyBjaGlwX3R5cGU7CisJc3BpbmxvY2tfdCB0aW1lX3N0YW1wX2xvY2s7CisJc3RydWN0IGky Y19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgbXB1X3BsYXRmb3JtX2RhdGEgcGxhdF9kYXRhOwor CXN0cnVjdCBpbnZfbXB1X3NsYXZlICptcHVfc2xhdmU7CisJaW50ICgqc2V0X3Bvd2VyX3N0YXRl KShzdHJ1Y3QgaW52X21wdV9paW9fcyAqLCBib29sIG9uKTsKKwlpbnQgKCpzd2l0Y2hfZ3lyb19l bmdpbmUpKHN0cnVjdCBpbnZfbXB1X2lpb19zICosIGJvb2wgb24pOworCWludCAoKnN3aXRjaF9h Y2NsX2VuZ2luZSkoc3RydWN0IGludl9tcHVfaWlvX3MgKiwgYm9vbCBvbik7CisJaW50ICgqaW5p dF9jb25maWcpKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCXZvaWQgKCpzZXR1cF9yZWcp KHN0cnVjdCBpbnZfcmVnX21hcF9zICpyZWcpOworCURFQ0xBUkVfS0ZJRk8odGltZXN0YW1wcywg bG9uZyBsb25nLCBUSU1FU1RBTVBfRklGT19TSVpFKTsKKwljb25zdCBzaG9ydCAqY29tcGFzc19z dF91cHBlcjsKKwljb25zdCBzaG9ydCAqY29tcGFzc19zdF9sb3dlcjsKKwlzaG9ydCBpcnE7CisJ aW50IGFjY2VsX2JpYXNbM107CisJaW50IGd5cm9fYmlhc1szXTsKKwlzaG9ydCByYXdfZ3lyb1sz XTsKKwlzaG9ydCByYXdfYWNjZWxbM107CisJc2hvcnQgcmF3X2NvbXBhc3NbM107CisJdW5zaWdu ZWQgY2hhciBjb21wYXNzX3NjYWxlOworCXVuc2lnbmVkIGNoYXIgaTJjX2FkZHI7CisJdW5zaWdu ZWQgY2hhciBjb21wYXNzX2RpdmlkZXI7CisJdW5zaWduZWQgY2hhciBjb21wYXNzX2NvdW50ZXI7 CisJdW5zaWduZWQgY2hhciBzYW1wbGVfZGl2aWRlcjsKKwl1bnNpZ25lZCBjaGFyIGZpZm9fZGl2 aWRlcjsKKwl1bnNpZ25lZCBjaGFyIG9yaWVudF9kYXRhOworCXVuc2lnbmVkIGNoYXIgZGlzcGxh eV9vcmllbnRfZGF0YTsKKwl1bnNpZ25lZCBjaGFyIHRhcF9kYXRhOworCWVudW0gaW52X2NoYW5u ZWxfbnVtIG51bV9jaGFubmVsczsKKwl2b2lkICpzbF9oYW5kbGU7CisJdW5zaWduZWQgaW50IGly cV9kdXJfbnM7CisJbG9uZyBsb25nIGxhc3RfaXNyX3RpbWU7CisjaWZkZWYgQ09ORklHX0lOVl9U RVNUSU5HCisJdW5zaWduZWQgbG9uZyBpMmNfcmVhZGNvdW50OworCXVuc2lnbmVkIGxvbmcgaTJj X3dyaXRlY291bnQ7CisjZW5kaWYKK307CisKKy8qIHByb2R1Y2VzIGFuIHVuaXF1ZSBpZGVudGlm aWVyIGZvciBlYWNoIGRldmljZSBiYXNlZCBvbiB0aGUKKyAgIGNvbWJpbmF0aW9uIG9mIHByb2R1 Y3QgdmVyc2lvbiBhbmQgcHJvZHVjdCByZXZpc2lvbiAqLworc3RydWN0IHByb2RfcmV2X21hcF90 IHsKKwl1bnNpZ25lZCBzaG9ydCBtcGxfcHJvZHVjdF9rZXk7CisJdW5zaWduZWQgY2hhciBzaWxp Y29uX3JldjsKKwl1bnNpZ25lZCBzaG9ydCBneXJvX3RyaW07CisJdW5zaWduZWQgc2hvcnQgYWNj ZWxfdHJpbTsKK307CisKKy8qKgorICogIHN0cnVjdCBpbnZfbXB1X3NsYXZlIC0gTVBVIHNsYXZl IHN0cnVjdHVyZS4KKyAqICBAc3VzcGVuZDoJCXN1c3BlbmQgb3BlcmF0aW9uLgorICogIEByZXN1 bWU6CQlyZXN1bWUgb3BlcmF0aW9uLgorICogIEBzZXR1cDoJCXNldHVwIGNoaXAuIGluaXRpYWxp emF0aW9uLgorICogIEBjb21iaW5lX2RhdGE6CWNvbWJpbmUgcmF3IGRhdGEgaW50byBtZWFuaW5n ZnVsIGRhdGEuCisgKiAgQGdldF9tb2RlOgkJZ2V0IGN1cnJlbnQgY2hpcCBtb2RlLgorICogIEBz ZXRfbHBmICAgICAgICAgICAgc2V0IGxvdyBwYXNzIGZpbHRlci4KKyAqICBAc2V0X2ZzICAgICAg ICAgICAgIHNldCBmdWxsIHNjYWxlCisgKi8KK3N0cnVjdCBpbnZfbXB1X3NsYXZlIHsKKwlpbnQg KCpzdXNwZW5kKShzdHJ1Y3QgaW52X21wdV9paW9fcyAqKTsKKwlpbnQgKCpyZXN1bWUpKHN0cnVj dCBpbnZfbXB1X2lpb19zICopOworCWludCAoKnNldHVwKShzdHJ1Y3QgaW52X21wdV9paW9fcyAq KTsKKwlpbnQgKCpjb21iaW5lX2RhdGEpKHVuc2lnbmVkIGNoYXIgKmluLCBzaG9ydCAqb3V0KTsK KwlpbnQgKCpnZXRfbW9kZSkoc3RydWN0IGludl9tcHVfaWlvX3MgKik7CisJaW50ICgqc2V0X2xw Zikoc3RydWN0IGludl9tcHVfaWlvX3MgKiwgaW50IHJhdGUpOworCWludCAoKnNldF9mcykoc3Ry dWN0IGludl9tcHVfaWlvX3MgKiwgaW50IGZzKTsKK307CisKKy8qIEFLTSBkZWZpbml0aW9ucyAq LworI2RlZmluZSBSRUdfQUtNX0lEICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBSRUdfQUtN X1NUQVRVUyAgICAgICAgICAgMHgwMgorI2RlZmluZSBSRUdfQUtNX01FQVNVUkVfREFUQSAgICAg MHgwMworI2RlZmluZSBSRUdfQUtNX01PREUgICAgICAgICAgICAgMHgwQQorI2RlZmluZSBSRUdf QUtNX1NUX0NUUkwgICAgICAgICAgMHgwQworI2RlZmluZSBSRUdfQUtNX1NFTlNJVElWSVRZICAg ICAgMHgxMAorI2RlZmluZSBSRUdfQUtNODk2M19DTlRMMSAgICAgICAgMHgwQQorCisjZGVmaW5l IERBVEFfQUtNX0lEICAgICAgICAgICAgICAweDQ4CisjZGVmaW5lIERBVEFfQUtNX01PREVfUFdf RE4gICAgICAweDAwCisjZGVmaW5lIERBVEFfQUtNX01PREVfUFdfU00gICAgICAweDAxCisjZGVm aW5lIERBVEFfQUtNX01PREVfUFdfU1QgICAgICAweDA4CisjZGVmaW5lIERBVEFfQUtNX01PREVf UFdfRlIgICAgICAweDBGCisjZGVmaW5lIERBVEFfQUtNX1NFTEZfVEVTVCAgICAgICAweDQwCisj ZGVmaW5lIERBVEFfQUtNX0RSRFkgICAgICAgICAgICAweDAxCisjZGVmaW5lIERBVEFfQUtNODk2 M19CSVQgICAgICAgICAweDEwCisjZGVmaW5lIERBVEFfQUtNX1NUQVRfTUFTSyAgICAgICAweDBD CisKKyNkZWZpbmUgREFUQV9BS004OTc1X1NDQUxFICAgICAgIDk4MzAKKyNkZWZpbmUgREFUQV9B S004OTcyX1NDQUxFICAgICAgIDE5NjYxCisjZGVmaW5lIERBVEFfQUtNODk2M19TQ0FMRTAgICAg ICAxOTY2MQorI2RlZmluZSBEQVRBX0FLTTg5NjNfU0NBTEUxICAgICAgNDkxNQorI2RlZmluZSBB S004OTYzX1NDQUxFX1NISUZUICAgICAgNAorI2RlZmluZSBOVU1fQllURVNfQ09NUEFTU19TTEFW RSAgOAorCisvKnJlZ2lzdGVyIGFuZCBhc3NvY2lhdGVkIGJpdCBkZWZpbml0aW9uKi8KKyNkZWZp bmUgUkVHX1lHT0ZGU19UQyAgICAgICAgICAgMHgxCisjZGVmaW5lIEJJVF9JMkNfTVNUX1ZERElP CQkweDgwCisKKyNkZWZpbmUgUkVHX1hBX09GRlNfTF9UQyAgICAgICAgMHg3CisjZGVmaW5lIFJF R19QUk9EVUNUX0lEICAgICAgICAgIDB4QworI2RlZmluZSBSRUdfU1RfR0NUX1ggICAgICAgICAg ICAweEQKKyNkZWZpbmUgUkVHX1NBTVBMRV9SQVRFX0RJViAgICAgMHgxOQorI2RlZmluZSBSRUdf Q09ORklHICAgICAgICAgICAgICAweDFBCisKKyNkZWZpbmUgUkVHX0dZUk9fQ09ORklHICAgICAg ICAgMHgxQgorI2RlZmluZSBCSVRTX1NFTEZfVEVTVF9FTgkJMHhFMAorCisjZGVmaW5lIFJFR19B Q0NFTF9DT05GSUcJMHgxQworCisjZGVmaW5lIFJFR19GSUZPX0VOICAgICAgICAgICAgIDB4MjMK KyNkZWZpbmUgQklUX0FDQ0VMX09VVAkJCTB4MDgKKyNkZWZpbmUgQklUU19HWVJPX09VVAkJCTB4 NzAKKworCisjZGVmaW5lIFJFR19JMkNfTVNUX0NUUkwgICAgICAgIDB4MjQKKyNkZWZpbmUgQklU X1dBSVRfRk9SX0VTCQkJMHg0MAorCisjZGVmaW5lIFJFR19JMkNfU0xWMF9BRERSICAgICAgIDB4 MjUKKyNkZWZpbmUgQklUX0kyQ19SRUFECQkJMHg4MAorCisjZGVmaW5lIFJFR19JMkNfU0xWMF9S RUcgICAgICAgIDB4MjYKKworI2RlZmluZSBSRUdfSTJDX1NMVjBfQ1RSTCAgICAgICAweDI3Cisj ZGVmaW5lIEJJVF9TTFZfRU4JCQkweDgwCisKKyNkZWZpbmUgUkVHX0kyQ19TTFYxX0FERFIgICAg ICAgMHgyOAorI2RlZmluZSBSRUdfSTJDX1NMVjFfUkVHICAgICAgICAweDI5CisjZGVmaW5lIFJF R19JMkNfU0xWMV9DVFJMICAgICAgIDB4MkEKKyNkZWZpbmUgUkVHX0kyQ19TTFY0X0NUUkwgICAg ICAgMHgzNAorCisjZGVmaW5lIFJFR19JTlRfUElOX0NGRyAgICAgICAgIDB4MzcKKyNkZWZpbmUg QklUX0JZUEFTU19FTgkJCTB4MgorCisjZGVmaW5lIFJFR19JTlRfRU5BQkxFICAgICAgICAgIDB4 MzgKKyNkZWZpbmUgQklUX0RBVEFfUkRZX0VOCQkJMHgwMQorI2RlZmluZSBCSVRfRE1QX0lOVF9F TgkJCTB4MDIKKworI2RlZmluZSBSRUdfRE1QX0lOVF9TVEFUVVMgICAgICAweDM5CisjZGVmaW5l IFJFR19JTlRfU1RBVFVTICAgICAgICAgIDB4M0EKKyNkZWZpbmUgUkVHX1JBV19BQ0NFTCAgICAg ICAgICAgMHgzQgorI2RlZmluZSBSRUdfVEVNUEVSQVRVUkUgICAgICAgICAweDQxCisjZGVmaW5l IFJFR19SQVdfR1lSTyAgICAgICAgICAgIDB4NDMKKyNkZWZpbmUgUkVHX0VYVF9TRU5TX0RBVEFf MDAgICAgMHg0OQorI2RlZmluZSBSRUdfSTJDX1NMVjFfRE8gICAgICAgICAweDY0CisKKyNkZWZp bmUgUkVHX0kyQ19NU1RfREVMQVlfQ1RSTCAgMHg2NworI2RlZmluZSBCSVRfU0xWMF9ETFlfRU4J CQkweDAxCisjZGVmaW5lIEJJVF9TTFYxX0RMWV9FTgkJCTB4MDIKKworI2RlZmluZSBSRUdfVVNF Ul9DVFJMICAgICAgICAgICAweDZBCisjZGVmaW5lIEJJVF9GSUZPX1JTVAkJCTB4MDQKKyNkZWZp bmUgQklUX0RNUF9SU1QJCQkweDA4CisjZGVmaW5lIEJJVF9JMkNfTVNUX0VOCQkJMHgyMAorI2Rl ZmluZSBCSVRfRklGT19FTgkJCTB4NDAKKyNkZWZpbmUgQklUX0RNUF9FTgkJCTB4ODAKKworI2Rl ZmluZSBSRUdfUFdSX01HTVRfMSAgICAgICAgICAweDZCCisjZGVmaW5lIEJJVF9IX1JFU0VUCQkJ MHg4MAorI2RlZmluZSBCSVRfU0xFRVAJCQkweDQwCisjZGVmaW5lIEJJVF9DWUNMRQkJCTB4MjAK KworI2RlZmluZSBSRUdfUFdSX01HTVRfMiAgICAgICAgICAweDZDCisjZGVmaW5lIEJJVF9QV1Jf QUNDTF9TVEJZCQkweDM4CisjZGVmaW5lIEJJVF9QV1JfR1lST19TVEJZCQkweDA3CisjZGVmaW5l IEJJVF9MUEFfRlJFUQkJCTB4QzAKKworI2RlZmluZSBSRUdfQkFOS19TRUwgICAgICAgICAgICAw eDZECisjZGVmaW5lIFJFR19NRU1fU1RBUlRfQUREUiAgICAgIDB4NkUKKyNkZWZpbmUgUkVHX01F TV9SVyAgICAgICAgICAgICAgMHg2RgorI2RlZmluZSBSRUdfUFJHTV9TVFJUX0FERFJIICAgICAw eDcwCisjZGVmaW5lIFJFR19GSUZPX0NPVU5UX0ggICAgICAgIDB4NzIKKyNkZWZpbmUgUkVHX0ZJ Rk9fUl9XICAgICAgICAgICAgMHg3NAorCisvKiBkYXRhIGRlZmluaXRpb25zICovCisjZGVmaW5l IERNUF9TVEFSVF9BRERSICAgICAgICAgICAweDQwMAorI2RlZmluZSBETVBfTUFTS19UQVAgICAg ICAgICAgICAgMHgzZgorI2RlZmluZSBETVBfTUFTS19ESVNfT1JJRU4gICAgICAgMHhDMAorI2Rl ZmluZSBETVBfRElTX09SSUVOX1NISUZUICAgICAgNgorCisjZGVmaW5lIEJZVEVTX0ZPUl9ETVAg ICAgICAgICAgICAxNgorI2RlZmluZSBRVUFURVJOSU9OX0JZVEVTICAgICAgICAgMTYKKyNkZWZp bmUgQllURVNfUEVSX1NFTlNPUiAgICAgICAgIDYKKyNkZWZpbmUgRklGT19DT1VOVF9CWVRFICAg ICAgICAgIDIKKyNkZWZpbmUgRklGT19USFJFU0hPTEQgICAgICAgICAgIDUwMAorI2RlZmluZSBQ T1dFUl9VUF9USU1FICAgICAgICAgICAgMTAwCisjZGVmaW5lIFNFTlNPUl9VUF9USU1FICAgICAg ICAgICAzMAorI2RlZmluZSBNUFVfTUVNX0JBTktfU0laRSAgICAgICAgMjU2CisjZGVmaW5lIE1Q VTYwNTBfVEVNUF9PRkZTRVQJIDI0NjIzMDdMCisjZGVmaW5lIE1QVTYwNTBfVEVNUF9TQ0FMRSAg ICAgICAyOTc3NjUzTAorI2RlZmluZSBNUFVfVEVNUF9TSElGVCAgICAgICAgICAgMTYKKyNkZWZp bmUgTFBBX0ZSRVFfU0hJRlQgICAgICAgICAgIDYKKyNkZWZpbmUgQ09NUEFTU19SQVRFX1NDQUxF ICAgICAgIDEwCisjZGVmaW5lIE1BWF9HWVJPX0ZTX1BBUkFNICAgICAgICAzCisjZGVmaW5lIE1B WF9BQ0NMX0ZTX1BBUkFNICAgICAgICAzCisjZGVmaW5lIE1BWF9MUEFfRlJFUV9QQVJBTSAgICAg ICAzCisjZGVmaW5lIFRIUkVFX0FYSVMgICAgICAgICAgICAgICAzCisjZGVmaW5lIEdZUk9fQ09O RklHX0ZTUl9TSElGVCAgICAzCisjZGVmaW5lIEFDQ0xfQ09ORklHX0ZTUl9TSElGVCAgICAzCisj ZGVmaW5lIEdZUk9fRFBTX1NDQUxFICAgICAgICAgICAyNTAKKyNkZWZpbmUgTUVNX0FERFJfUFJP RF9SRVYgICAgICAgIDB4NgorI2RlZmluZSBTT0ZUX1BST0RfVkVSX0JZVEVTICAgICAgNQorI2Rl ZmluZSBDUkNfRklSTVdBUkVfU0VFRCAgICAgICAgMAorCisvKiBpbml0IHBhcmFtZXRlcnMgKi8K KyNkZWZpbmUgSU5JVF9GSUZPX1JBVEUgICAgICAgICAgIDUwCisjZGVmaW5lIElOSVRfRFVSX1RJ TUUgICAgICAgICAgICgoMTAwMCAvIElOSVRfRklGT19SQVRFKSAqIDEwMDAgKiAxMDAwKQorI2Rl ZmluZSBJTklUX1RBUF9USFJFU0hPTEQgICAgICAgMTAwCisjZGVmaW5lIElOSVRfVEFQX1RJTUUg ICAgICAgICAgICAxMDAKKyNkZWZpbmUgSU5JVF9UQVBfTUlOX0NPVU5UICAgICAgIDIKKyNkZWZp bmUgTVBMX1BST0RfS0VZKHZlciwgcmV2KSAodmVyICogMTAwICsgcmV2KQorI2RlZmluZSBOVU1f T0ZfUFJPRF9SRVZTIChBUlJBWV9TSVpFKHByb2RfcmV2X21hcCkpCisvKi0tLS0gTVBVNjA1MCBT aWxpY29uIFJldmlzaW9ucyAtLS0tKi8KKyNkZWZpbmUgTVBVX1NJTElDT05fUkVWX0EyICAgICAg ICAgICAgICAgICAgICAxICAgICAgIC8qIE1QVTYwNTBBMiBEZXZpY2UgKi8KKyNkZWZpbmUgTVBV X1NJTElDT05fUkVWX0IxICAgICAgICAgICAgICAgICAgICAyICAgICAgIC8qIE1QVTYwNTBCMSBE ZXZpY2UgKi8KKworI2RlZmluZSBCSVRfUFJGVENIX0VOICAgICAgICAgICAgICAgICAgICAgICAg IDB4NDAKKyNkZWZpbmUgQklUX0NGR19VU0VSX0JBTksgICAgICAgICAgICAgICAgICAgICAweDIw CisjZGVmaW5lIEJJVFNfTUVNX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxZgorCisj ZGVmaW5lIFRJTUVfU1RBTVBfVE9SICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBN QVhfQ0FUQ0hfVVAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgREVGQVVMVF9B Q0NMX1RSSU0gICAgICAgICAgICAgICAgICAgICAxNjM4NAorI2RlZmluZSBNQVhfRklGT19SQVRF ICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAKKyNkZWZpbmUgTUlOX0ZJRk9fUkFURSAgICAg ICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE9ORV9LX0haICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgMTAwMAorCisvKiBmbGljayByZWxhdGVkIGRlZmluZXMgKi8KKyNkZWZpbmUg REFUQV9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDk3CisjZGVmaW5lIERBVEFf TVNHX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYyMTQ0CisjZGVmaW5lIEZMSUNLX0lO VF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgOAorCisvKnRhcCByZWxhdGVkIGRlZmluZXMg Ki8KKyNkZWZpbmUgSU5WX1RBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4Cisj ZGVmaW5lIElOVl9OVU1fVEFQX0FYRVMgICAgICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5l IElOVl9UQVBfQVhJU19YX1BPUyAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBJTlZf VEFQX0FYSVNfWF9ORUcgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgSU5WX1RBUF9B WElTX1lfUE9TICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIElOVl9UQVBfQVhJU19Z X05FRyAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBJTlZfVEFQX0FYSVNfWl9QT1Mg ICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgSU5WX1RBUF9BWElTX1pfTkVHICAgICAg ICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIElOVl9UQVBfQUxMX0RJUkVDVElPTlMgICAgICAg ICAgICAgICAgMHgzZgorCisjZGVmaW5lIElOVl9UQVBfQVhJU19YICAgICAgICAgICAgICAgICAg ICAgICAgMHgxCisjZGVmaW5lIElOVl9UQVBfQVhJU19ZICAgICAgICAgICAgICAgICAgICAgICAg MHgyCisjZGVmaW5lIElOVl9UQVBfQVhJU19aICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisK KyNkZWZpbmUgSU5WX1RBUF9BWElTX0FMTCAgICAgICAgICAgICAgICAgICAgICBcCisJCShJTlZf VEFQX0FYSVNfWCAgICAgICAgICAgIHwgICBcCisJCUlOVl9UQVBfQVhJU19ZICAgICAgICAgICAg IHwgICBcCisJCUlOVl9UQVBfQVhJU19aKQorCisjZGVmaW5lIElOVF9TUkNfVEFQICAgIDB4MDEK KyNkZWZpbmUgSU5UX1NSQ19PUklFTlQgMHgwMgorI2RlZmluZSBJTlRfU1JDX0RJU1BMQVlfT1JJ RU5UICAweDA4CisjZGVmaW5lIElOVF9TUkNfU0hBS0UgICAgICAgICAgIDB4MTAKKworCisvKm9y aWVudGF0aW9uIHJlbGF0ZWQgKi8KKyNkZWZpbmUgSU5WX1hfVVAgICAgICAgICAgICAgICAgICAg ICAgICAgIDB4MDEKKyNkZWZpbmUgSU5WX1hfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgIDB4 MDIKKyNkZWZpbmUgSU5WX1lfVVAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZp bmUgSU5WX1lfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgSU5WX1pf VVAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgSU5WX1pfRE9XTiAgICAg ICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgSU5WX09SSUVOVEFUSU9OX0FMTCAgICAg ICAgICAgICAgIDB4M0YKKworI2RlZmluZSBJTlZfT1JJRU5UQVRJT05fRkxJUCAgICAgICAgICAg ICAgMHg0MAorI2RlZmluZSBJTlZfWF9BWElTX0lOREVYICAgICAgICAgICAgICAgICAgMHgwMAor I2RlZmluZSBJTlZfWV9BWElTX0lOREVYICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBJ TlZfWl9BWElTX0lOREVYICAgICAgICAgICAgICAgICAgMHgwMgorCisjZGVmaW5lIElOVl9FTEVN RU5UXzEgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgSU5WX0VMRU1FTlRfMiAg ICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBJTlZfRUxFTUVOVF8zICAgICAgICAg ICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIElOVl9FTEVNRU5UXzQgICAgICAgICAgICAgICAg ICAgICAweDAwMDgKKyNkZWZpbmUgSU5WX0VMRU1FTlRfNSAgICAgICAgICAgICAgICAgICAgIDB4 MDAxMAorI2RlZmluZSBJTlZfRUxFTUVOVF82ICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisj ZGVmaW5lIElOVl9FTEVNRU5UXzcgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUg SU5WX0VMRU1FTlRfOCAgICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBJTlZfQUxM ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGCisjZGVmaW5lIElOVl9FTEVNRU5UX01B U0sgICAgICAgICAgICAgICAgICAweDAwRkYKKyNkZWZpbmUgSU5WX0dZUk9fQUNDX01BU0sgICAg ICAgICAgICAgICAgIDB4MDA3RQorLyogc2NhbiBlbGVtZW50IGRlZmluaXRpb24gKi8KK2VudW0g aW52X21wdV9zY2FuIHsKKwlJTlZfTVBVX1NDQU5fUVVBVF9SID0gMCwKKwlJTlZfTVBVX1NDQU5f UVVBVF9YLAorCUlOVl9NUFVfU0NBTl9RVUFUX1ksCisJSU5WX01QVV9TQ0FOX1FVQVRfWiwKKwlJ TlZfTVBVX1NDQU5fR1lST19YLAorCUlOVl9NUFVfU0NBTl9HWVJPX1ksCisJSU5WX01QVV9TQ0FO X0dZUk9fWiwKKwlJTlZfTVBVX1NDQU5fQUNDTF9YLAorCUlOVl9NUFVfU0NBTl9BQ0NMX1ksCisJ SU5WX01QVV9TQ0FOX0FDQ0xfWiwKKwlJTlZfTVBVX1NDQU5fTUFHTl9YLAorCUlOVl9NUFVfU0NB Tl9NQUdOX1ksCisJSU5WX01QVV9TQ0FOX01BR05fWiwKKwlJTlZfTVBVX1NDQU5fVElNRVNUQU1Q LAorfTsKKworZW51bSBpbnZfZmlsdGVyX2UgeworCUlOVl9GSUxURVJfMjU2SFpfTk9MUEYyID0g MCwKKwlJTlZfRklMVEVSXzE4OEhaLAorCUlOVl9GSUxURVJfOThIWiwKKwlJTlZfRklMVEVSXzQy SFosCisJSU5WX0ZJTFRFUl8yMEhaLAorCUlOVl9GSUxURVJfMTBIWiwKKwlJTlZfRklMVEVSXzVI WiwKKwlJTlZfRklMVEVSXzIxMDBIWl9OT0xQRiwKKwlOVU1fRklMVEVSCit9OworCitlbnVtIGlu dl9zbGF2ZV9tb2RlIHsKKwlJTlZfTU9ERV9TVVNQRU5ELAorCUlOVl9NT0RFX05PUk1BTCwKK307 CisKKy8qPT09PSBNUFU2MDUwQjEgTUVNT1JZID09PT0qLworZW51bSBNUFVfTUVNT1JZX0JBTktT IHsKKwlNRU1fUkFNX0JBTktfMCA9IDAsCisJTUVNX1JBTV9CQU5LXzEsCisJTUVNX1JBTV9CQU5L XzIsCisJTUVNX1JBTV9CQU5LXzMsCisJTUVNX1JBTV9CQU5LXzQsCisJTUVNX1JBTV9CQU5LXzUs CisJTUVNX1JBTV9CQU5LXzYsCisJTUVNX1JBTV9CQU5LXzcsCisJTUVNX1JBTV9CQU5LXzgsCisJ TUVNX1JBTV9CQU5LXzksCisJTUVNX1JBTV9CQU5LXzEwLAorCU1FTV9SQU1fQkFOS18xMSwKKwlN UFVfTUVNX05VTV9SQU1fQkFOS1MsCisJTVBVX01FTV9PVFBfQkFOS18wID0gMTYKK307CisKKy8q IElJTyBhdHRyaWJ1dGUgYWRkcmVzcyAqLworZW51bSBNUFVfSUlPX0FUVFJfQUREUiB7CisJQVRU Ul9ETVBfRkxJQ0tfTE9XRVIsCisJQVRUUl9ETVBfRkxJQ0tfVVBQRVIsCisJQVRUUl9ETVBfRkxJ Q0tfQ09VTlRFUiwKKwlBVFRSX0RNUF9GTElDS19JTlRfT04sCisJQVRUUl9ETVBfRkxJQ0tfQVhJ UywKKwlBVFRSX0RNUF9GTElDS19NU0dfT04sCisJQVRUUl9ETVBfUEVET01FVEVSX1NURVBTLAor CUFUVFJfRE1QX1BFRE9NRVRFUl9USU1FLAorCUFUVFJfRE1QX1RBUF9USFJFU0hPTEQsCisJQVRU Ul9ETVBfVEFQX01JTl9DT1VOVCwKKwlBVFRSX0RNUF9UQVBfT04sCisJQVRUUl9ETVBfVEFQX1RJ TUUsCisJQVRUUl9ETVBfT04sCisJQVRUUl9ETVBfSU5UX09OLAorCUFUVFJfRE1QX0VWRU5UX0lO VF9PTiwKKwlBVFRSX0RNUF9PVVRQVVRfUkFURSwKKwlBVFRSX0RNUF9PUklFTlRBVElPTl9PTiwK KwlBVFRSX0RNUF9RVUFURVJOSU9OX09OLAorCUFUVFJfRE1QX0RJU1BMQVlfT1JJRU5UQVRJT05f T04sCisJQVRUUl9MUEFfTU9ERSwKKwlBVFRSX0xQQV9GUkVRLAorCUFUVFJfQ0xLX1NSQywKKwlB VFRSX1NFTEZfVEVTVCwKKwlBVFRSX0tFWSwKKwlBVFRSX0dZUk9fTUFUUklYLAorCUFUVFJfQUND TF9NQVRSSVgsCisJQVRUUl9DT01QQVNTX01BVFJJWCwKKwlBVFRSX0dZUk9fRU5BQkxFLAorCUFU VFJfQUNDTF9FTkFCTEUsCisJQVRUUl9DT01QQVNTX0VOQUJMRSwKKwlBVFRSX1BPV0VSX1NUQVRF LAorCUFUVFJfRklSTVdBUkVfTE9BREVELAorI2lmZGVmIENPTkZJR19JTlZfVEVTVElORworCUFU VFJfSTJDX0NPVU5URVJTLAorCUFUVFJfUkVHX1dSSVRFLAorI2VuZGlmCit9OworCitlbnVtIGlu dl9hY2NsX2ZzX2UgeworCUlOVl9GU18wMkcgPSAwLAorCUlOVl9GU18wNEcsCisJSU5WX0ZTXzA4 RywKKwlJTlZfRlNfMTZHLAorCU5VTV9BQ0NMX0ZTUgorfTsKKworZW51bSBpbnZfZnNyX2Ugewor CUlOVl9GU1JfMjUwRFBTID0gMCwKKwlJTlZfRlNSXzUwMERQUywKKwlJTlZfRlNSXzEwMDBEUFMs CisJSU5WX0ZTUl8yMDAwRFBTLAorCU5VTV9GU1IKK307CisKK2VudW0gaW52X2Nsb2NrX3NlbF9l IHsKKwlJTlZfQ0xLX0lOVEVSTkFMID0gMCwKKwlJTlZfQ0xLX1BMTCwKKwlOVU1fQ0xLCit9Owor Citzc2l6ZV90IGludl9kbXBfZmlybXdhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qg a29iamVjdCAqa29iaiwKKwlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLCBs b2ZmX3QgcG9zLCBzaXplX3Qgc2l6ZSk7Citzc2l6ZV90IGludl9kbXBfZmlybXdhcmVfcmVhZChz dHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQlzdHJ1Y3Qg YmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkJY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXpl X3QgY291bnQpOworCitpbnQgaW52X21wdV9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAq aW5kaW9fZGV2KTsKK2ludCBpbnZfbXB1X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmlu ZGlvX2Rldik7Cit2b2lkIGludl9tcHVfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAq aW5kaW9fZGV2KTsKK3ZvaWQgaW52X21wdV9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAq aW5kaW9fZGV2KTsKK2ludCBpbnZfZ2V0X3NpbGljb25fcmV2X21wdTYwNTAoc3RydWN0IGludl9t cHVfaWlvX3MgKnN0KTsKK2ludCBzZXRfaW52X2VuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9f ZGV2LCBib29sIGVuYWJsZSk7CitpbnQgaW52X3NldF9pbnRlcnJ1cHRfb25fZ2VzdHVyZV9ldmVu dChzdHJ1Y3QgaW52X21wdV9paW9fcyAqc3QsIGJvb2wgb24pOworaW50IGludl9zZW5kX3F1YXRl cm5pb24oc3RydWN0IGludl9tcHVfaWlvX3MgKnN0LCBib29sIG9uKTsKK2ludCBpbnZfc2V0X2Rp c3BsYXlfb3JpZW50X2ludGVycnVwdF9kbXAoc3RydWN0IGludl9tcHVfaWlvX3MgKnN0LCBib29s IG9uKTsKK2ludCBpbnZfZW5hYmxlX29yaWVudGF0aW9uX2RtcChzdHJ1Y3QgaW52X21wdV9paW9f cyAqc3QsIGJvb2wgb24pOworaW50IGludl9zZXRfZmlmb19yYXRlKHN0cnVjdCBpbnZfbXB1X2lp b19zICpzdCwgdW5zaWduZWQgc2hvcnQgZmlmb19yYXRlKTsKK3Vuc2lnbmVkIHNob3J0IGludl9k bXBfZ2V0X2FkZHJlc3ModW5zaWduZWQgc2hvcnQga2V5KTsKK2ludCBpbnZfcTMwX211bHQoaW50 IGEsIGludCBiKTsKK2ludCBpbnZfc2V0X3RhcF90aHJlc2hvbGRfZG1wKHN0cnVjdCBpbnZfbXB1 X2lpb19zICpzdCwKKwkJCQl1bnNpZ25lZCBpbnQgYXhpcywgdW5zaWduZWQgc2hvcnQgdGhyZXNo b2xkKTsKK2ludCBpbnZfc2V0X21pbl90YXBzX2RtcChzdHJ1Y3QgaW52X21wdV9paW9fcyAqc3Qs IHVuc2lnbmVkIHNob3J0IG1pbl90YXBzKTsKK2ludCAgaW52X3NldF90YXBfdGltZV9kbXAoc3Ry dWN0IGludl9tcHVfaWlvX3MgKnN0LCB1bnNpZ25lZCBzaG9ydCB0aW1lKTsKK2ludCBpbnZfZW5h YmxlX3RhcF9kbXAoc3RydWN0IGludl9tcHVfaWlvX3MgKnN0LCBib29sIG9uKTsKK2ludCBpbnZf aTJjX3JlYWRfYmFzZShzdHJ1Y3QgaW52X21wdV9paW9fcyAqc3QsIHVuc2lnbmVkIHNob3J0IGky Y19hZGRyLAorCXVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBzaG9ydCBsZW5ndGgsIHVuc2ln bmVkIGNoYXIgKmRhdGEpOworaW50IGludl9pMmNfc2luZ2xlX3dyaXRlX2Jhc2Uoc3RydWN0IGlu dl9tcHVfaWlvX3MgKnN0LAorCXVuc2lnbmVkIHNob3J0IGkyY19hZGRyLCB1bnNpZ25lZCBjaGFy IHJlZywgdW5zaWduZWQgY2hhciBkYXRhKTsKK2ludCBpbnZfZG9fdGVzdChzdHJ1Y3QgaW52X21w dV9paW9fcyAqc3QsIGludCBzZWxmX3Rlc3RfZmxhZywKKwkJaW50ICpneXJvX3Jlc3VsdCwgaW50 ICphY2NsX3Jlc3VsdCk7CitpbnQgbXB1X21lbW9yeV93cml0ZShzdHJ1Y3QgaTJjX2FkYXB0ZXIg KmkyY19hZGFwLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgbXB1X2FkZHIsCisJCQkgICAgdW5zaWdu ZWQgc2hvcnQgbWVtX2FkZHIsCisJCQkgICAgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgY2hh ciBjb25zdCAqZGF0YSk7CitpbnQgbXB1X21lbW9yeV9yZWFkKHN0cnVjdCBpMmNfYWRhcHRlciAq aTJjX2FkYXAsCisJCQkgICB1bnNpZ25lZCBjaGFyIG1wdV9hZGRyLAorCQkJICAgdW5zaWduZWQg c2hvcnQgbWVtX2FkZHIsCisJCQkgICB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpk YXRhKTsKK2ludCBpbnZfaHdfc2VsZl90ZXN0KHN0cnVjdCBpbnZfbXB1X2lpb19zICpzdCk7CisK KyNkZWZpbmUgbWVtX3coYSwgYiwgYykgbXB1X21lbW9yeV93cml0ZShzdC0+c2xfaGFuZGxlLFwK KwkJCXN0LT5pMmNfYWRkciwgYSwgYiwgYykKKyNkZWZpbmUgbWVtX3dfa2V5KGtleSwgYiwgYykg bXB1X21lbW9yeV93cml0ZShzdC0+c2xfaGFuZGxlLFwKKwkJCXN0LT5pMmNfYWRkciwgaW52X2Rt cF9nZXRfYWRkcmVzcyhrZXkpLCBiLCBjKQorI2RlZmluZSBpbnZfaTJjX3JlYWQoc3QsIHJlZywg bGVuLCBkYXRhKSBcCisJaW52X2kyY19yZWFkX2Jhc2Uoc3QsIHN0LT5pMmNfYWRkciwgcmVnLCBs ZW4sIGRhdGEpCisjZGVmaW5lIGludl9pMmNfc2luZ2xlX3dyaXRlKHN0LCByZWcsIGRhdGEpIFwK KwlpbnZfaTJjX3NpbmdsZV93cml0ZV9iYXNlKHN0LCBzdC0+aTJjX2FkZHIsIHJlZywgZGF0YSkK KyNkZWZpbmUgaW52X3NlY29uZGFyeV9yZWFkKHJlZywgbGVuLCBkYXRhKSBcCisJaW52X2kyY19y ZWFkX2Jhc2Uoc3QsIHN0LT5wbGF0X2RhdGEuc2Vjb25kYXJ5X2kyY19hZGRyLCByZWcsIGxlbiwg ZGF0YSkKKyNkZWZpbmUgaW52X3NlY29uZGFyeV93cml0ZShyZWcsIGRhdGEpIFwKKwlpbnZfaTJj X3NpbmdsZV93cml0ZV9iYXNlKHN0LCBzdC0+cGxhdF9kYXRhLnNlY29uZGFyeV9pMmNfYWRkciwg XAorCQlyZWcsIGRhdGEpCisjZW5kaWYgIC8qICNpZm5kZWYgX0lOVl9NUFVfSUlPX0hfICovCisK ZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L21wdTYwNTAvaW52X21wdV9yaW5n LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9tcHU2MDUwL2ludl9tcHVfcmluZy5jCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOGRhNWYKLS0tIC9kZXYvbnVsbAorKysg Yi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9tcHU2MDUwL2ludl9tcHVfcmluZy5jCkBAIC0wLDAg KzEsNTYzIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTIgSW52ZW5zZW5zZSwgSW5jLgorKgor KiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljCisqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVk LCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBk aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiBidXQgV0lU SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT ZWUgdGhlCisqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisq CisqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNp bmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVk ZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4 L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMu aD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+Cisj aW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNp bmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2lu Y2x1ZGUgImludl9tcHVfaWlvLmgiCisjaW5jbHVkZSAiLi4vLi4vaWlvLmgiCisjaW5jbHVkZSAi Li4vLi4va2ZpZm9fYnVmLmgiCisjaW5jbHVkZSAiLi4vLi4vdHJpZ2dlcl9jb25zdW1lci5oIgor I2luY2x1ZGUgIi4uLy4uL3N5c2ZzLmgiCisKK3N0YXRpYyB2b2lkIGludl9zY2FuX3F1ZXJ5KHN0 cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGludl9tcHVfaWlvX3MgICpzdCA9 IGlpb19wcml2KGluZGlvX2Rldik7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmcgPSBpbmRpb19k ZXYtPmJ1ZmZlcjsKKworCWlmIChpaW9fc2Nhbl9tYXNrX3F1ZXJ5KGluZGlvX2RldiwgcmluZywg SU5WX01QVV9TQ0FOX0dZUk9fWCkgfHwKKwkgICAgaWlvX3NjYW5fbWFza19xdWVyeShpbmRpb19k ZXYsIHJpbmcsIElOVl9NUFVfU0NBTl9HWVJPX1kpIHx8CisJICAgIGlpb19zY2FuX21hc2tfcXVl cnkoaW5kaW9fZGV2LCByaW5nLCBJTlZfTVBVX1NDQU5fR1lST19aKSkKKwkJc3QtPmNoaXBfY29u ZmlnLmd5cm9fZmlmb19lbmFibGUgPSAxOworCWVsc2UKKwkJc3QtPmNoaXBfY29uZmlnLmd5cm9f Zmlmb19lbmFibGUgPSAwOworCisJaWYgKGlpb19zY2FuX21hc2tfcXVlcnkoaW5kaW9fZGV2LCBy aW5nLCBJTlZfTVBVX1NDQU5fQUNDTF9YKSB8fAorCSAgICBpaW9fc2Nhbl9tYXNrX3F1ZXJ5KGlu ZGlvX2RldiwgcmluZywgSU5WX01QVV9TQ0FOX0FDQ0xfWSkgfHwKKwkgICAgaWlvX3NjYW5fbWFz a19xdWVyeShpbmRpb19kZXYsIHJpbmcsIElOVl9NUFVfU0NBTl9BQ0NMX1opKQorCQlzdC0+Y2hp cF9jb25maWcuYWNjbF9maWZvX2VuYWJsZSA9IDE7CisJZWxzZQorCQlzdC0+Y2hpcF9jb25maWcu YWNjbF9maWZvX2VuYWJsZSA9IDA7CisKKwlpZiAoaWlvX3NjYW5fbWFza19xdWVyeShpbmRpb19k ZXYsIHJpbmcsIElOVl9NUFVfU0NBTl9NQUdOX1gpIHx8CisJICAgIGlpb19zY2FuX21hc2tfcXVl cnkoaW5kaW9fZGV2LCByaW5nLCBJTlZfTVBVX1NDQU5fTUFHTl9ZKSB8fAorCSAgICBpaW9fc2Nh bl9tYXNrX3F1ZXJ5KGluZGlvX2RldiwgcmluZywgSU5WX01QVV9TQ0FOX01BR05fWikpCisJCXN0 LT5jaGlwX2NvbmZpZy5jb21wYXNzX2ZpZm9fZW5hYmxlID0gMTsKKwllbHNlCisJCXN0LT5jaGlw X2NvbmZpZy5jb21wYXNzX2ZpZm9fZW5hYmxlID0gMDsKK30KKworLyoqCisgKiAgcmVzZXRfZmlm b19pdGcoKSAtIFJlc2V0IEZJRk8gcmVsYXRlZCByZWdpc3RlcnMuCisgKiAgQHN0OglEZXZpY2Ug ZHJpdmVyIGluc3RhbmNlLgorICovCitzdGF0aWMgaW50IHJlc2V0X2ZpZm9faXRnKHN0cnVjdCBp aW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGludl9yZWdfbWFwX3MgKnJlZzsKKwlpbnQg cmVzdWx0OworCXVuc2lnbmVkIGNoYXIgdmFsOworCXN0cnVjdCBpbnZfbXB1X2lpb19zICAqc3Qg PSBpaW9fcHJpdihpbmRpb19kZXYpOworCXJlZyA9ICZzdC0+cmVnOworCisJaW52X3NjYW5fcXVl cnkoaW5kaW9fZGV2KTsKKwkvKiBkaXNhYmxlIGludGVycnVwdCAqLworCXJlc3VsdCA9IGludl9p MmNfc2luZ2xlX3dyaXRlKHN0LCByZWctPmludF9lbmFibGUsIDApOworCWlmIChyZXN1bHQpIHsK KwkJcHJfZXJyKCJpbnRfZW5hYmxlIHdyaXRlIGZhaWxlZFxuIik7CisJCXJldHVybiByZXN1bHQ7 CisJfQorCS8qIGRpc2FibGUgdGhlIHNlbnNvciBvdXRwdXQgdG8gRklGTyAqLworCXJlc3VsdCA9 IGludl9pMmNfc2luZ2xlX3dyaXRlKHN0LCByZWctPmZpZm9fZW4sIDApOworCWlmIChyZXN1bHQp CisJCWdvdG8gcmVzZXRfZmlmb19mYWlsOworCS8qIGRpc2FibGUgZmlmbyByZWFkaW5nICovCisJ cmVzdWx0ID0gaW52X2kyY19zaW5nbGVfd3JpdGUoc3QsIHJlZy0+dXNlcl9jdHJsLCAwKTsKKwlp ZiAocmVzdWx0KQorCQlnb3RvIHJlc2V0X2ZpZm9fZmFpbDsKKworCWlmIChzdC0+Y2hpcF9jb25m aWcuZG1wX29uKSB7CisJCXZhbCA9IChCSVRfRklGT19SU1QgfCBCSVRfRE1QX1JTVCk7CisJCXJl c3VsdCA9IGludl9pMmNfc2luZ2xlX3dyaXRlKHN0LCByZWctPnVzZXJfY3RybCwgdmFsKTsKKwkJ aWYgKHJlc3VsdCkKKwkJCWdvdG8gcmVzZXRfZmlmb19mYWlsOworCQlzdC0+bGFzdF9pc3JfdGlt ZSA9IGlpb19nZXRfdGltZV9ucygpOworCQlpZiAoc3QtPmNoaXBfY29uZmlnLmRtcF9pbnRfb24p IHsKKwkJCXJlc3VsdCA9IGludl9pMmNfc2luZ2xlX3dyaXRlKHN0LCByZWctPmludF9lbmFibGUs CisJCQkJCQkJQklUX0RNUF9JTlRfRU4pOworCQkJaWYgKHJlc3VsdCkKKwkJCQlyZXR1cm4gcmVz dWx0OworCQl9CisJCXZhbCA9IChCSVRfRE1QX0VOIHwgQklUX0ZJRk9fRU4pOworCQlpZiAoc3Qt PmNoaXBfY29uZmlnLmNvbXBhc3NfZW5hYmxlKQorCQkJdmFsIHw9IEJJVF9JMkNfTVNUX0VOOwor CQlyZXN1bHQgPSBpbnZfaTJjX3NpbmdsZV93cml0ZShzdCwgcmVnLT51c2VyX2N0cmwsIHZhbCk7 CisJCWlmIChyZXN1bHQpCisJCQlnb3RvIHJlc2V0X2ZpZm9fZmFpbDsKKwl9IGVsc2UgeworCQkv KiByZXNldCBGSUZPIGFuZCBwb3NzaWJseSByZXNldCBJMkMqLworCQl2YWwgPSBCSVRfRklGT19S U1Q7CisJCXJlc3VsdCA9IGludl9pMmNfc2luZ2xlX3dyaXRlKHN0LCByZWctPnVzZXJfY3RybCwg dmFsKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWdvdG8gcmVzZXRfZmlmb19mYWlsOworCQlzdC0+bGFz dF9pc3JfdGltZSA9IGlpb19nZXRfdGltZV9ucygpOworCQkvKiBlbmFibGUgaW50ZXJydXB0ICov CisJCWlmIChzdC0+Y2hpcF9jb25maWcuYWNjbF9maWZvX2VuYWJsZSB8fAorCQkgICAgc3QtPmNo aXBfY29uZmlnLmd5cm9fZmlmb19lbmFibGUgfHwKKwkJICAgIHN0LT5jaGlwX2NvbmZpZy5jb21w YXNzX2VuYWJsZSkgeworCQkJcmVzdWx0ID0gaW52X2kyY19zaW5nbGVfd3JpdGUoc3QsIHJlZy0+ aW50X2VuYWJsZSwKKwkJCQkJCUJJVF9EQVRBX1JEWV9FTik7CisJCQlpZiAocmVzdWx0KQorCQkJ CXJldHVybiByZXN1bHQ7CisJCX0KKwkJLyogZW5hYmxlIEZJRk8gcmVhZGluZyBhbmQgSTJDIG1h c3RlciBpbnRlcmZhY2UqLworCQl2YWwgPSBCSVRfRklGT19FTjsKKwkJaWYgKHN0LT5jaGlwX2Nv bmZpZy5jb21wYXNzX2VuYWJsZSkKKwkJCXZhbCB8PSBCSVRfSTJDX01TVF9FTjsKKwkJcmVzdWx0 ID0gaW52X2kyY19zaW5nbGVfd3JpdGUoc3QsIHJlZy0+dXNlcl9jdHJsLCB2YWwpOworCQlpZiAo cmVzdWx0KQorCQkJZ290byByZXNldF9maWZvX2ZhaWw7CisJCS8qIGVuYWJsZSBzZW5zb3Igb3V0 cHV0IHRvIEZJRk8gKi8KKwkJdmFsID0gMDsKKwkJaWYgKHN0LT5jaGlwX2NvbmZpZy5neXJvX2Zp Zm9fZW5hYmxlKQorCQkJdmFsIHw9IEJJVFNfR1lST19PVVQ7CisJCWlmIChzdC0+Y2hpcF9jb25m aWcuYWNjbF9maWZvX2VuYWJsZSkKKwkJCXZhbCB8PSBCSVRfQUNDRUxfT1VUOworCQlyZXN1bHQg PSBpbnZfaTJjX3NpbmdsZV93cml0ZShzdCwgcmVnLT5maWZvX2VuLCB2YWwpOworCQlpZiAocmVz dWx0KQorCQkJZ290byByZXNldF9maWZvX2ZhaWw7CisJfQorCXJldHVybiAwOworcmVzZXRfZmlm b19mYWlsOgorCWlmIChzdC0+Y2hpcF9jb25maWcuZG1wX29uKQorCQl2YWwgPSBCSVRfRE1QX0lO VF9FTjsKKwllbHNlCisJCXZhbCA9IEJJVF9EQVRBX1JEWV9FTjsKKwlpbnZfaTJjX3NpbmdsZV93 cml0ZShzdCwgcmVnLT5pbnRfZW5hYmxlLCB2YWwpOworCXByX2VycigicmVzZXQgZmlmbyBmYWls ZWRcbiIpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogIGludl9yZXNldF9maWZvKCkg LSBSZXNldCBGSUZPIHJlbGF0ZWQgcmVnaXN0ZXJzLgorICogIEBzdDoJRGV2aWNlIGRyaXZlciBp bnN0YW5jZS4KKyAqLworc3RhdGljIGludCBpbnZfcmVzZXRfZmlmbyhzdHJ1Y3QgaWlvX2RldiAq aW5kaW9fZGV2KQoreworCXJldHVybiByZXNldF9maWZvX2l0ZyhpbmRpb19kZXYpOworfQorCisv KioKKyAqICBzZXRfaW52X2VuYWJsZSgpIC0gUmVzZXQgRklGTyByZWxhdGVkIHJlZ2lzdGVycy4K KyAqCQkJVGhpcyBhbHNvIHBvd2VycyBvbiB0aGUgY2hpcCBpZiBuZWVkZWQuCisgKiAgQHN0OglE ZXZpY2UgZHJpdmVyIGluc3RhbmNlLgorICogIEBmaWZvX2VuYWJsZTogZW5hYmxlL2Rpc2FibGUK KyAqLworaW50IHNldF9pbnZfZW5hYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQli b29sIGVuYWJsZSkgeworCXN0cnVjdCBpbnZfbXB1X2lpb19zICpzdCA9IGlpb19wcml2KGluZGlv X2Rldik7CisJc3RydWN0IGludl9yZWdfbWFwX3MgKnJlZzsKKwlpbnQgcmVzdWx0OworCisJaWYg KHN0LT5jaGlwX2NvbmZpZy5pc19hc2xlZXApCisJCXJldHVybiAtRUlOVkFMOworCXJlZyA9ICZz dC0+cmVnOworCWlmIChlbmFibGUpIHsKKwkJcmVzdWx0ID0gaW52X3Jlc2V0X2ZpZm8oaW5kaW9f ZGV2KTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJfSBlbHNlIHsKKwkJcmVz dWx0ID0gaW52X2kyY19zaW5nbGVfd3JpdGUoc3QsIHJlZy0+Zmlmb19lbiwgMCk7CisJCWlmIChy ZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCQkvKiBkaXNhYmxlIGZpZm8gcmVhZGluZyAqLwor CQlyZXN1bHQgPSBpbnZfaTJjX3NpbmdsZV93cml0ZShzdCwgcmVnLT5pbnRfZW5hYmxlLCAwKTsK KwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJCXJlc3VsdCA9IGludl9pMmNfc2lu Z2xlX3dyaXRlKHN0LCByZWctPnVzZXJfY3RybCwgMCk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1 cm4gcmVzdWx0OworCX0KKwlzdC0+Y2hpcF9jb25maWcuZW5hYmxlID0gISFlbmFibGU7CisKKwly ZXR1cm4gMDsKK30KKworLyoqCisgKiAgaW52X2NsZWFyX2tmaWZvKCkgLSBjbGVhciB0aW1lIHN0 YW1wIGZpZm8KKyAqICBAc3Q6CURldmljZSBkcml2ZXIgaW5zdGFuY2UuCisgKi8KK3ZvaWQgaW52 X2NsZWFyX2tmaWZvKHN0cnVjdCBpbnZfbXB1X2lpb19zICpzdCkKK3sKKwl1bnNpZ25lZCBsb25n IGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZzdC0+dGltZV9zdGFtcF9sb2NrLCBmbGFncyk7 CisJa2ZpZm9fcmVzZXQoJnN0LT50aW1lc3RhbXBzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZzdC0+dGltZV9zdGFtcF9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogIGludl9pcnFfaGFu ZGxlcigpIC0gQ2FjaGUgYSB0aW1lc3RhbXAgYXQgZWFjaCBkYXRhIHJlYWR5IGludGVycnVwdC4K KyAqLworc3RhdGljIGlycXJldHVybl90IGludl9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpk ZXZfaWQpCit7CisJc3RydWN0IGludl9tcHVfaWlvX3MgKnN0OworCWxvbmcgbG9uZyB0aW1lc3Rh bXA7CisJaW50IGNhdGNoX3VwOworCXVuc2lnbmVkIGludCB0aW1lX3NpbmNlX2xhc3RfaXJxOwor CisJc3QgPSAoc3RydWN0IGludl9tcHVfaWlvX3MgKilkZXZfaWQ7CisJdGltZXN0YW1wID0gaWlv X2dldF90aW1lX25zKCk7CisJdGltZV9zaW5jZV9sYXN0X2lycSA9ICh1bnNpZ25lZCBpbnQpKHRp bWVzdGFtcAorCQktIHN0LT5sYXN0X2lzcl90aW1lKTsKKwlzcGluX2xvY2soJnN0LT50aW1lX3N0 YW1wX2xvY2spOworCWNhdGNoX3VwID0gMDsKKwl3aGlsZSAoKHRpbWVfc2luY2VfbGFzdF9pcnEg PiBzdC0+aXJxX2R1cl9ucyAqIDIpICYmCisJICAgICAgIChjYXRjaF91cCA8IE1BWF9DQVRDSF9V UCkgJiYKKwkgICAgICAgKCFzdC0+Y2hpcF9jb25maWcubHBhX21vZGUpICYmCisJICAgICAgICgh c3QtPmNoaXBfY29uZmlnLmRtcF9vbikpIHsKKwkJc3QtPmxhc3RfaXNyX3RpbWUgKz0gc3QtPmly cV9kdXJfbnM7CisJCWtmaWZvX2luKCZzdC0+dGltZXN0YW1wcywKKwkJCSAmc3QtPmxhc3RfaXNy X3RpbWUsIDEpOworCQl0aW1lX3NpbmNlX2xhc3RfaXJxID0gKCh1bnNpZ25lZCBpbnQpKHRpbWVz dGFtcAorCQkJLSBzdC0+bGFzdF9pc3JfdGltZSkpOworCQljYXRjaF91cCsrOworCX0KKwlrZmlm b19pbigmc3QtPnRpbWVzdGFtcHMsICZ0aW1lc3RhbXAsIDEpOworCXN0LT5sYXN0X2lzcl90aW1l ID0gdGltZXN0YW1wOworCXNwaW5fdW5sb2NrKCZzdC0+dGltZV9zdGFtcF9sb2NrKTsKKworCXJl dHVybiBJUlFfV0FLRV9USFJFQUQ7Cit9CisKK3N0YXRpYyBpbnQgcHV0X3NjYW5fdG9fYnVmKHN0 cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHVuc2lnbmVkIGNoYXIgKmQsCisJCQkJc2hvcnQgKnMs IGludCBzY2FuX2luZGV4LCBpbnQgZF9pbmQpIHsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyA9 IGluZGlvX2Rldi0+YnVmZmVyOworCWludCBzdDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwg MzsgaSsrKSB7CisJCXN0ID0gaWlvX3NjYW5fbWFza19xdWVyeShpbmRpb19kZXYsIHJpbmcsIHNj YW5faW5kZXggKyBpKTsKKwkJaWYgKHN0KSB7CisJCQltZW1jcHkoJmRbZF9pbmRdLCAmc1tpXSwg c2l6ZW9mKHNbaV0pKTsKKwkJCWRfaW5kICs9IHNpemVvZihzW2ldKTsKKwkJfQorCX0KKwlyZXR1 cm4gZF9pbmQ7Cit9CisKK3N0YXRpYyBpbnQgcHV0X3NjYW5fdG9fYnVmX3Eoc3RydWN0IGlpb19k ZXYgKmluZGlvX2RldiwgdW5zaWduZWQgY2hhciAqZCwKKwkJCQlpbnQgKnMsIGludCBzY2FuX2lu ZGV4LCBpbnQgZF9pbmQpIHsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+ YnVmZmVyOworCWludCBzdDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJ CXN0ID0gaWlvX3NjYW5fbWFza19xdWVyeShpbmRpb19kZXYsIHJpbmcsIHNjYW5faW5kZXggKyBp KTsKKwkJaWYgKHN0KSB7CisJCQltZW1jcHkoJmRbZF9pbmRdLCAmc1tpXSwgc2l6ZW9mKHNbaV0p KTsKKwkJCWRfaW5kICs9IHNpemVvZihzW2ldKTsKKwkJfQorCX0KKwlyZXR1cm4gZF9pbmQ7Cit9 CisKK3N0YXRpYyBpbnQgaW52X3JlcG9ydF9neXJvX2FjY2xfY29tcGFzcyhzdHJ1Y3QgaWlvX2Rl diAqaW5kaW9fZGV2LAorCQkJCQl1bnNpZ25lZCBjaGFyICpkYXRhLCBzNjQgdCkKK3sKKwlzdHJ1 Y3QgaW52X21wdV9paW9fcyAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXN0cnVjdCBpaW9f YnVmZmVyICpyaW5nID0gaW5kaW9fZGV2LT5idWZmZXI7CisJc2hvcnQgZ1tUSFJFRV9BWElTXSwg YVtUSFJFRV9BWElTXSwgY1tUSFJFRV9BWElTXTsKKwlpbnQgcVs0XTsKKwlpbnQgcmVzdWx0LCBp bmQsIGRfaW5kOworCXM2NCBidWZbOF07CisJdW5zaWduZWQgaW50IHdvcmQ7CisJdW5zaWduZWQg Y2hhciBkWzhdOworCXVuc2lnbmVkIGNoYXIgKnRtcDsKKwlpbnQgc291cmNlOworCXN0cnVjdCBp bnZfY2hpcF9jb25maWdfcyAqY29uZjsKKworCWNvbmYgPSAmc3QtPmNoaXBfY29uZmlnOworCWlu ZCA9IDA7CisJaWYgKGNvbmYtPnF1YXRlcm5pb25fb24gJiBjb25mLT5kbXBfb24pIHsKKwkJcVsw XSA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopKCZkYXRhW2luZF0pKTsKKwkJcVsxXSA9IGJlMzJf dG9fY3B1cCgoX19iZTMyICopKCZkYXRhW2luZCArIDRdKSk7CisJCXFbMl0gPSBiZTMyX3RvX2Nw dXAoKF9fYmUzMiAqKSgmZGF0YVtpbmQgKyA4XSkpOworCQlxWzNdID0gYmUzMl90b19jcHVwKChf X2JlMzIgKikoJmRhdGFbaW5kICsgMTJdKSk7CisJCWluZCArPSBRVUFURVJOSU9OX0JZVEVTOwor CX0KKwlpZiAoY29uZi0+YWNjbF9maWZvX2VuYWJsZSB8IGNvbmYtPmRtcF9vbikgeworCQlhWzBd ID0gYmUxNl90b19jcHVwKChfX2JlMTYgKikoJmRhdGFbaW5kXSkpOworCQlhWzFdID0gYmUxNl90 b19jcHVwKChfX2JlMTYgKikoJmRhdGFbaW5kICsgMl0pKTsKKwkJYVsyXSA9IGJlMTZfdG9fY3B1 cCgoX19iZTE2ICopKCZkYXRhW2luZCArIDRdKSk7CisKKwkJYVswXSAqPSBzdC0+Y2hpcF9pbmZv Lm11bHRpOworCQlhWzFdICo9IHN0LT5jaGlwX2luZm8ubXVsdGk7CisJCWFbMl0gKj0gc3QtPmNo aXBfaW5mby5tdWx0aTsKKwkJc3QtPnJhd19hY2NlbFswXSA9IGFbMF07CisJCXN0LT5yYXdfYWNj ZWxbMV0gPSBhWzFdOworCQlzdC0+cmF3X2FjY2VsWzJdID0gYVsyXTsKKwkJaW5kICs9IEJZVEVT X1BFUl9TRU5TT1I7CisJfQorCWlmIChjb25mLT5neXJvX2ZpZm9fZW5hYmxlIHwgY29uZi0+ZG1w X29uKSB7CisJCWdbMF0gPSBiZTE2X3RvX2NwdXAoKF9fYmUxNiAqKSgmZGF0YVtpbmRdKSk7CisJ CWdbMV0gPSBiZTE2X3RvX2NwdXAoKF9fYmUxNiAqKSgmZGF0YVtpbmQgKyAyXSkpOworCQlnWzJd ID0gYmUxNl90b19jcHVwKChfX2JlMTYgKikoJmRhdGFbaW5kICsgNF0pKTsKKworCQlzdC0+cmF3 X2d5cm9bMF0gPSBnWzBdOworCQlzdC0+cmF3X2d5cm9bMV0gPSBnWzFdOworCQlzdC0+cmF3X2d5 cm9bMl0gPSBnWzJdOworCQlpbmQgKz0gQllURVNfUEVSX1NFTlNPUjsKKwl9CisJaWYgKGNvbmYt PmRtcF9vbikgeworCQl3b3JkID0gKHVuc2lnbmVkIGludCkoYmUzMl90b19jcHVwKCh1bnNpZ25l ZCBpbnQgKikmZGF0YVtpbmRdKSk7CisJCXNvdXJjZSA9ICgod29yZCA+PiAxNikgJiAweGZmKTsK KwkJaWYgKHNvdXJjZSkgeworCQkJc3QtPnRhcF9kYXRhID0gKERNUF9NQVNLX1RBUCAmICh3b3Jk ICYgMHhmZikpOworCQkJc3QtPm9yaWVudF9kYXRhID0gKCh3b3JkID4+IDgpICYgMHhmZik7CisJ CQlzdC0+ZGlzcGxheV9vcmllbnRfZGF0YSA9CisJCQkoKERNUF9NQVNLX0RJU19PUklFTiAmICh3 b3JkICYgMHhmZikpID4+CisJCQkgIERNUF9ESVNfT1JJRU5fU0hJRlQpOworCQl9CisKKwkJLyog cmVwb3J0IHRhcCBpbmZvcm1hdGlvbiAqLworCQlpZiAoc291cmNlICYgSU5UX1NSQ19UQVApCisJ CQlzeXNmc19ub3RpZnkoJmluZGlvX2Rldi0+ZGV2LmtvYmosIE5VTEwsICJldmVudF90YXAiKTsK KwkJLyogcmVwb3J0IG9yaWVudGF0aW9uIGluZm9ybWF0aW9uICovCisJCWlmIChzb3VyY2UgJiBJ TlRfU1JDX09SSUVOVCkKKwkJCXN5c2ZzX25vdGlmeSgmaW5kaW9fZGV2LT5kZXYua29iaiwgTlVM TCwKKwkJCQkgICAgICJldmVudF9vcmllbnRhdGlvbiIpOworCQkvKiByZXBvcnQgb3JpZW50YXRp b24gaW5mb3JtYXRpb24gKi8KKwkJaWYgKHNvdXJjZSAmIElOVF9TUkNfRElTUExBWV9PUklFTlQp CisJCQlzeXNmc19ub3RpZnkoJmluZGlvX2Rldi0+ZGV2LmtvYmosIE5VTEwsCisJCQkJICAgICAi ZXZlbnRfZGlzcGxheV9vcmllbnRhdGlvbiIpOworCX0KKwkvKmRpdmlkZXIgYW5kIGNvdW50ZXIg aXMgdXNlZCB0byBkZWNyZWFzZSB0aGUgc3BlZWQgb2YgcmVhZCBpbgorCQloaWdoIGZyZXF1ZW5j eSBzYW1wbGUgcmF0ZSovCisJaWYgKGNvbmYtPmNvbXBhc3NfZmlmb19lbmFibGUpIHsKKwkJY1sw XSA9IDA7CisJCWNbMV0gPSAwOworCQljWzJdID0gMDsKKwkJaWYgKHN0LT5jb21wYXNzX2Rpdmlk ZXIgPT0gc3QtPmNvbXBhc3NfY291bnRlcikgeworCQkJLypyZWFkIGZyb20gZXh0ZXJuYWwgc2Vu c29yIGRhdGEgcmVnaXN0ZXIgKi8KKwkJCXJlc3VsdCA9IGludl9pMmNfcmVhZChzdCwgUkVHX0VY VF9TRU5TX0RBVEFfMDAsCisJCQkJCSAgICAgIE5VTV9CWVRFU19DT01QQVNTX1NMQVZFLCBkKTsK KwkJCS8qIGRbN10gaXMgc3RhdHVzIDIgcmVnaXN0ZXIgKi8KKwkJCS8qZm9yIEFLTTg5NzUsIGJp dCAyIGFuZCAzIHNob3VsZCBiZSBhbGwgYmUgemVybyovCisJCQkvKiBmb3IgQU1LODk2MywgYml0 IDMgc2hvdWxkIGJlIHplcm8qLworCQkJaWYgKChEQVRBX0FLTV9EUkRZID09IGRbMF0pICYmCisJ CQkgICAgKDAgPT0gKGRbN10gJiBEQVRBX0FLTV9TVEFUX01BU0spKSAmJgorCQkJICAgICghcmVz dWx0KSkgeworCQkJCXVuc2lnbmVkIGNoYXIgKnNlbnM7CisJCQkJc2VucyA9IHN0LT5jaGlwX2lu Zm8uY29tcGFzc19zZW5zOworCQkJCWNbMF0gPSAoc2hvcnQpKChkWzJdIDw8IDgpIHwgZFsxXSk7 CisJCQkJY1sxXSA9IChzaG9ydCkoKGRbNF0gPDwgOCkgfCBkWzNdKTsKKwkJCQljWzJdID0gKHNo b3J0KSgoZFs2XSA8PCA4KSB8IGRbNV0pOworCQkJCWNbMF0gPSAoc2hvcnQpKCgoaW50KWNbMF0g KgorCQkJCQkgICAgICAgKHNlbnNbMF0gKyAxMjgpKSA+PiA4KTsKKwkJCQljWzFdID0gKHNob3J0 KSgoKGludCljWzFdICoKKwkJCQkJICAgICAgIChzZW5zWzFdICsgMTI4KSkgPj4gOCk7CisJCQkJ Y1syXSA9IChzaG9ydCkoKChpbnQpY1syXSAqCisJCQkJCSAgICAgICAoc2Vuc1syXSArIDEyOCkp ID4+IDgpOworCQkJCXN0LT5yYXdfY29tcGFzc1swXSA9IGNbMF07CisJCQkJc3QtPnJhd19jb21w YXNzWzFdID0gY1sxXTsKKwkJCQlzdC0+cmF3X2NvbXBhc3NbMl0gPSBjWzJdOworCQkJfQorCQkJ c3QtPmNvbXBhc3NfY291bnRlciA9IDA7CisJCX0gZWxzZSBpZiAoc3QtPmNvbXBhc3NfZGl2aWRl ciAhPSAwKSB7CisJCQlzdC0+Y29tcGFzc19jb3VudGVyKys7CisJCX0KKwl9CisKKwl0bXAgPSAo dW5zaWduZWQgY2hhciAqKWJ1ZjsKKwlkX2luZCA9IDA7CisJaWYgKGNvbmYtPnF1YXRlcm5pb25f b24gJiBjb25mLT5kbXBfb24pCisJCWRfaW5kID0gcHV0X3NjYW5fdG9fYnVmX3EoaW5kaW9fZGV2 LCB0bXAsIHEsCisJCQkJSU5WX01QVV9TQ0FOX1FVQVRfUiwgZF9pbmQpOworCWlmIChjb25mLT5n eXJvX2ZpZm9fZW5hYmxlKQorCQlkX2luZCA9IHB1dF9zY2FuX3RvX2J1ZihpbmRpb19kZXYsIHRt cCwgZywKKwkJCQlJTlZfTVBVX1NDQU5fR1lST19YLCBkX2luZCk7CisJaWYgKGNvbmYtPmFjY2xf Zmlmb19lbmFibGUpCisJCWRfaW5kID0gcHV0X3NjYW5fdG9fYnVmKGluZGlvX2RldiwgdG1wLCBh LAorCQkJCUlOVl9NUFVfU0NBTl9BQ0NMX1gsIGRfaW5kKTsKKwlpZiAoY29uZi0+Y29tcGFzc19m aWZvX2VuYWJsZSkKKwkJZF9pbmQgPSBwdXRfc2Nhbl90b19idWYoaW5kaW9fZGV2LCB0bXAsIGMs CisJCQkJSU5WX01QVV9TQ0FOX01BR05fWCwgZF9pbmQpOworCWlmIChyaW5nLT5zY2FuX3RpbWVz dGFtcCkKKwkJYnVmWyhkX2luZCArIDcpIC8gOF0gPSB0OworCXJpbmctPmFjY2Vzcy0+c3RvcmVf dG8oaW5kaW9fZGV2LT5idWZmZXIsICh1OCAqKWJ1ZiwgdCk7CisKKwlyZXR1cm4gMDsKK30KKwor LyoqCisgKiAgaW52X3JlYWRfZmlmbygpIC0gVHJhbnNmZXIgZGF0YSBmcm9tIEZJRk8gdG8gcmlu ZyBidWZmZXIuCisgKi8KK2lycXJldHVybl90IGludl9yZWFkX2ZpZm8oaW50IGlycSwgdm9pZCAq ZGV2X2lkKQoreworCisJc3RydWN0IGludl9tcHVfaWlvX3MgKnN0ID0gKHN0cnVjdCBpbnZfbXB1 X2lpb19zICopZGV2X2lkOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpaW9fcHJpdl90 b19kZXYoc3QpOworCXNpemVfdCBieXRlc19wZXJfZGF0dW07CisJaW50IHJlc3VsdDsKKwl1bnNp Z25lZCBjaGFyIGRhdGFbQllURVNfRk9SX0RNUCArIFFVQVRFUk5JT05fQllURVNdOworCXVuc2ln bmVkIHNob3J0IGZpZm9fY291bnQ7CisJdW5zaWduZWQgaW50IGNvcGllZDsKKwlzNjQgdGltZXN0 YW1wOworCXN0cnVjdCBpbnZfcmVnX21hcF9zICpyZWc7CisJczY0IGJ1Zls4XTsKKwl1bnNpZ25l ZCBjaGFyICp0bXA7CisJcmVnID0gJnN0LT5yZWc7CisJaWYgKCEoc3QtPmNoaXBfY29uZmlnLmFj Y2xfZmlmb19lbmFibGUgfAorCQlzdC0+Y2hpcF9jb25maWcuZ3lyb19maWZvX2VuYWJsZSB8CisJ CXN0LT5jaGlwX2NvbmZpZy5kbXBfb24gfAorCQlzdC0+Y2hpcF9jb25maWcuY29tcGFzc19maWZv X2VuYWJsZSkpCisJCWdvdG8gZW5kX3Nlc3Npb247CisJaWYgKHN0LT5jaGlwX2NvbmZpZy5kbXBf b24gJiYgc3QtPmNoaXBfY29uZmlnLmZsaWNrX2ludF9vbikgeworCQkvKmRtcCBpbnRlcnJ1cHQg c3RhdHVzICovCisJCWludl9pMmNfcmVhZChzdCwgUkVHX0RNUF9JTlRfU1RBVFVTLCAxLCBkYXRh KTsKKwkJaWYgKGRhdGFbMF0gJiBGTElDS19JTlRfU1RBVFVTKQorCQkJc3lzZnNfbm90aWZ5KCZp bmRpb19kZXYtPmRldi5rb2JqLCBOVUxMLCAiZXZlbnRfZmxpY2siKTsKKwl9CisJaWYgKHN0LT5j aGlwX2NvbmZpZy5scGFfbW9kZSkgeworCQlyZXN1bHQgPSBpbnZfaTJjX3JlYWQoc3QsIHJlZy0+ cmF3X2FjY2wsCisJCQkJICAgICAgQllURVNfUEVSX1NFTlNPUiwgZGF0YSk7CisJCWlmIChyZXN1 bHQpCisJCQlnb3RvIGVuZF9zZXNzaW9uOworCQlpbnZfcmVwb3J0X2d5cm9fYWNjbF9jb21wYXNz KGluZGlvX2RldiwgZGF0YSwKKwkJCQkJICAgICBpaW9fZ2V0X3RpbWVfbnMoKSk7CisJCWdvdG8g ZW5kX3Nlc3Npb247CisJfQorCisJaWYgKHN0LT5jaGlwX2NvbmZpZy5kbXBfb24pCisJCWlmIChz dC0+Y2hpcF9jb25maWcucXVhdGVybmlvbl9vbikKKwkJCWJ5dGVzX3Blcl9kYXR1bSA9IEJZVEVT X0ZPUl9ETVAgKyBRVUFURVJOSU9OX0JZVEVTOworCQllbHNlCisJCQlieXRlc19wZXJfZGF0dW0g PSBCWVRFU19GT1JfRE1QOworCWVsc2UKKwkJYnl0ZXNfcGVyX2RhdHVtID0gKHN0LT5jaGlwX2Nv bmZpZy5hY2NsX2ZpZm9fZW5hYmxlICsKKwkJc3QtPmNoaXBfY29uZmlnLmd5cm9fZmlmb19lbmFi bGUpKkJZVEVTX1BFUl9TRU5TT1I7CisJZmlmb19jb3VudCA9IDA7CisJaWYgKGJ5dGVzX3Blcl9k YXR1bSAhPSAwKSB7CisJCXJlc3VsdCA9IGludl9pMmNfcmVhZChzdCwgcmVnLT5maWZvX2NvdW50 X2gsCisJCQkJRklGT19DT1VOVF9CWVRFLCBkYXRhKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWdvdG8g ZW5kX3Nlc3Npb247CisJCWZpZm9fY291bnQgPSBiZTE2X3RvX2NwdXAoKF9fYmUxNiAqKSgmZGF0 YVswXSkpOworCQlpZiAoZmlmb19jb3VudCA8IGJ5dGVzX3Blcl9kYXR1bSkKKwkJCWdvdG8gZW5k X3Nlc3Npb247CisJCS8qIGZpZm8gY291bnQgY2FuJ3QgYmUgb2RkIG51bWJlciAqLworCQlpZiAo Zmlmb19jb3VudCAmIDEpCisJCQlnb3RvIGZsdXNoX2ZpZm87CisJCWlmIChmaWZvX2NvdW50ID4g IEZJRk9fVEhSRVNIT0xEKQorCQkJZ290byBmbHVzaF9maWZvOworCQkvKiBUaW1lc3RhbXAgbWlz bWF0Y2guICovCisJCWlmIChrZmlmb19sZW4oJnN0LT50aW1lc3RhbXBzKSA8CisJCQlmaWZvX2Nv dW50IC8gYnl0ZXNfcGVyX2RhdHVtKQorCQkJZ290byBmbHVzaF9maWZvOworCQlpZiAoa2ZpZm9f bGVuKCZzdC0+dGltZXN0YW1wcykgPgorCQkJZmlmb19jb3VudCAvIGJ5dGVzX3Blcl9kYXR1bSAr IFRJTUVfU1RBTVBfVE9SKSB7CisJCQlpZiAoc3QtPmNoaXBfY29uZmlnLmRtcF9vbikgeworCQkJ CXJlc3VsdCA9IGtmaWZvX3RvX3VzZXIoJnN0LT50aW1lc3RhbXBzLAorCQkJCSZ0aW1lc3RhbXAs IHNpemVvZih0aW1lc3RhbXApLCAmY29waWVkKTsKKwkJCQlpZiAocmVzdWx0KQorCQkJCQlnb3Rv IGZsdXNoX2ZpZm87CisJCQl9IGVsc2UgeworCQkJCWdvdG8gZmx1c2hfZmlmbzsKKwkJCX0KKwkJ fQorCX0gZWxzZSB7CisJCXJlc3VsdCA9IGtmaWZvX3RvX3VzZXIoJnN0LT50aW1lc3RhbXBzLAor CQkJJnRpbWVzdGFtcCwgc2l6ZW9mKHRpbWVzdGFtcCksICZjb3BpZWQpOworCQlpZiAocmVzdWx0 KQorCQkJZ290byBmbHVzaF9maWZvOworCX0KKwl0bXAgPSAoY2hhciAqKWJ1ZjsKKwl3aGlsZSAo KGJ5dGVzX3Blcl9kYXR1bSAhPSAwKSAmJiAoZmlmb19jb3VudCA+PSBieXRlc19wZXJfZGF0dW0p KSB7CisJCXJlc3VsdCA9IGludl9pMmNfcmVhZChzdCwgcmVnLT5maWZvX3JfdywgYnl0ZXNfcGVy X2RhdHVtLAorCQkJZGF0YSk7CisJCWlmIChyZXN1bHQpCisJCQlnb3RvIGZsdXNoX2ZpZm87CisK KwkJcmVzdWx0ID0ga2ZpZm9fdG9fdXNlcigmc3QtPnRpbWVzdGFtcHMsCisJCQkmdGltZXN0YW1w LCBzaXplb2YodGltZXN0YW1wKSwgJmNvcGllZCk7CisJCWlmIChyZXN1bHQpCisJCQlnb3RvIGZs dXNoX2ZpZm87CisJCWludl9yZXBvcnRfZ3lyb19hY2NsX2NvbXBhc3MoaW5kaW9fZGV2LCBkYXRh LCB0aW1lc3RhbXApOworCQlmaWZvX2NvdW50IC09IGJ5dGVzX3Blcl9kYXR1bTsKKwl9CisJaWYg KGJ5dGVzX3Blcl9kYXR1bSA9PSAwKQorCQlpbnZfcmVwb3J0X2d5cm9fYWNjbF9jb21wYXNzKGlu ZGlvX2RldiwgZGF0YSwgdGltZXN0YW1wKTsKK2VuZF9zZXNzaW9uOgorCXJldHVybiBJUlFfSEFO RExFRDsKK2ZsdXNoX2ZpZm86CisJLyogRmx1c2ggSFcgYW5kIFNXIEZJRk9zLiAqLworCWludl9y ZXNldF9maWZvKGluZGlvX2Rldik7CisJaW52X2NsZWFyX2tmaWZvKHN0KTsKKwlyZXR1cm4gSVJR X0hBTkRMRUQ7Cit9CisKK3ZvaWQgaW52X21wdV91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9f ZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGludl9tcHVfaWlvX3MgKnN0ID0gaWlvX3ByaXYo aW5kaW9fZGV2KTsKKwlmcmVlX2lycShzdC0+Y2xpZW50LT5pcnEsIHN0KTsKKwlpaW9fa2ZpZm9f ZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7Cit9OworCitpbnQgaW52X3Bvc3RlbmFibGUoc3RydWN0 IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gc2V0X2ludl9lbmFibGUoaW5kaW9fZGV2 LCB0cnVlKTsKKworfQorCitpbnQgaW52X3ByZWRpc2FibGUoc3RydWN0IGlpb19kZXYgKmluZGlv X2RldikKK3sKKwlyZXR1cm4gc2V0X2ludl9lbmFibGUoaW5kaW9fZGV2LCBmYWxzZSk7Cit9CisK K3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgaW52X21wdV9yaW5nX3Nl dHVwX29wcyA9IHsKKwkucHJlZW5hYmxlID0gJmlpb19zd19idWZmZXJfcHJlZW5hYmxlLAorCS5w b3N0ZW5hYmxlID0gJmludl9wb3N0ZW5hYmxlLAorCS5wcmVkaXNhYmxlID0gJmludl9wcmVkaXNh YmxlLAorfTsKKworaW50IGludl9tcHVfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmlu ZGlvX2RldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpbnZfbXB1X2lpb19zICpzdCA9IGlpb19w cml2KGluZGlvX2Rldik7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmc7CisKKwlyaW5nID0gaWlv X2tmaWZvX2FsbG9jYXRlKGluZGlvX2Rldik7CisJaWYgKCFyaW5nKQorCQlyZXR1cm4gLUVOT01F TTsKKwlpbmRpb19kZXYtPmJ1ZmZlciA9IHJpbmc7CisJLyogc2V0dXAgcmluZyBidWZmZXIgKi8K KwlyaW5nLT5zY2FuX3RpbWVzdGFtcCA9IHRydWU7CisJaW5kaW9fZGV2LT5zZXR1cF9vcHMgPSAm aW52X21wdV9yaW5nX3NldHVwX29wczsKKwkvKnNjYW4gY291bnQgZG91YmxlIGNvdW50IHRpbWVz dGFtcC4gc2hvdWxkIHN1YnRyYWN0IDEuIGJ1dAorCW51bWJlciBvZiBjaGFubmVscyBzdGlsbCBp bmNsdWRlcyB0aW1lc3RhbXAqLworCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHN0LT5jbGll bnQtPmlycSwgaW52X2lycV9oYW5kbGVyLAorCQkJCSAgIGludl9yZWFkX2ZpZm8sCisJCQkJICAg SVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfU0hBUkVELAorCQkJCSAgICJpbnZfaXJxIiwgc3Qp OworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfaWlvX3N3X3JiX2ZyZWU7CisKKwlyZXR1cm4gMDsK K2Vycm9yX2lpb19zd19yYl9mcmVlOgorCWlpb19rZmlmb19mcmVlKGluZGlvX2Rldi0+YnVmZmVy KTsKKwlyZXR1cm4gcmV0OworfQorLyoqCisgKiAgQH0KKyAqLworCmRpZmYgLS1naXQgYS9kcml2 ZXJzL3N0YWdpbmcvaWlvL2ltdS9tcHU2MDUwL21wdS5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9p bXUvbXB1NjA1MC9tcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTA1 ZmIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvbXB1NjA1MC9t cHUuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDEyIEludmVuc2Vu c2UsIEluYy4KKyoKKyogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlz aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiBtYXkgYmUgY29waWVk LCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKgorKiBUaGlz IHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1 bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg d2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFLiAgU2VlIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y ZSBkZXRhaWxzLgorKgorKi8KKworLyoqCisgKiAgQGFkZHRvZ3JvdXAgIERSSVZFUlMKKyAqICBA YnJpZWYgICAgICAgSGFyZHdhcmUgZHJpdmVycy4KKyAqCisgKiAgQHsKKyAqICAgICAgQGZpbGUg ICAgbXB1LmgKKyAqICAgICAgQGJyaWVmICAgbXB1IGRlZmluaXRpb24KKyAqLworCisjaWZuZGVm IF9fTVBVX0hfCisjZGVmaW5lIF9fTVBVX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVk ZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2VuZGlmCisKK2Vu dW0gc2Vjb25kYXJ5X3NsYXZlX3R5cGUgeworCVNFQ09OREFSWV9TTEFWRV9UWVBFX05PTkUsCisJ U0VDT05EQVJZX1NMQVZFX1RZUEVfQUNDRUwsCisJU0VDT05EQVJZX1NMQVZFX1RZUEVfQ09NUEFT UywKKwlTRUNPTkRBUllfU0xBVkVfVFlQRV9QUkVTU1VSRSwKKworCVNFQ09OREFSWV9TTEFWRV9U WVBFX1RZUEVTCit9OworCitlbnVtIGV4dF9zbGF2ZV9pZCB7CisJSURfSU5WQUxJRCA9IDAsCisJ R1lST19JRF9NUFUzMDUwLAorCUdZUk9fSURfTVBVNjA1MEEyLAorCUdZUk9fSURfTVBVNjA1MEIx LAorCUdZUk9fSURfTVBVNjA1MEIxX05PX0FDQ0VMLAorCUdZUk9fSURfSVRHMzUwMCwKKworCUFD Q0VMX0lEX0xJUzMzMSwKKwlBQ0NFTF9JRF9MU00zMDNETFgsCisJQUNDRUxfSURfTElTM0RILAor CUFDQ0VMX0lEX0tYU0Q5LAorCUFDQ0VMX0lEX0tYVEY5LAorCUFDQ0VMX0lEX0JNQTE1MCwKKwlB Q0NFTF9JRF9CTUEyMjIsCisJQUNDRUxfSURfQk1BMjUwLAorCUFDQ0VMX0lEX0FEWEwzNFgsCisJ QUNDRUxfSURfTU1BODQ1MCwKKwlBQ0NFTF9JRF9NTUE4NDVYLAorCUFDQ0VMX0lEX01QVTYwNTAs CisKKwlDT01QQVNTX0lEX0FLODk2MywKKwlDT01QQVNTX0lEX0FLODk3NSwKKwlDT01QQVNTX0lE X0FLODk3MiwKKwlDT01QQVNTX0lEX0FNSTMwWCwKKwlDT01QQVNTX0lEX0FNSTMwNiwKKwlDT01Q QVNTX0lEX1lBUzUyOSwKKwlDT01QQVNTX0lEX1lBUzUzMCwKKwlDT01QQVNTX0lEX0hNQzU4ODMs CisJQ09NUEFTU19JRF9MU00zMDNETEgsCisJQ09NUEFTU19JRF9MU00zMDNETE0sCisJQ09NUEFT U19JRF9NTUMzMTRYLAorCUNPTVBBU1NfSURfSFNDRFREMDAyQiwKKwlDT01QQVNTX0lEX0hTQ0RU RDAwNEEsCisKKwlQUkVTU1VSRV9JRF9CTUEwODUsCit9OworCisjZGVmaW5lIElOVl9QUk9EX0tF WSh2ZXIsIHJldikgKHZlciAqIDEwMCArIHJldikKKy8qKgorICogc3RydWN0IG1wdV9wbGF0Zm9y bV9kYXRhIC0gUGxhdGZvcm0gZGF0YSBmb3IgdGhlIG1wdSBkcml2ZXIKKyAqIEBpbnRfY29uZmln OgkJQml0cyBbNzozXSBvZiB0aGUgaW50IGNvbmZpZyByZWdpc3Rlci4KKyAqIEBsZXZlbF9zaGlm dGVyOgkwOiBWTG9naWMsIDE6IFZERAorICogQG9yaWVudGF0aW9uOglPcmllbnRhdGlvbiBtYXRy aXggb2YgdGhlIGd5cm9zY29wZQorICogQHNlY19zbGF2ZV90eXBlOiAgICAgc2Vjb25kYXJ5IHNs YXZlIGRldmljZSB0eXBlLCBjYW4gYmUgY29tcGFzcywgYWNjZWwsIGV0YworICogQHNlY19zbGF2 ZV9pZDogICAgICAgaWQgb2YgdGhlIHNlY29uZGFyeSBzbGF2ZSBkZXZpY2UKKyAqIEBzZWNvbmRh cnlfaTJjX2FkZHJlc3M6IHNlY29uZGFyeSBkZXZpY2UncyBpMmMgYWRkcmVzcworICogQHNlY29u ZGFyeV9vcmllbnRhdGlvbjogc2Vjb25kYXJ5IGRldmljZSdzIG9yaWVudGF0aW9uIG1hdHJpeAor ICoKKyAqIENvbnRhaW5zIHBsYXRmb3JtIHNwZWNpZmljIGluZm9ybWF0aW9uIG9uIGhvdyB0byBj b25maWd1cmUgdGhlIE1QVTMwNTAgdG8KKyAqIHdvcmsgb24gdGhpcyBwbGF0Zm9ybS4gIFRoZSBv cmllbnRhdGlvbiBtYXRyaWNpZXMgYXJlIDN4MyByb3RhdGlvbiBtYXRyaWNpZXMKKyAqIHRoYXQg YXJlIGFwcGxpZWQgdG8gdGhlIGRhdGEgdG8gcm90YXRlIGZyb20gdGhlIG1vdW50aW5nIG9yaWVu dGF0aW9uIHRvIHRoZQorICogcGxhdGZvcm0gb3JpZW50YXRpb24uICBUaGUgdmFsdWVzIG11c3Qg YmUgb25lIG9mIDAsIDEsIG9yIC0xIGFuZCBlYWNoIHJvdyBhbmQKKyAqIGNvbHVtbiBzaG91bGQg aGF2ZSBleGFjdGx5IDEgbm9uLXplcm8gdmFsdWUuCisgKi8KK3N0cnVjdCBtcHVfcGxhdGZvcm1f ZGF0YSB7CisJX191OCBpbnRfY29uZmlnOworCV9fdTggbGV2ZWxfc2hpZnRlcjsKKwlfX3M4IG9y aWVudGF0aW9uWzldOworCWVudW0gc2Vjb25kYXJ5X3NsYXZlX3R5cGUgc2VjX3NsYXZlX3R5cGU7 CisJZW51bSBleHRfc2xhdmVfaWQgc2VjX3NsYXZlX2lkOworCV9fdTE2IHNlY29uZGFyeV9pMmNf YWRkcjsKKwlfX3M4IHNlY29uZGFyeV9vcmllbnRhdGlvbls5XTsKKwlfX3U4IGtleVsxNl07Cit9 OworCisjZW5kaWYJLyogX19NUFVfSF8gKi8KLS0gCjEuNy4wLjQKCg== --f46d04428cc8c604a304c38c8669-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from saturn.retrosnub.co.uk ([178.18.118.26]:57195 "EHLO saturn.retrosnub.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754003Ab2GFJSy (ORCPT ); Fri, 6 Jul 2012 05:18:54 -0400 Message-ID: <4FF6AAD1.2010304@kernel.org> Date: Fri, 06 Jul 2012 10:07:29 +0100 From: Jonathan Cameron MIME-Version: 1.0 To: Ge Gao CC: linux-iio@vger.kernel.org Subject: Re: [PATCH 1/4] IIO: Invensense MPU6050/MPU9150 driver submit References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Sender: linux-iio-owner@vger.kernel.org List-Id: linux-iio@vger.kernel.org Hi Ge, Please don't get disheartened by this partial review. Getting use to approaches to getting kernel drivers merged can take a considerable time. It's not a trivial thing to do even with a 'perfect' driver. There is a lot of nice / interesting stuff in your driver so I look forward to seeing it move forward! I doubt we'll get any more complex hardware anytime soon! Couple of major comments. 1) This first patch could benefit from breaking up futher. Right now it's too big and cumbersome to review remotely quickly. First separate off the docs into their own patch. Then I'd pull out the DMP code into a follow up patch. That way we can get the core stuff sorted relatively quickly before it gets to complex. Actually the best way to get this in would be to strip nearly everything back so just have your basic data flow through the fifo. No events or motion processing or anything unusual in the first patch. Then we can review that very quickly and get something in place to make incremental extensions to. All in all it is too big to get reviewed. Sorry, but patches really need to be inline emails if you want to have a reasonable chance of getting eyes on them. There are a number of people on the mailing list who will take a look at new drivers when they have a few minutes spare. This first file has taken me over 2 hours to review and what I have done is far from thorough. Anyhow some comments in line. Mostly the code looks pretty clean and there are some good docs which always helps. 2) I may not have made it clear enough before, but you are pretty much not going to succeeed in having your own versions of drivers that already exist. That sort of code replication gets a lot of friction upstream. What you need to do is to write a i2c master driver and then attach your secondary devices to this. Where you need additional features in those drivers, propose them and if they are not too invasive I doubt anyone will mind. Although you only have a couple of slave devices here, seeing your table of id's shows there will be a lot more to come. If there is an absolute reason why this approach won't work, you need to convince people with a careful brief arguement 'before' this goes anywhere. Anyhow Ge good luck with this one. I might get a chance to take a look at the other patches, but it'll be a while give their size. Sorry, but the short easy to review ones tend to get attended to first! Jonathan From 6d4093a59d77a68d4972f648ea9eba69e8598159 Mon Sep 17 00:00:00 2001 From: Ge Gao Date: Thu, 28 Jun 2012 10:58:12 -0700 Subject: [PATCH 1/4] Invensense MPU6050/MPU9150 driver. --MPU6050/MPU9150 driver. --Secondary bus for AKM8975/AKM8963/AKM8972 support. --kernel fix for Kfifo poll support from Jonanthan. --Kfifo bug fix. Need to check available space before store. --add new IIO type for quaternion. ... index 0000000..c4fa2c2 --- /dev/null +++ b/drivers/staging/iio/imu/mpu6050/Kconfig @@ -0,0 +1,6 @@ +# +# inv-mpu-6050 drivers for Invensense MPU devices and combos +# + +config INV_MPU6050_IIO + tristate "Invensense MPU6050 devices" Will need to drop the !INV_MPU bit from the patch (and put it back in your local tree). + depends on I2C && SYSFS && IIO && IIO_KFIFO_BUF && !INV_MPU && !INV_MPU_IIO + default n + help + This driver supports the Invensense MPU6050/MPU9150 devices. It also + supports AKM8975/AKM8963/AKM8972 in the secondary bus. Ideally you want to build this text up as stuff is added (guessing not all of this is in the initial patch!) + This driver can be built as a module. The module will be called + inv-mpu6050-iio. Not keen on the naming, inv-mpu6050 then if you need to change it for your local tree do it in a patch there. ... diff --git a/drivers/staging/iio/imu/mpu6050/README b/drivers/staging/iio/imu/mpu6050/README new file mode 100644 index 0000000..806a956 --- /dev/null +++ b/drivers/staging/iio/imu/mpu6050/README @@ -0,0 +1,11 @@ +Kernel driver inv-mpu-iio +Author: Invensense + +Description +----------- +This document describes how to install the Invensense device driver into a +Linux kernel. At the moment, this driver supports the +MPU6050/MPU9150. The slave address of these four chips are +0x68 or 0x69. However, the actual slave address depends on the board +configuration. The driver does not assume anything about it. + I would have prefered the documentation in a separate patch. Also, lots of this needs 'adjusting' to take into account that the driver will be in the main tree. +Files included in this package: +Kconfig +Makefile +inv_mpu_core.c +inv_mpu_misc.c +inv_mpu_iio.h +inv_mpu_ring.c +dmpDefaultMPU6050.c +dmpkey.h +dmpmap.h +mpu.h +Including the driver in the Linux kernel +---------------------------------------- +mpu.h should be added to "kernel/include/linux". +Other files listed should be added to the drivers/staging/iio/imu/mpu +directory (or another directory of your choosing). When building the +kernel, the driver will not appear in menuconfig without modifications +similar to those below: + +modify "drivers/staging/iio/imu/Kconfig" like +source "drivers/staging/iio/imu/mpu/Kconfig" + +modify "drivers/staging/iio/imu/Makefile" +obj-y += mpu/ + +Board and Platform Data +----------------------- +The board file needs to be modified to register the device on an I2C bus. An +i2c_board_info instance must be defined as seen below. The hardcoded value of +140 corresponds to the GPIO input pin wired to the device's interrupt pin. +This pin will most likely be different for your platform. +platform data is for orientation matrix, and secondary bus situations. +For MPU9150, it is regarded as a MPU9150 and AKM8975 in the secondary. +So the secondary i2c address must be filled. +----------------------------------------------------------------- +The board file is arch/arm/mach-omap2/board-omap4panda.c for panda board or +modify the board file in your system as below: +-------------------------------------------------------- good examples for the platform data. I'm not sure I'd spend as much time talking about how to register it for a given board. That stuff is pretty standard. +For AKM8963 in the secondary i2c bus of MPU6050, +static struct mpu_platform_data gyro_platform_data = { + .int_config = 0x10, + .level_shifter = 0, + .orientation = { -1, 0, 0, + 0, 1, 0, + 0, 0, -1 }, + .sec_slave_type = SECONDARY_SLAVE_TYPE_COMPASS, + .sec_slave_id = COMPASS_ID_AK8963, + .secondary_i2c_addr = 0x0E +}; ... + +IIO subsystem +---------------------------------------------- +successful installation will create two directories under /sys/bus/iio/devices +iio:device0 +trigger0 +Under /dev/ diretory, a file "iio:device0" will also be created(or iio:deviceX, if +you have more than one iio devices). This stuff is all good, but ideally it would go in a more generic document where it isn't already covered. That way we don't have to edit more than one if anything changes! +Communicating with the driver in userspace +------------------------------------------ +Upon installation, the driver generates several files in sysfs. If your +platform is configured as detailed above, navigate to the following path to +find these files: +/sys/bus/iio/devices/iio:device0 + +The list below provides a brief description for each file. +-------------------------------------- Firstly these need documenting in Documentation/abi/testing/syfs-bus-iio-mpu6050 or similar using the standard formats found in there. +For MPU6050: +temperature (Read-only) +Read temperature data directly from the temperature register. Not abi compliant in_temp_input probably. + +sampling_frequency (Read/write) +Configure the ADC sampling rate and FIFO output rate. + +sampling_frequency_available(read-only) +show commonly used frequency + +clock_source (Read-only) +Check which clock-source is used by the chip. What controls this? I'd be tempted to drop it as not terribly useful to the user if they can't change it. Probably a debugging aid? + +power_state (Read/write) +turn on/off the power supply + +self_test (read-only) +read this entry trigger self test. The return value is D. +D is the success/fail. +For different chip, the result is different for success/fail. +1 means success 0 means fail. The LSB of D is for gyro; the bit +next to LSB of D is for accel. The bit 2 of D is for compass result. That's in the magic value category. If you do need a self test like this, make it output a nice string to say what happened. + +key (read-only) +show the key value of this driver. Used by MPL. Define the acronym! + +gyro_matrix (read-only) +show the orient matrix obtained from board file. why? + +gyro_enable (read/write) +enable/disable gyro functionality. affect raw_gyro. turn off this will +shut down gyro and save power. If the startup time is not horendous do this dynamically. E.g. bring it up when a reading is requested or if it in use by the buffered interfaces. + +accl_enable (read/write) +enable/disable accelerometer functionality. affect raw_accl. +turn off this will shut down accel and save power. + +firmware_loaded (read/write) +Flag indicate the whether firmware is loaded or not in the DMP engine. +0 means no firmware loaded. 1 means firmware is already loaded . This +flag can only be written as 0. 1 is updated internally. Not sure this should be exposed to the users. Firmware should always be loaded and done automatically before the device interfaces appear. If there is another reason for this, please give details. + +dmp_on(read/write) +This entry controls whether to run DMP or not. To enable DMP , +firmware_loaded must be 1. write 1 to enable DMP and write 0 to disable dmp. + +dmp_in_on(read/write) +This entry controls whether dmp interrupt is on/off. firmware_loaded must +be 1. sometimes, it is desirable that interrupt is off while DMP is running. This is definitely not something that should be exposed to userspace. Work out when it is 'desirable' and do the appropriate control in driver. + +dmp_event_int_on(read/write) +This entry controls whether dmp event interrupt is on/off. Setting this on +would turn off the data interrupt and turn on the event interrupt. No data +interrupt would be generated. Only when event happens, does an interrupt +generate. This can be used in power saving mode when system is waiting for +a special event to wake up. Again, raw interrupt controls like this are not abi compliant and should not be exposed to the user. It is far from obvious when users will want this and when they will not. If it is useful in power saving mode then enable it, if not don't.. + +dmp_firmware (write only binary file) +This is the entry that firmware code is loaded into. If the action is succeful, +firmware_loaded will be updated as 1. In order to load new firmware, +firmware_loaded flag should be set 0. No. Sorry, but the kernel has standard ways of loading firmware. Those are what you need to use. + +lpa_mode(read-write) +Low power accelerometer mode +lpa_freq(read-write) +low power acceleromter frequency. Hmm.. There are drivers doing this sort of thing but it generalises very badly. What result does it actually have on the accelerometer? I'd much rather it was controlled by dropping into this if they frequency was set appropriately rather than via this exta control + +accel_matrix +orient matrix for accel in_accel_orientation_matrix perhaps? Needs to be associated with the channels explicitly. + +flick_lower, +flick_upper, +flick_counter, +flick_message_on, +flick_int_on, +flick_axis, +Flick related entry That's pretty opaque. Thes probably want to be mapped to the standard event types and those extended if necessary. Certainly don't want to be here. + +pedometer_time +pedometer_steps, +Pedometer related entry Cool. Not see that before. Probably want to do that with a new channel type. No reason we won't get more pedometers at some point. + +event_flick +event_tap +event_orientation +event_display_orientation +event related entry. These entry must use poll to read. Using poll in sysfs is pretty heavily frowned upon except for extremely unlikely error conditions. These need to go through the event interface of iio. If we need to extend that to handle them then by all means send patches to do so. + +tap_on +control tap function of DMP + +dmp_int_on +turn on/off dmp interrupt. you have both dmp_in_on and dmp_int_on. I don't like either ;) + +dmp_output_rate +control dmp output rate when dmp is on. That's another 'sampling frequency' for the relevant channels. + +tap_time +tap_min_count +tap_threshold +tap related entries. control various parameters of tap function. More stuff that needs to go through the event interface. + +orientation_on +turn on/off orientation function of DMP. Hmm.. Is this for power reasons? We really need to start a discussion about fine grained power control for this sort of device. Right now I think you may have to drop it or control it via the enabled channels on the buffered interface. + +display_orientation_on +turn on/off display orientation function of DMP. + +quaternion_on +turn on/off quaterniion data output. must use DMP. +------------------------------------------------------------------- +for MPU9150 and secondary compass +MPU9150 has every entry MPU6050 has. It has additional entries: + +compass_enable (read/write) +enable this will enable compass function. + +compass_matrix (read-only) +compass orient matrix Need to map to normal channel types (or add one if this doesn't map to a magnetometer?) +---------------------------------------------------------------------------------- +low power accelerometer mode +Lower power accelerometer mode is a special mode. It works only for accelerometer. +It has two entries, lpa_mode and lpa_freq. Only MPU6050 and MPU9150 has this mode. +To run low power accel mode, set lpa_mode to 1, set lpa_freq to 0~3, which corresponds +to 1.25Hz, 5Hz, 20Hz, 40Hz. "gyro_enable" and "compass_enable" must be zero. "dmp_on" +must be zero. Then enable it automatically if the acceleration is all that is enabled and the frequency is one of those. +----------------------------------------------------------------------------------- +dmp event. +dmp event is event out by the DMP unit inside MPU. Only MPU6050 and MPU9150 supports this. +There are four sysfs entreis, event_flick, event_tap and event_orientation and entries +event_display_orientation. These four events must +be polled before read. The proper method to poll sysfs is: +1. open file. +2. dummy read. +3. poll. +4. once the poll passed, use fopen and fread to read the sysfs entry. +5. interpret the data. Nope. These need to come out of a proper event interface. The load involved in doing polling on sysfs is huge and gets very rude responses from GregKH and others. As this patch will go via Greg after me, you really don't want to do this! +------------------------------------------------------------------------------ +If streaming to a userspace application, the recommended way to access gyro/accel/compass +data is via /dev/iio:device0. Follow these steps to get constant readings from +the driver: It will only be /dev/iio:device[0] if this is the first iio device added.... + +1. Write a 1 to power_state to turn on the chip. This is the default setting + after installing the driver. +2. Write the desired output rate to fifo_rate. err. fifo_rate is documented. It is probably what we would normally map to sampling_frequency. I'm guessing there may be additional sampling frequencies for the motion calculation units? We may need to think hard about how to control those? To my mind there ought to be an 'ideal' set of values for a given output rate from the firmware processing. +3. write 1 to enable to turn on the event. +4. Read /dev/iio:device0 to get a string of gyro/accel/compass data. +5. Parse this string to obtain each gyro/accel/compass element. +6. If dmp firmware code is loaded, using "dmp_on" to enable/disable dmp . +7. If compass is enabled, output will have compass data. +=========================================================================== + Recommended sysfs entry setup senquence +1. without DMP firmware +1.1 set "power_state" to 1, +1.2 change scale and fifo rate value to your need. +1.3 change gyro_enable and accle_enable and compass_enable to your needs. For example, +if you want gyro only, set accl_enable to 0 or set accl_enable to zero and compass_enable to zero. +If you want accel only, set gyro_enable to 0 or set gyro_enable to zero and compass_enable to zero. +If you want compass only, disable gyro and accel. +1.4 set "enable" to 1. you will get output you want. + +2. With DMP firmware +2.1 set "power_state" to 1, +2.2 write "0" to firmware_loaded if it is not zero already. +2.3 load firmware into "dmp_firmware" as a whole. Don't split the DMP firmware image. +2.4 make sure firmware_loaded is 1 after loading. +2.5 make other configurations similar to the situation as without DMP firmware. +2.6 set dmp_on to 1. +2.7 set "enable" to 1. +======================================================= +The enable function is using enable entry under "/sys/bus/iio/devices/iio:device0/buffer" +========================================================== +test applications: +Test application is mpu_iio provided here? +------------------------------------------ +To run with MPU9150/MPU6050: +using the following command: +for orientation/tap/flick/display orientation event: +mpu_iio -c 10 -l 3 -p +for normal data print +mpu_iio -c 10 -l 3 -r +---------------------------------------- +Please use mpu_iio.c and iio_utils.h as the sample code for your development. diff --git a/drivers/staging/iio/imu/mpu6050/dmpDefaultMPU6050.c b/drivers/staging/iio/imu/mpu6050/dmpDefaultMPU6050.c new file mode 100644 index 0000000..5803643 --- /dev/null +++ b/drivers/staging/iio/imu/mpu6050/dmpDefaultMPU6050.c @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2012 Invensense, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#include "dmpKey.h" +#include "dmpmap.h" + Some of these are less than entirely obvious. Perhaps some comments would help? +#define CFG_27 (2745) ... + I hate to point out the obvious, but a macro might serve better here. #define D(a, b) (a*256 + b) +#define D_1_2 (256 + 2) +#define D_1_4 (256 + 4) ... + +#define D_HOST_NO_MOT (976) + So a lot of the above is about providing the config? Loose the defines and put them straight into here e.g. static const struct tkeyLabel dmpTConfig[] = { {KEY_CFG_27, 2745}, etc. +static const struct tKeyLabel dmpTConfig[] = { + {KEY_CFG_27, CFG_27}, + {KEY_CFG_20, CFG_20}, .... +}; +#define NUM_LOCAL_KEYS (sizeof(dmpTConfig)/sizeof(dmpTConfig[0])) kernel has ARRAY_SIZE macro + +static struct tKeyLabel keys[NUM_KEYS]; + +unsigned short inv_dmp_get_address(unsigned short key) +{ + static int isSorted; Is this going to play well if you have more than one of your chips present? Possibly, I haven't really thought it through! + if (!isSorted) { + int kk; + for (kk = 0; kk < NUM_KEYS; ++kk) { + keys[kk].addr = 0xffff; + keys[kk].key = kk; + } + for (kk = 0; kk < NUM_LOCAL_KEYS; ++kk) + keys[dmpTConfig[kk].key].addr = dmpTConfig[kk].addr; + isSorted = 1; + } + if (key >= NUM_KEYS) + return 0xffff; + return keys[key].addr; +} +/** + * @} + */ diff --git a/drivers/staging/iio/imu/mpu6050/dmpKey.h b/drivers/staging/iio/imu/mpu6050/dmpKey.h new file mode 100644 index 0000000..e8e1951 --- /dev/null +++ b/drivers/staging/iio/imu/mpu6050/dmpKey.h @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2012 Invensense, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#ifndef DMPKEY_H__ +#define DMPKEY_H__ + Not sure the stringing them off the previous is a good idea. If they really are always like this, then use an enum instead. +#define KEY_CFG_25 (0) +#define KEY_CFG_24 (KEY_CFG_25 + 1) ,,, + +struct tKeyLabel { + unsigned short key; + unsigned short addr; +}; + This is an 'interesting' set of defines. Why not just use the value in the code? Or for that matter put them in order... +#define DINA0A 0x0a +#define DINA22 0x22 ... + +#endif diff --git a/drivers/staging/iio/imu/mpu6050/dmpmap.h b/drivers/staging/iio/imu/mpu6050/dmpmap.h new file mode 100644 index 0000000..420e19d --- /dev/null +++ b/drivers/staging/iio/imu/mpu6050/dmpmap.h @@ -0,0 +1,17 @@ +/* +* Copyright (C) 2012 Invensense, Inc. +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +*/ + +#ifndef DMPMAP_H +#define DMPMAP_H + If we are going to have this, perhaps have some documenation? Also it's only included from one place that I can see. Just flatten it in there and drop this header. +#define DMP_PTAT 0 +#define DMP_XGYR 2 ... + +#endif diff --git a/drivers/staging/iio/imu/mpu6050/inv_mpu_iio.h b/drivers/staging/iio/imu/mpu6050/inv_mpu_iio.h new file mode 100644 index 0000000..0958d4a --- /dev/null +++ b/drivers/staging/iio/imu/mpu6050/inv_mpu_iio.h @@ -0,0 +1,25 @@ +/* +* Copyright (C) 2012 Invensense, Inc. +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +*/ + +#ifndef _INV_MPU_IIO_H_ +#define _INV_MPU_IIO_H_ + +#include +#include +#include +#include +#include +#include "./mpu.h" +#include "../../iio.h" +#include "../../buffer.h" Do these as etc. Actually you seem to be on a somewhat out of data tree. You'll want to rebase on staging/staging-next before the next submission. +#include "dmpKey.h" +/** Nice docs. Thanks. + * struct inv_reg_map_s - Notable slave registers. + * @sample_rate_div: Divider applied to gyro output rate. + * @lpf: Configures internal LPF. Spell it out, low_pass_filter (I guess?) + * @bank_sel: Selects between memory banks. + * @user_ctrl: Enables/resets the FIFO. + * @fifo_en: Determines which data will appear in FIFO. + * @gyro_config: gyro config register. + * @accl_config: accel config register + * @fifo_count_h: Upper byte of FIFO count. + * @fifo_r_w: FIFO register. + * @raw_gyro Address of first gyro register. + * @raw_accl Address of first accel register. + * @temperature temperature register + * @int_enable: Interrupt enable register. + * @int_status: Interrupt flags. + * @pwr_mgmt_1: Controls chip's power state and clock source. + * @pwr_mgmt_2: Controls power state of individual sensors. + * @mem_start_addr: Address of first memory read. + * @mem_r_w: Access to memory. + * @prgm_strt_addrh firmware program start address register + */ +struct inv_reg_map_s { + unsigned char sample_rate_div; As in kernel, u8 is the right type to use. + unsigned char lpf; .... + const short *compass_st_lower; + short irq; + int accel_bias[3]; + int gyro_bias[3]; I'd use fixed length types s16 perhaps? + short raw_gyro[3]; + short raw_accel[3]; + short raw_compass[3]; + unsigned char compass_scale; + unsigned char i2c_addr; + unsigned char compass_divider; + unsigned char compass_counter; + unsigned char sample_divider; + unsigned char fifo_divider; + unsigned char orient_data; + unsigned char display_orient_data; + unsigned char tap_data; + enum inv_channel_num num_channels; + void *sl_handle; + unsigned int irq_dur_ns; + long long last_isr_time; +#ifdef CONFIG_INV_TESTING + unsigned long i2c_readcount; + unsigned long i2c_writecount; +#endif +}; + + int (*setup)(struct inv_mpu_iio_s *); + int (*combine_data)(unsigned char *in, short *out); + int (*get_mode)(struct inv_mpu_iio_s *); + int (*set_lpf)(struct inv_mpu_iio_s *, int rate); + int (*set_fs)(struct inv_mpu_iio_s *, int fs); +}; + Are these specific to your handling or to the AKM chips themselves? If the akm chips, should be in a separate header. I'd much rather see a generic driver for these with the extra hooks you need rather than rolling them into your driver and having lots of code repitition. +/* AKM definitions */ +#define REG_AKM_ID 0x00 +#define REG_AKM_STATUS 0x02 +#define REG_AKM_MEASURE_DATA 0x03 +#define REG_AKM_MODE 0x0A +#define REG_AKM_ST_CTRL 0x0C ... + ATTR_COMPASS_ENABLE, + ATTR_POWER_STATE, + ATTR_FIRMWARE_LOADED, Clear these out, or do them as a debugfs interface as some other drivers use. +#ifdef CONFIG_INV_TESTING + ATTR_I2C_COUNTERS, + ATTR_REG_WRITE, +#endif +}; + +enum inv_accl_fs_e { + INV_FS_02G = 0, + INV_FS_04G, + INV_FS_08G, + INV_FS_16G, + NUM_ACCL_FSR +}; ... +int inv_i2c_read_base(struct inv_mpu_iio_s *st, unsigned short i2c_addr, + unsigned char reg, unsigned short length, unsigned char *data); This isn't defined anywhere that I can see? Each patch should stand on its own. If I can't build them one at a time then I reject them. This is vital in a more general sense for kernel development as we HAVE to have a bisectable set of patches. +int inv_i2c_single_write_base(struct inv_mpu_iio_s *st, + unsigned short i2c_addr, unsigned char reg, unsigned char data); +int inv_do_test(struct inv_mpu_iio_s *st, int self_test_flag, + int *gyro_result, int *accl_result); +int mpu_memory_write(struct i2c_adapter *i2c_adap, + unsigned char mpu_addr, + unsigned short mem_addr, + unsigned int len, unsigned char const *data); +int mpu_memory_read(struct i2c_adapter *i2c_adap, + unsigned char mpu_addr, + unsigned short mem_addr, + unsigned int len, unsigned char *data); +int inv_hw_self_test(struct inv_mpu_iio_s *st); + +#define mem_w(a, b, c) mpu_memory_write(st->sl_handle,\ + st->i2c_addr, a, b, c) +#define mem_w_key(key, b, c) mpu_memory_write(st->sl_handle,\ + st->i2c_addr, inv_dmp_get_address(key), b, c) +#define inv_i2c_read(st, reg, len, data) \ + inv_i2c_read_base(st, st->i2c_addr, reg, len, data) +#define inv_i2c_single_write(st, reg, data) \ + inv_i2c_single_write_base(st, st->i2c_addr, reg, data) +#define inv_secondary_read(reg, len, data) \ + inv_i2c_read_base(st, st->plat_data.secondary_i2c_addr, reg, len, data) +#define inv_secondary_write(reg, data) \ + inv_i2c_single_write_base(st, st->plat_data.secondary_i2c_addr, \ + reg, data) +#endif /* #ifndef _INV_MPU_IIO_H_ */ + diff --git a/drivers/staging/iio/imu/mpu6050/inv_mpu_ring.c b/drivers/staging/iio/imu/mpu6050/inv_mpu_ring.c new file mode 100644 index 0000000..528da5f --- /dev/null +++ b/drivers/staging/iio/imu/mpu6050/inv_mpu_ring.c @@ -0,0 +1,44 @@ +/* +* Copyright (C) 2012 Invensense, Inc. +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +*/ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt ... +static void inv_scan_query(struct iio_dev *indio_dev) +{ + struct inv_mpu_iio_s *st = iio_priv(indio_dev); + struct iio_buffer *ring = indio_dev->buffer; + + if (iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_X) || + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_Y) || + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_Z)) + st->chip_config.gyro_fifo_enable = 1; st->chip_config.gyro_fifo_enable = iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_X) || iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_Y) || iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_Z); + else + st->chip_config.gyro_fifo_enable = 0; + + if (iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_ACCL_X) || + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_ACCL_Y) || + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_ACCL_Z)) + st->chip_config.accl_fifo_enable = 1; + else + st->chip_config.accl_fifo_enable = 0; + + if (iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_MAGN_X) || + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_MAGN_Y) || + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_MAGN_Z)) + st->chip_config.compass_fifo_enable = 1; + else + st->chip_config.compass_fifo_enable = 0; +} + +/** + * reset_fifo_itg() - Reset FIFO related registers. + * @st: Device driver instance. + */ +static int reset_fifo_itg(struct iio_dev *indio_dev) +{ + struct inv_reg_map_s *reg; + int result; + unsigned char val; + struct inv_mpu_iio_s *st = iio_priv(indio_dev); I'd just use st->reg directly, can't see why taking a copy helps other than confusing me slightly ;) + reg = &st->reg; + + inv_scan_query(indio_dev); + /* disable interrupt */ + result = inv_i2c_single_write(st, reg->int_enable, 0); + if (result) { + pr_err("int_enable write failed\n"); + return result; + } + /* disable the sensor output to FIFO */ + result = inv_i2c_single_write(st, reg->fifo_en, 0); + if (result) + goto reset_fifo_fail; .... + return result; +} + As functions go, this one currently doesn't seem to have a great deal of point... drop it, you can always introduce it later if it has more to do. +/** + * inv_reset_fifo() - Reset FIFO related registers. + * @st: Device driver instance. + */ +static int inv_reset_fifo(struct iio_dev *indio_dev) +{ + return reset_fifo_itg(indio_dev); +} + .... +/** + * inv_clear_kfifo() - clear time stamp fifo + * @st: Device driver instance. + */ +void inv_clear_kfifo(struct inv_mpu_iio_s *st) +{ + unsigned long flags; + spin_lock_irqsave(&st->time_stamp_lock, flags); + kfifo_reset(&st->timestamps); + spin_unlock_irqrestore(&st->time_stamp_lock, flags); +} + ... + +/** + * inv_read_fifo() - Transfer data from FIFO to ring buffer. + */ +irqreturn_t inv_read_fifo(int irq, void *dev_id) +{ + Bonus blank line here. Yup, I'm getting nitpicky ;) + struct inv_mpu_iio_s *st = (struct inv_mpu_iio_s *)dev_id; + struct iio_dev *indio_dev = iio_priv_to_dev(st); + size_t bytes_per_datum; + int result; + unsigned char data[BYTES_FOR_DMP + QUATERNION_BYTES]; + unsigned short fifo_count; + unsigned int copied; + s64 timestamp; + struct inv_reg_map_s *reg; + s64 buf[8]; + unsigned char *tmp; + reg = &st->reg; Given the number of repeats of checking if anything is turned on, perhaps a inv_anything_enabled inline function might make for shorter easier to read code. + if (!(st->chip_config.accl_fifo_enable | + st->chip_config.gyro_fifo_enable | + st->chip_config.dmp_on | + st->chip_config.compass_fifo_enable)) + goto end_session; ... + +int inv_postenable(struct iio_dev *indio_dev) +{ + return set_inv_enable(indio_dev, true); bonus blank line. This formatting stuff does matter if you are reviewing a lot of code. Makes it simpler to do. + +} + +int inv_predisable(struct iio_dev *indio_dev) +{ + return set_inv_enable(indio_dev, false); +} + +static const struct iio_buffer_setup_ops inv_mpu_ring_setup_ops = { + .preenable = &iio_sw_buffer_preenable, + .postenable = &inv_postenable, + .predisable = &inv_predisable, +}; + +int inv_mpu_configure_ring(struct iio_dev *indio_dev) +{ + int ret; + struct inv_mpu_iio_s *st = iio_priv(indio_dev); + struct iio_buffer *ring; + + ring = iio_kfifo_allocate(indio_dev); + if (!ring) + return -ENOMEM; + indio_dev->buffer = ring; + /* setup ring buffer */ + ring->scan_timestamp = true; + indio_dev->setup_ops = &inv_mpu_ring_setup_ops; + /*scan count double count timestamp. should subtract 1. but + number of channels still includes timestamp*/ + ret = request_threaded_irq(st->client->irq, inv_irq_handler, + inv_read_fifo, + IRQF_TRIGGER_RISING | IRQF_SHARED, + "inv_irq", st); + if (ret) + goto error_iio_sw_rb_free; + + return 0; +error_iio_sw_rb_free: + iio_kfifo_free(indio_dev->buffer); + return ret; +} +/** + * @} + */ + diff --git a/drivers/staging/iio/imu/mpu6050/mpu.h b/drivers/staging/iio/imu/mpu6050/mpu.h new file mode 100644 index 0000000..5105fb2 --- /dev/null +++ b/drivers/staging/iio/imu/mpu6050/mpu.h @@ -0,0 +1,15 @@ +/* +* Copyright (C) 2012 Invensense, Inc. +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +*/ + +/** I may be missing something but is this kerneldoc? If not it doesn't belong in a kernel driver... + * @addtogroup DRIVERS + * @brief Hardware drivers. + * + * @{ + * @file mpu.h + * @brief mpu definition + */ + +#ifndef __MPU_H_ +#define __MPU_H_ + +#ifdef __KERNEL__ +#include +#include +#endif + +enum secondary_slave_type { + SECONDARY_SLAVE_TYPE_NONE, + SECONDARY_SLAVE_TYPE_ACCEL, + SECONDARY_SLAVE_TYPE_COMPASS, + SECONDARY_SLAVE_TYPE_PRESSURE, + + SECONDARY_SLAVE_TYPE_TYPES +}; + +}; + +#define INV_PROD_KEY(ver, rev) (ver * 100 + rev) blank line here please. +/** + * struct mpu_platform_data - Platform data for the mpu driver + * @int_config: Bits [7:3] of the int config register. + * @level_shifter: 0: VLogic, 1: VDD + * @orientation: Orientation matrix of the gyroscope + * @sec_slave_type: secondary slave device type, can be compass, accel, etc + * @sec_slave_id: id of the secondary slave device + * @secondary_i2c_address: secondary device's i2c address + * @secondary_orientation: secondary device's orientation matrix + * + * Contains platform specific information on how to configure the MPU3050 to + * work on this platform. The orientation matricies are 3x3 rotation matricies + * that are applied to the data to rotate from the mounting orientation to the + * platform orientation. The values must be one of 0, 1, or -1 and each row and + * column should have exactly 1 non-zero value. + */ +struct mpu_platform_data { why the __ versions? + __u8 int_config; + __u8 level_shifter; + __s8 orientation[9]; + enum secondary_slave_type sec_slave_type; + enum ext_slave_id sec_slave_id; + __u16 secondary_i2c_addr; + __s8 secondary_orientation[9]; + __u8 key[16]; +}; + +#endif /* __MPU_H_ */ -- 1.7.0.4 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Ge Gao References: <4FF6AAD1.2010304@kernel.org> In-Reply-To: <4FF6AAD1.2010304@kernel.org> MIME-Version: 1.0 Date: Fri, 6 Jul 2012 10:40:22 -0700 Message-ID: <00805a8e92cea1abfec2379a721e2853@mail.gmail.com> Subject: RE: [PATCH 1/4] IIO: Invensense MPU6050/MPU9150 driver submit To: Jonathan Cameron Cc: linux-iio@vger.kernel.org Content-Type: text/plain; charset=ISO-8859-1 List-ID: Dear Jonathan, Thank you very much for the advice. I think it is a great idea! I will put it as two steps. First the data out, second the DMP(Digital Motion Processing). Actually, data out is most useful one and that's what most people would use. What makes this driver so complex is the DMP. Without it, the driver would be much simpler. I will rewrite it and re-submit it. For the code base, I am basing the code on the release version 3.4.4 from the Linux website. I notice that the newest release candidate is 3. 5-rc5. Shall I use this as the base or I should always use the latest release candidate? I found that the 3.5-rc5 has moved the iio driver out of staging and KFIFO become the only choice. However, it still lacks the poll feature. As for the DMP loading, I was trying to use the standard way, request_firmware. However, it is a hotplug mechanism and need a "Daemon" to function. I run my system on Panda board and I didn't see hotplug being triggered when I try to run it. That's why I switched to a more "manual" way to load firmware. MPU6050/MPU9150 can run without firmware. The firmware is only for DMP purpose; if no DMP function is required, no firmware should be loaded. So it can be chosen load or not. Without DMP, MPU6050/9150 would just output data. Nothing else. I will rewrite the code again as we discussed and resubmit. Thank you for advice. Best Regards, Ge GAO -----Original Message----- From: Jonathan Cameron [mailto:jic23@kernel.org] Sent: Friday, July 06, 2012 2:07 AM To: Ge Gao Cc: linux-iio@vger.kernel.org Subject: Re: [PATCH 1/4] IIO: Invensense MPU6050/MPU9150 driver submit Hi Ge, Please don't get disheartened by this partial review. Getting use to approaches to getting kernel drivers merged can take a considerable time. It's not a trivial thing to do even with a 'perfect' driver. There is a lot of nice / interesting stuff in your driver so I look forward to seeing it move forward! I doubt we'll get any more complex hardware anytime soon! Couple of major comments. 1) This first patch could benefit from breaking up futher. Right now it's too big and cumbersome to review remotely quickly. First separate off the docs into their own patch. Then I'd pull out the DMP code into a follow up patch. That way we can get the core stuff sorted relatively quickly before it gets to complex. Actually the best way to get this in would be to strip nearly everything back so just have your basic data flow through the fifo. No events or motion processing or anything unusual in the first patch. Then we can review that very quickly and get something in place to make incremental extensions to. All in all it is too big to get reviewed. Sorry, but patches really need to be inline emails if you want to have a reasonable chance of getting eyes on them. There are a number of people on the mailing list who will take a look at new drivers when they have a few minutes spare. This first file has taken me over 2 hours to review and what I have done is far from thorough. Anyhow some comments in line. Mostly the code looks pretty clean and there are some good docs which always helps. 2) I may not have made it clear enough before, but you are pretty much not going to succeeed in having your own versions of drivers that already exist. That sort of code replication gets a lot of friction upstream. What you need to do is to write a i2c master driver and then attach your secondary devices to this. Where you need additional features in those drivers, propose them and if they are not too invasive I doubt anyone will mind. Although you only have a couple of slave devices here, seeing your table of id's shows there will be a lot more to come. If there is an absolute reason why this approach won't work, you need to convince people with a careful brief arguement 'before' this goes anywhere. Anyhow Ge good luck with this one. I might get a chance to take a look at the other patches, but it'll be a while give their size. Sorry, but the short easy to review ones tend to get attended to first! Jonathan From 6d4093a59d77a68d4972f648ea9eba69e8598159 Mon Sep 17 00:00:00 2001 From: Ge Gao Date: Thu, 28 Jun 2012 10:58:12 -0700 Subject: [PATCH 1/4] Invensense MPU6050/MPU9150 driver. --MPU6050/MPU9150 driver. --Secondary bus for AKM8975/AKM8963/AKM8972 support. --kernel fix for Kfifo poll support from Jonanthan. --Kfifo bug fix. Need to check available space before store. --add new IIO type for quaternion. ... index 0000000..c4fa2c2 --- /dev/null +++ b/drivers/staging/iio/imu/mpu6050/Kconfig @@ -0,0 +1,6 @@ +# +# inv-mpu-6050 drivers for Invensense MPU devices and combos # + +config INV_MPU6050_IIO + tristate "Invensense MPU6050 devices" Will need to drop the !INV_MPU bit from the patch (and put it back in your local tree). + depends on I2C && SYSFS && IIO && IIO_KFIFO_BUF && !INV_MPU && !INV_MPU_IIO + default n + help + This driver supports the Invensense MPU6050/MPU9150 devices. It also + supports AKM8975/AKM8963/AKM8972 in the secondary bus. Ideally you want to build this text up as stuff is added (guessing not all of this is in the initial patch!) + This driver can be built as a module. The module will be called + inv-mpu6050-iio. Not keen on the naming, inv-mpu6050 then if you need to change it for your local tree do it in a patch there. ... diff --git a/drivers/staging/iio/imu/mpu6050/README b/drivers/staging/iio/imu/mpu6050/README new file mode 100644 index 0000000..806a956 --- /dev/null +++ b/drivers/staging/iio/imu/mpu6050/README @@ -0,0 +1,11 @@ +Kernel driver inv-mpu-iio +Author: Invensense + +Description +----------- +This document describes how to install the Invensense device driver +into a Linux kernel. At the moment, this driver supports the +MPU6050/MPU9150. The slave address of these four chips are +0x68 or 0x69. However, the actual slave address depends on the board +configuration. The driver does not assume anything about it. + I would have prefered the documentation in a separate patch. Also, lots of this needs 'adjusting' to take into account that the driver will be in the main tree. +Files included in this package: +Kconfig +Makefile +inv_mpu_core.c +inv_mpu_misc.c +inv_mpu_iio.h +inv_mpu_ring.c +dmpDefaultMPU6050.c +dmpkey.h +dmpmap.h +mpu.h +Including the driver in the Linux kernel +---------------------------------------- +mpu.h should be added to "kernel/include/linux". +Other files listed should be added to the drivers/staging/iio/imu/mpu +directory (or another directory of your choosing). When building the +kernel, the driver will not appear in menuconfig without modifications +similar to those below: + +modify "drivers/staging/iio/imu/Kconfig" like source +"drivers/staging/iio/imu/mpu/Kconfig" + +modify "drivers/staging/iio/imu/Makefile" +obj-y += mpu/ + +Board and Platform Data +----------------------- +The board file needs to be modified to register the device on an I2C bus. An +i2c_board_info instance must be defined as seen below. The hardcoded value of +140 corresponds to the GPIO input pin wired to the device's interrupt pin. +This pin will most likely be different for your platform. +platform data is for orientation matrix, and secondary bus situations. +For MPU9150, it is regarded as a MPU9150 and AKM8975 in the secondary. +So the secondary i2c address must be filled. +----------------------------------------------------------------- +The board file is arch/arm/mach-omap2/board-omap4panda.c for panda +board or modify the board file in your system as below: +-------------------------------------------------------- good examples for the platform data. I'm not sure I'd spend as much time talking about how to register it for a given board. That stuff is pretty standard. +For AKM8963 in the secondary i2c bus of MPU6050, static struct +mpu_platform_data gyro_platform_data = { + .int_config = 0x10, + .level_shifter = 0, + .orientation = { -1, 0, 0, + 0, 1, 0, + 0, 0, -1 }, + .sec_slave_type = SECONDARY_SLAVE_TYPE_COMPASS, + .sec_slave_id = COMPASS_ID_AK8963, + .secondary_i2c_addr = 0x0E +}; ... + +IIO subsystem +---------------------------------------------- +successful installation will create two directories under /sys/bus/iio/devices +iio:device0 +trigger0 +Under /dev/ diretory, a file "iio:device0" will also be created(or iio:deviceX, if +you have more than one iio devices). This stuff is all good, but ideally it would go in a more generic document where it isn't already covered. That way we don't have to edit more than one if anything changes! +Communicating with the driver in userspace +------------------------------------------ +Upon installation, the driver generates several files in sysfs. If your +platform is configured as detailed above, navigate to the following +path to find these files: +/sys/bus/iio/devices/iio:device0 + +The list below provides a brief description for each file. +-------------------------------------- Firstly these need documenting in Documentation/abi/testing/syfs-bus-iio-mpu6050 or similar using the standard formats found in there. +For MPU6050: +temperature (Read-only) +Read temperature data directly from the temperature register. Not abi compliant in_temp_input probably. + +sampling_frequency (Read/write) +Configure the ADC sampling rate and FIFO output rate. + +sampling_frequency_available(read-only) +show commonly used frequency + +clock_source (Read-only) +Check which clock-source is used by the chip. What controls this? I'd be tempted to drop it as not terribly useful to the user if they can't change it. Probably a debugging aid? + +power_state (Read/write) +turn on/off the power supply + +self_test (read-only) +read this entry trigger self test. The return value is D. +D is the success/fail. +For different chip, the result is different for success/fail. +1 means success 0 means fail. The LSB of D is for gyro; the bit next to +LSB of D is for accel. The bit 2 of D is for compass result. That's in the magic value category. If you do need a self test like this, make it output a nice string to say what happened. + +key (read-only) +show the key value of this driver. Used by MPL. Define the acronym! + +gyro_matrix (read-only) +show the orient matrix obtained from board file. why? + +gyro_enable (read/write) +enable/disable gyro functionality. affect raw_gyro. turn off this will +shut down gyro and save power. If the startup time is not horendous do this dynamically. E.g. bring it up when a reading is requested or if it in use by the buffered interfaces. + +accl_enable (read/write) +enable/disable accelerometer functionality. affect raw_accl. +turn off this will shut down accel and save power. + +firmware_loaded (read/write) +Flag indicate the whether firmware is loaded or not in the DMP engine. +0 means no firmware loaded. 1 means firmware is already loaded . This +flag can only be written as 0. 1 is updated internally. Not sure this should be exposed to the users. Firmware should always be loaded and done automatically before the device interfaces appear. If there is another reason for this, please give details. + +dmp_on(read/write) +This entry controls whether to run DMP or not. To enable DMP , +firmware_loaded must be 1. write 1 to enable DMP and write 0 to disable dmp. + +dmp_in_on(read/write) +This entry controls whether dmp interrupt is on/off. firmware_loaded +must be 1. sometimes, it is desirable that interrupt is off while DMP +is running. This is definitely not something that should be exposed to userspace. Work out when it is 'desirable' and do the appropriate control in driver. + +dmp_event_int_on(read/write) +This entry controls whether dmp event interrupt is on/off. Setting this +on would turn off the data interrupt and turn on the event interrupt. +No data interrupt would be generated. Only when event happens, does an +interrupt generate. This can be used in power saving mode when system +is waiting for a special event to wake up. Again, raw interrupt controls like this are not abi compliant and should not be exposed to the user. It is far from obvious when users will want this and when they will not. If it is useful in power saving mode then enable it, if not don't.. + +dmp_firmware (write only binary file) +This is the entry that firmware code is loaded into. If the action is succeful, +firmware_loaded will be updated as 1. In order to load new firmware, +firmware_loaded flag should be set 0. No. Sorry, but the kernel has standard ways of loading firmware. Those are what you need to use. + +lpa_mode(read-write) +Low power accelerometer mode +lpa_freq(read-write) +low power acceleromter frequency. Hmm.. There are drivers doing this sort of thing but it generalises very badly. What result does it actually have on the accelerometer? I'd much rather it was controlled by dropping into this if they frequency was set appropriately rather than via this exta control + +accel_matrix +orient matrix for accel in_accel_orientation_matrix perhaps? Needs to be associated with the channels explicitly. + +flick_lower, +flick_upper, +flick_counter, +flick_message_on, +flick_int_on, +flick_axis, +Flick related entry That's pretty opaque. Thes probably want to be mapped to the standard event types and those extended if necessary. Certainly don't want to be here. + +pedometer_time +pedometer_steps, +Pedometer related entry Cool. Not see that before. Probably want to do that with a new channel type. No reason we won't get more pedometers at some point. + +event_flick +event_tap +event_orientation +event_display_orientation +event related entry. These entry must use poll to read. Using poll in sysfs is pretty heavily frowned upon except for extremely unlikely error conditions. These need to go through the event interface of iio. If we need to extend that to handle them then by all means send patches to do so. + +tap_on +control tap function of DMP + +dmp_int_on +turn on/off dmp interrupt. you have both dmp_in_on and dmp_int_on. I don't like either ;) + +dmp_output_rate +control dmp output rate when dmp is on. That's another 'sampling frequency' for the relevant channels. + +tap_time +tap_min_count +tap_threshold +tap related entries. control various parameters of tap function. More stuff that needs to go through the event interface. + +orientation_on +turn on/off orientation function of DMP. Hmm.. Is this for power reasons? We really need to start a discussion about fine grained power control for this sort of device. Right now I think you may have to drop it or control it via the enabled channels on the buffered interface. + +display_orientation_on +turn on/off display orientation function of DMP. + +quaternion_on +turn on/off quaterniion data output. must use DMP. +------------------------------------------------------------------- +for MPU9150 and secondary compass +MPU9150 has every entry MPU6050 has. It has additional entries: + +compass_enable (read/write) +enable this will enable compass function. + +compass_matrix (read-only) +compass orient matrix Need to map to normal channel types (or add one if this doesn't map to a magnetometer?) +----------------------------------------------------------------------- +----------- +low power accelerometer mode +Lower power accelerometer mode is a special mode. It works only for accelerometer. +It has two entries, lpa_mode and lpa_freq. Only MPU6050 and MPU9150 has this mode. +To run low power accel mode, set lpa_mode to 1, set lpa_freq to 0~3, which corresponds +to 1.25Hz, 5Hz, 20Hz, 40Hz. "gyro_enable" and "compass_enable" must be zero. "dmp_on" +must be zero. Then enable it automatically if the acceleration is all that is enabled and the frequency is one of those. +----------------------------------------------------------------------- +------------ +dmp event. +dmp event is event out by the DMP unit inside MPU. Only MPU6050 and MPU9150 supports this. +There are four sysfs entreis, event_flick, event_tap and event_orientation and entries +event_display_orientation. These four events must be polled before +read. The proper method to poll sysfs is: +1. open file. +2. dummy read. +3. poll. +4. once the poll passed, use fopen and fread to read the sysfs entry. +5. interpret the data. Nope. These need to come out of a proper event interface. The load involved in doing polling on sysfs is huge and gets very rude responses from GregKH and others. As this patch will go via Greg after me, you really don't want to do this! +----------------------------------------------------------------------- +------- If streaming to a userspace application, the recommended way to +access gyro/accel/compass +data is via /dev/iio:device0. Follow these steps to get constant readings from +the driver: It will only be /dev/iio:device[0] if this is the first iio device added.... + +1. Write a 1 to power_state to turn on the chip. This is the default setting + after installing the driver. +2. Write the desired output rate to fifo_rate. err. fifo_rate is documented. It is probably what we would normally map to sampling_frequency. I'm guessing there may be additional sampling frequencies for the motion calculation units? We may need to think hard about how to control those? To my mind there ought to be an 'ideal' set of values for a given output rate from the firmware processing. +3. write 1 to enable to turn on the event. +4. Read /dev/iio:device0 to get a string of gyro/accel/compass data. +5. Parse this string to obtain each gyro/accel/compass element. +6. If dmp firmware code is loaded, using "dmp_on" to enable/disable dmp . +7. If compass is enabled, output will have compass data. +========================================================================= == + Recommended sysfs entry setup senquence 1. without +DMP firmware +1.1 set "power_state" to 1, +1.2 change scale and fifo rate value to your need. +1.3 change gyro_enable and accle_enable and compass_enable to your needs. For example, +if you want gyro only, set accl_enable to 0 or set accl_enable to zero and compass_enable to zero. +If you want accel only, set gyro_enable to 0 or set gyro_enable to zero and compass_enable to zero. +If you want compass only, disable gyro and accel. +1.4 set "enable" to 1. you will get output you want. + +2. With DMP firmware +2.1 set "power_state" to 1, +2.2 write "0" to firmware_loaded if it is not zero already. +2.3 load firmware into "dmp_firmware" as a whole. Don't split the DMP firmware image. +2.4 make sure firmware_loaded is 1 after loading. +2.5 make other configurations similar to the situation as without DMP firmware. +2.6 set dmp_on to 1. +2.7 set "enable" to 1. +======================================================= +The enable function is using enable entry under "/sys/bus/iio/devices/iio:device0/buffer" +========================================================== +test applications: +Test application is mpu_iio provided here? +------------------------------------------ +To run with MPU9150/MPU6050: +using the following command: +for orientation/tap/flick/display orientation event: +mpu_iio -c 10 -l 3 -p +for normal data print +mpu_iio -c 10 -l 3 -r +---------------------------------------- +Please use mpu_iio.c and iio_utils.h as the sample code for your development. diff --git a/drivers/staging/iio/imu/mpu6050/dmpDefaultMPU6050.c b/drivers/staging/iio/imu/mpu6050/dmpDefaultMPU6050.c new file mode 100644 index 0000000..5803643 --- /dev/null +++ b/drivers/staging/iio/imu/mpu6050/dmpDefaultMPU6050.c @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2012 Invensense, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#include "dmpKey.h" +#include "dmpmap.h" + Some of these are less than entirely obvious. Perhaps some comments would help? +#define CFG_27 (2745) ... + I hate to point out the obvious, but a macro might serve better here. #define D(a, b) (a*256 + b) +#define D_1_2 (256 + 2) +#define D_1_4 (256 + 4) ... + +#define D_HOST_NO_MOT (976) + So a lot of the above is about providing the config? Loose the defines and put them straight into here e.g. static const struct tkeyLabel dmpTConfig[] = { {KEY_CFG_27, 2745}, etc. +static const struct tKeyLabel dmpTConfig[] = { + {KEY_CFG_27, CFG_27}, + {KEY_CFG_20, CFG_20}, .... +}; +#define NUM_LOCAL_KEYS (sizeof(dmpTConfig)/sizeof(dmpTConfig[0])) kernel has ARRAY_SIZE macro + +static struct tKeyLabel keys[NUM_KEYS]; + +unsigned short inv_dmp_get_address(unsigned short key) { + static int isSorted; Is this going to play well if you have more than one of your chips present? Possibly, I haven't really thought it through! + if (!isSorted) { + int kk; + for (kk = 0; kk < NUM_KEYS; ++kk) { + keys[kk].addr = 0xffff; + keys[kk].key = kk; + } + for (kk = 0; kk < NUM_LOCAL_KEYS; ++kk) + keys[dmpTConfig[kk].key].addr = dmpTConfig[kk].addr; + isSorted = 1; + } + if (key >= NUM_KEYS) + return 0xffff; + return keys[key].addr; +} +/** + * @} + */ diff --git a/drivers/staging/iio/imu/mpu6050/dmpKey.h b/drivers/staging/iio/imu/mpu6050/dmpKey.h new file mode 100644 index 0000000..e8e1951 --- /dev/null +++ b/drivers/staging/iio/imu/mpu6050/dmpKey.h @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2012 Invensense, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#ifndef DMPKEY_H__ +#define DMPKEY_H__ + Not sure the stringing them off the previous is a good idea. If they really are always like this, then use an enum instead. +#define KEY_CFG_25 (0) +#define KEY_CFG_24 (KEY_CFG_25 + 1) ,,, + +struct tKeyLabel { + unsigned short key; + unsigned short addr; +}; + This is an 'interesting' set of defines. Why not just use the value in the code? Or for that matter put them in order... +#define DINA0A 0x0a +#define DINA22 0x22 ... + +#endif diff --git a/drivers/staging/iio/imu/mpu6050/dmpmap.h b/drivers/staging/iio/imu/mpu6050/dmpmap.h new file mode 100644 index 0000000..420e19d --- /dev/null +++ b/drivers/staging/iio/imu/mpu6050/dmpmap.h @@ -0,0 +1,17 @@ +/* +* Copyright (C) 2012 Invensense, Inc. +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +*/ + +#ifndef DMPMAP_H +#define DMPMAP_H + If we are going to have this, perhaps have some documenation? Also it's only included from one place that I can see. Just flatten it in there and drop this header. +#define DMP_PTAT 0 +#define DMP_XGYR 2 ... + +#endif diff --git a/drivers/staging/iio/imu/mpu6050/inv_mpu_iio.h b/drivers/staging/iio/imu/mpu6050/inv_mpu_iio.h new file mode 100644 index 0000000..0958d4a --- /dev/null +++ b/drivers/staging/iio/imu/mpu6050/inv_mpu_iio.h @@ -0,0 +1,25 @@ +/* +* Copyright (C) 2012 Invensense, Inc. +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +*/ + +#ifndef _INV_MPU_IIO_H_ +#define _INV_MPU_IIO_H_ + +#include +#include +#include +#include +#include +#include "./mpu.h" +#include "../../iio.h" +#include "../../buffer.h" Do these as etc. Actually you seem to be on a somewhat out of data tree. You'll want to rebase on staging/staging-next before the next submission. +#include "dmpKey.h" +/** Nice docs. Thanks. + * struct inv_reg_map_s - Notable slave registers. + * @sample_rate_div: Divider applied to gyro output rate. + * @lpf: Configures internal LPF. Spell it out, low_pass_filter (I guess?) + * @bank_sel: Selects between memory banks. + * @user_ctrl: Enables/resets the FIFO. + * @fifo_en: Determines which data will appear in FIFO. + * @gyro_config: gyro config register. + * @accl_config: accel config register + * @fifo_count_h: Upper byte of FIFO count. + * @fifo_r_w: FIFO register. + * @raw_gyro Address of first gyro register. + * @raw_accl Address of first accel register. + * @temperature temperature register + * @int_enable: Interrupt enable register. + * @int_status: Interrupt flags. + * @pwr_mgmt_1: Controls chip's power state and clock source. + * @pwr_mgmt_2: Controls power state of individual sensors. + * @mem_start_addr: Address of first memory read. + * @mem_r_w: Access to memory. + * @prgm_strt_addrh firmware program start address register + */ +struct inv_reg_map_s { + unsigned char sample_rate_div; As in kernel, u8 is the right type to use. + unsigned char lpf; .... + const short *compass_st_lower; + short irq; + int accel_bias[3]; + int gyro_bias[3]; I'd use fixed length types s16 perhaps? + short raw_gyro[3]; + short raw_accel[3]; + short raw_compass[3]; + unsigned char compass_scale; + unsigned char i2c_addr; + unsigned char compass_divider; + unsigned char compass_counter; + unsigned char sample_divider; + unsigned char fifo_divider; + unsigned char orient_data; + unsigned char display_orient_data; + unsigned char tap_data; + enum inv_channel_num num_channels; + void *sl_handle; + unsigned int irq_dur_ns; + long long last_isr_time; +#ifdef CONFIG_INV_TESTING + unsigned long i2c_readcount; + unsigned long i2c_writecount; +#endif +}; + + int (*setup)(struct inv_mpu_iio_s *); + int (*combine_data)(unsigned char *in, short *out); + int (*get_mode)(struct inv_mpu_iio_s *); + int (*set_lpf)(struct inv_mpu_iio_s *, int rate); + int (*set_fs)(struct inv_mpu_iio_s *, int fs); }; + Are these specific to your handling or to the AKM chips themselves? If the akm chips, should be in a separate header. I'd much rather see a generic driver for these with the extra hooks you need rather than rolling them into your driver and having lots of code repitition. +/* AKM definitions */ +#define REG_AKM_ID 0x00 +#define REG_AKM_STATUS 0x02 +#define REG_AKM_MEASURE_DATA 0x03 +#define REG_AKM_MODE 0x0A +#define REG_AKM_ST_CTRL 0x0C ... + ATTR_COMPASS_ENABLE, + ATTR_POWER_STATE, + ATTR_FIRMWARE_LOADED, Clear these out, or do them as a debugfs interface as some other drivers use. +#ifdef CONFIG_INV_TESTING + ATTR_I2C_COUNTERS, + ATTR_REG_WRITE, +#endif +}; + +enum inv_accl_fs_e { + INV_FS_02G = 0, + INV_FS_04G, + INV_FS_08G, + INV_FS_16G, + NUM_ACCL_FSR +}; ... +int inv_i2c_read_base(struct inv_mpu_iio_s *st, unsigned short i2c_addr, + unsigned char reg, unsigned short length, unsigned char *data); This isn't defined anywhere that I can see? Each patch should stand on its own. If I can't build them one at a time then I reject them. This is vital in a more general sense for kernel development as we HAVE to have a bisectable set of patches. +int inv_i2c_single_write_base(struct inv_mpu_iio_s *st, + unsigned short i2c_addr, unsigned char reg, unsigned char data); int +inv_do_test(struct inv_mpu_iio_s *st, int self_test_flag, + int *gyro_result, int *accl_result); +int mpu_memory_write(struct i2c_adapter *i2c_adap, + unsigned char mpu_addr, + unsigned short mem_addr, + unsigned int len, unsigned char const *data); int +mpu_memory_read(struct i2c_adapter *i2c_adap, + unsigned char mpu_addr, + unsigned short mem_addr, + unsigned int len, unsigned char *data); int +inv_hw_self_test(struct inv_mpu_iio_s *st); + +#define mem_w(a, b, c) mpu_memory_write(st->sl_handle,\ + st->i2c_addr, a, b, c) +#define mem_w_key(key, b, c) mpu_memory_write(st->sl_handle,\ + st->i2c_addr, inv_dmp_get_address(key), b, c) #define +inv_i2c_read(st, reg, len, data) \ + inv_i2c_read_base(st, st->i2c_addr, reg, len, data) #define +inv_i2c_single_write(st, reg, data) \ + inv_i2c_single_write_base(st, st->i2c_addr, reg, data) #define +inv_secondary_read(reg, len, data) \ + inv_i2c_read_base(st, st->plat_data.secondary_i2c_addr, reg, len, +data) #define inv_secondary_write(reg, data) \ + inv_i2c_single_write_base(st, st->plat_data.secondary_i2c_addr, \ + reg, data) +#endif /* #ifndef _INV_MPU_IIO_H_ */ + diff --git a/drivers/staging/iio/imu/mpu6050/inv_mpu_ring.c b/drivers/staging/iio/imu/mpu6050/inv_mpu_ring.c new file mode 100644 index 0000000..528da5f --- /dev/null +++ b/drivers/staging/iio/imu/mpu6050/inv_mpu_ring.c @@ -0,0 +1,44 @@ +/* +* Copyright (C) 2012 Invensense, Inc. +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +*/ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt ... +static void inv_scan_query(struct iio_dev *indio_dev) { + struct inv_mpu_iio_s *st = iio_priv(indio_dev); + struct iio_buffer *ring = indio_dev->buffer; + + if (iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_X) || + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_Y) || + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_Z)) + st->chip_config.gyro_fifo_enable = 1; st->chip_config.gyro_fifo_enable = iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_X) || iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_Y) || iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_Z); + else + st->chip_config.gyro_fifo_enable = 0; + + if (iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_ACCL_X) || + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_ACCL_Y) || + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_ACCL_Z)) + st->chip_config.accl_fifo_enable = 1; + else + st->chip_config.accl_fifo_enable = 0; + + if (iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_MAGN_X) || + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_MAGN_Y) || + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_MAGN_Z)) + st->chip_config.compass_fifo_enable = 1; + else + st->chip_config.compass_fifo_enable = 0; } + +/** + * reset_fifo_itg() - Reset FIFO related registers. + * @st: Device driver instance. + */ +static int reset_fifo_itg(struct iio_dev *indio_dev) { + struct inv_reg_map_s *reg; + int result; + unsigned char val; + struct inv_mpu_iio_s *st = iio_priv(indio_dev); I'd just use st->reg directly, can't see why taking a copy helps other than confusing me slightly ;) + reg = &st->reg; + + inv_scan_query(indio_dev); + /* disable interrupt */ + result = inv_i2c_single_write(st, reg->int_enable, 0); + if (result) { + pr_err("int_enable write failed\n"); + return result; + } + /* disable the sensor output to FIFO */ + result = inv_i2c_single_write(st, reg->fifo_en, 0); + if (result) + goto reset_fifo_fail; .... + return result; +} + As functions go, this one currently doesn't seem to have a great deal of point... drop it, you can always introduce it later if it has more to do. +/** + * inv_reset_fifo() - Reset FIFO related registers. + * @st: Device driver instance. + */ +static int inv_reset_fifo(struct iio_dev *indio_dev) { + return reset_fifo_itg(indio_dev); +} + .... +/** + * inv_clear_kfifo() - clear time stamp fifo + * @st: Device driver instance. + */ +void inv_clear_kfifo(struct inv_mpu_iio_s *st) { + unsigned long flags; + spin_lock_irqsave(&st->time_stamp_lock, flags); + kfifo_reset(&st->timestamps); + spin_unlock_irqrestore(&st->time_stamp_lock, flags); } + ... + +/** + * inv_read_fifo() - Transfer data from FIFO to ring buffer. + */ +irqreturn_t inv_read_fifo(int irq, void *dev_id) { + Bonus blank line here. Yup, I'm getting nitpicky ;) + struct inv_mpu_iio_s *st = (struct inv_mpu_iio_s *)dev_id; + struct iio_dev *indio_dev = iio_priv_to_dev(st); + size_t bytes_per_datum; + int result; + unsigned char data[BYTES_FOR_DMP + QUATERNION_BYTES]; + unsigned short fifo_count; + unsigned int copied; + s64 timestamp; + struct inv_reg_map_s *reg; + s64 buf[8]; + unsigned char *tmp; + reg = &st->reg; Given the number of repeats of checking if anything is turned on, perhaps a inv_anything_enabled inline function might make for shorter easier to read code. + if (!(st->chip_config.accl_fifo_enable | + st->chip_config.gyro_fifo_enable | + st->chip_config.dmp_on | + st->chip_config.compass_fifo_enable)) + goto end_session; ... + +int inv_postenable(struct iio_dev *indio_dev) { + return set_inv_enable(indio_dev, true); bonus blank line. This formatting stuff does matter if you are reviewing a lot of code. Makes it simpler to do. + +} + +int inv_predisable(struct iio_dev *indio_dev) { + return set_inv_enable(indio_dev, false); } + +static const struct iio_buffer_setup_ops inv_mpu_ring_setup_ops = { + .preenable = &iio_sw_buffer_preenable, + .postenable = &inv_postenable, + .predisable = &inv_predisable, +}; + +int inv_mpu_configure_ring(struct iio_dev *indio_dev) { + int ret; + struct inv_mpu_iio_s *st = iio_priv(indio_dev); + struct iio_buffer *ring; + + ring = iio_kfifo_allocate(indio_dev); + if (!ring) + return -ENOMEM; + indio_dev->buffer = ring; + /* setup ring buffer */ + ring->scan_timestamp = true; + indio_dev->setup_ops = &inv_mpu_ring_setup_ops; + /*scan count double count timestamp. should subtract 1. but + number of channels still includes timestamp*/ + ret = request_threaded_irq(st->client->irq, inv_irq_handler, + inv_read_fifo, + IRQF_TRIGGER_RISING | IRQF_SHARED, + "inv_irq", st); + if (ret) + goto error_iio_sw_rb_free; + + return 0; +error_iio_sw_rb_free: + iio_kfifo_free(indio_dev->buffer); + return ret; +} +/** + * @} + */ + diff --git a/drivers/staging/iio/imu/mpu6050/mpu.h b/drivers/staging/iio/imu/mpu6050/mpu.h new file mode 100644 index 0000000..5105fb2 --- /dev/null +++ b/drivers/staging/iio/imu/mpu6050/mpu.h @@ -0,0 +1,15 @@ +/* +* Copyright (C) 2012 Invensense, Inc. +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +*/ + +/** I may be missing something but is this kerneldoc? If not it doesn't belong in a kernel driver... + * @addtogroup DRIVERS + * @brief Hardware drivers. + * + * @{ + * @file mpu.h + * @brief mpu definition + */ + +#ifndef __MPU_H_ +#define __MPU_H_ + +#ifdef __KERNEL__ +#include +#include +#endif + +enum secondary_slave_type { + SECONDARY_SLAVE_TYPE_NONE, + SECONDARY_SLAVE_TYPE_ACCEL, + SECONDARY_SLAVE_TYPE_COMPASS, + SECONDARY_SLAVE_TYPE_PRESSURE, + + SECONDARY_SLAVE_TYPE_TYPES +}; + +}; + +#define INV_PROD_KEY(ver, rev) (ver * 100 + rev) blank line here please. +/** + * struct mpu_platform_data - Platform data for the mpu driver + * @int_config: Bits [7:3] of the int config register. + * @level_shifter: 0: VLogic, 1: VDD + * @orientation: Orientation matrix of the gyroscope + * @sec_slave_type: secondary slave device type, can be compass, accel, etc + * @sec_slave_id: id of the secondary slave device + * @secondary_i2c_address: secondary device's i2c address + * @secondary_orientation: secondary device's orientation matrix + * + * Contains platform specific information on how to configure the MPU3050 to + * work on this platform. The orientation matricies are 3x3 rotation matricies + * that are applied to the data to rotate from the mounting orientation to the + * platform orientation. The values must be one of 0, 1, or -1 and each row and + * column should have exactly 1 non-zero value. + */ +struct mpu_platform_data { why the __ versions? + __u8 int_config; + __u8 level_shifter; + __s8 orientation[9]; + enum secondary_slave_type sec_slave_type; + enum ext_slave_id sec_slave_id; + __u16 secondary_i2c_addr; + __s8 secondary_orientation[9]; + __u8 key[16]; +}; + +#endif /* __MPU_H_ */ -- 1.7.0.4 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from saturn.retrosnub.co.uk ([178.18.118.26]:39735 "EHLO saturn.retrosnub.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750803Ab2GGIvK (ORCPT ); Sat, 7 Jul 2012 04:51:10 -0400 Message-ID: <4FF7F875.4010108@kernel.org> Date: Sat, 07 Jul 2012 09:51:01 +0100 From: Jonathan Cameron MIME-Version: 1.0 To: Ge Gao CC: linux-iio@vger.kernel.org Subject: Re: [PATCH 1/4] IIO: Invensense MPU6050/MPU9150 driver submit References: <4FF6AAD1.2010304@kernel.org> <00805a8e92cea1abfec2379a721e2853@mail.gmail.com> In-Reply-To: <00805a8e92cea1abfec2379a721e2853@mail.gmail.com> Content-Type: text/plain; charset=ISO-8859-1 Sender: linux-iio-owner@vger.kernel.org List-Id: linux-iio@vger.kernel.org On 07/06/2012 06:40 PM, Ge Gao wrote: > Dear Jonathan, > Thank you very much for the advice. I think it is a great idea! I > will put it as two steps. First the data out, second the DMP(Digital > Motion Processing). Actually, data out is most useful one and that's what > most people would use. Cool. > What makes this driver so complex is the DMP. Without it, the > driver would be much simpler. I will rewrite it and re-submit it. > For the code base, I am basing the code on the release version > 3.4.4 from the Linux website. I notice that the newest release candidate > is 3. 5-rc5. Shall I use this as the base or I should always use the > latest release candidate? Ultimately the drivers will go through the staging-next tree http://git.kernel.org/?p=linux/kernel/git/stable/staging.git;a=summary I send pull requests to Greg KH and he deals with pushing them onwards. For reference my tree is at http://git.kernel.org/?p=linux/kernel/git/jic23/iio.git;a=summary as stuff can sit there for a few days before going into Greg's tree. Things will probably continue going through the staging tree (even if out of staging) purely because so many patches effect stuff that is still in there. > I found that the 3.5-rc5 has moved the iio driver out of staging > and KFIFO become the only choice. However, it still lacks the poll > feature. I posted poll patches just the other day. Waiting for feedback. Lars-Peter is testing them. For now you'll have to pull them off the mailing list (or I might push out a 'working' branch later if I get time). > As for the DMP loading, I was trying to use the standard way, > request_firmware. However, it is a hotplug mechanism and need a "Daemon" > to function. I run my system on Panda board and I didn't see hotplug being > triggered when I try to run it. That's why I switched to a more "manual" > way to load firmware. MPU6050/MPU9150 can run without firmware. The > firmware is only for DMP purpose; if no DMP function is required, no > firmware should be loaded. So it can be chosen load or not. Without DMP, > MPU6050/9150 would just output data. Nothing else. I'm afraid I'm not that familiar with the firmware loading stuff, but there must be a way of doing it as it occurs on plenty of embedded boards (typically for wifi chips). Maybe ask on the panda board lists? > I will rewrite the code again as we discussed and resubmit. Thank > you for advice. You are welcome. Looking forward to the next version. > > Best Regards, > > Ge GAO > > > -----Original Message----- > From: Jonathan Cameron [mailto:jic23@kernel.org] > Sent: Friday, July 06, 2012 2:07 AM > To: Ge Gao > Cc: linux-iio@vger.kernel.org > Subject: Re: [PATCH 1/4] IIO: Invensense MPU6050/MPU9150 driver submit > > Hi Ge, > > Please don't get disheartened by this partial review. > Getting use to approaches to getting kernel drivers merged can take a > considerable time. It's not a trivial thing to do even with a 'perfect' > driver. There is a lot of nice / interesting stuff in your driver so I > look forward to seeing it move forward! I doubt we'll get any more > complex hardware anytime soon! > > Couple of major comments. > > 1) This first patch could benefit from breaking up futher. Right now it's > too big and cumbersome to review remotely quickly. > First separate off the docs into their own patch. > Then I'd pull out the DMP code into a follow up patch. > That way we can get the core stuff sorted relatively quickly before it > gets to complex. > > Actually the best way to get this in would be to strip nearly everything > back so just have your basic data flow through the fifo. No events or > motion processing or anything unusual in the first patch. Then we can > review that very quickly and get something in place to make incremental > extensions to. > > All in all it is too big to get reviewed. Sorry, but patches really need > to be inline emails if you want to have a reasonable chance of getting > eyes on them. There are a number of people on the mailing list who will > take a look at new drivers when they have a few minutes spare. This first > file has taken me over > 2 hours to review and what I have done is far from thorough. > > Anyhow some comments in line. Mostly the code looks pretty clean and there > are some good docs which always helps. > > 2) I may not have made it clear enough before, but you are pretty much not > going to succeeed in having your own versions of drivers that already > exist. That sort of code replication gets a lot of friction upstream. > > What you need to do is to write a i2c master driver and then attach your > secondary devices to this. Where you need additional features in those > drivers, propose them and if they are not too invasive I doubt anyone will > mind. Although you only have a couple of slave devices here, seeing your > table of id's shows there will be a lot more to come. > > If there is an absolute reason why this approach won't work, you need to > convince people with a careful brief arguement 'before' this goes > anywhere. > > Anyhow Ge good luck with this one. I might get a chance to take a look at > the other patches, but it'll be a while give their size. Sorry, but the > short easy to review ones tend to get attended to first! > > Jonathan > > From 6d4093a59d77a68d4972f648ea9eba69e8598159 Mon Sep 17 00:00:00 2001 > From: Ge Gao > Date: Thu, 28 Jun 2012 10:58:12 -0700 > Subject: [PATCH 1/4] Invensense MPU6050/MPU9150 driver. > > --MPU6050/MPU9150 driver. > --Secondary bus for AKM8975/AKM8963/AKM8972 support. > --kernel fix for Kfifo poll support from Jonanthan. > --Kfifo bug fix. Need to check available space before store. > --add new IIO type for quaternion. > > ... > index 0000000..c4fa2c2 > --- /dev/null > +++ b/drivers/staging/iio/imu/mpu6050/Kconfig > @@ -0,0 +1,6 @@ > +# > +# inv-mpu-6050 drivers for Invensense MPU devices and combos # > + > +config INV_MPU6050_IIO > + tristate "Invensense MPU6050 devices" > Will need to drop the !INV_MPU bit from the patch (and put it back in your > local tree). > + depends on I2C && SYSFS && IIO && IIO_KFIFO_BUF && !INV_MPU && > !INV_MPU_IIO > + default n > + help > + This driver supports the Invensense MPU6050/MPU9150 devices. It > also > + supports AKM8975/AKM8963/AKM8972 in the secondary bus. > Ideally you want to build this text up as stuff is added (guessing not all > of this is in the initial patch!) > + This driver can be built as a module. The module will be called > + inv-mpu6050-iio. > Not keen on the naming, inv-mpu6050 then if you need to change it for your > local tree do it in a patch there. > > ... > > diff --git a/drivers/staging/iio/imu/mpu6050/README > b/drivers/staging/iio/imu/mpu6050/README > new file mode 100644 > index 0000000..806a956 > --- /dev/null > +++ b/drivers/staging/iio/imu/mpu6050/README > @@ -0,0 +1,11 @@ > +Kernel driver inv-mpu-iio > +Author: Invensense > + > +Description > +----------- > +This document describes how to install the Invensense device driver > +into a Linux kernel. At the moment, this driver supports the > +MPU6050/MPU9150. The slave address of these four chips are > +0x68 or 0x69. However, the actual slave address depends on the board > +configuration. The driver does not assume anything about it. > + > I would have prefered the documentation in a separate patch. > Also, lots of this needs 'adjusting' to take into account that the driver > will be in the main tree. > > +Files included in this package: > +Kconfig > +Makefile > +inv_mpu_core.c > +inv_mpu_misc.c > +inv_mpu_iio.h > +inv_mpu_ring.c > +dmpDefaultMPU6050.c > +dmpkey.h > +dmpmap.h > +mpu.h > +Including the driver in the Linux kernel > +---------------------------------------- > +mpu.h should be added to "kernel/include/linux". > +Other files listed should be added to the drivers/staging/iio/imu/mpu > +directory (or another directory of your choosing). When building the > +kernel, the driver will not appear in menuconfig without modifications > +similar to those below: > + > +modify "drivers/staging/iio/imu/Kconfig" like source > +"drivers/staging/iio/imu/mpu/Kconfig" > + > +modify "drivers/staging/iio/imu/Makefile" > +obj-y += mpu/ > + > +Board and Platform Data > +----------------------- > +The board file needs to be modified to register the device on an I2C > bus. An > +i2c_board_info instance must be defined as seen below. The hardcoded > value of > +140 corresponds to the GPIO input pin wired to the device's interrupt > pin. > +This pin will most likely be different for your platform. > +platform data is for orientation matrix, and secondary bus situations. > +For MPU9150, it is regarded as a MPU9150 and AKM8975 in the secondary. > +So the secondary i2c address must be filled. > +----------------------------------------------------------------- > +The board file is arch/arm/mach-omap2/board-omap4panda.c for panda > +board or modify the board file in your system as below: > +-------------------------------------------------------- > good examples for the platform data. I'm not sure I'd spend as much time > talking about how to register it for a given board. > That stuff is pretty standard. > +For AKM8963 in the secondary i2c bus of MPU6050, static struct > +mpu_platform_data gyro_platform_data = { > + .int_config = 0x10, > + .level_shifter = 0, > + .orientation = { -1, 0, 0, > + 0, 1, 0, > + 0, 0, -1 }, > + .sec_slave_type = SECONDARY_SLAVE_TYPE_COMPASS, > + .sec_slave_id = COMPASS_ID_AK8963, > + .secondary_i2c_addr = 0x0E > +}; > ... > + > +IIO subsystem > +---------------------------------------------- > +successful installation will create two directories under > /sys/bus/iio/devices > +iio:device0 > +trigger0 > +Under /dev/ diretory, a file "iio:device0" will also be created(or > iio:deviceX, if > +you have more than one iio devices). > This stuff is all good, but ideally it would go in a more generic document > where it isn't already covered. That way we don't have to edit more than > one if anything changes! > +Communicating with the driver in userspace > +------------------------------------------ > +Upon installation, the driver generates several files in sysfs. If your > +platform is configured as detailed above, navigate to the following > +path to find these files: > +/sys/bus/iio/devices/iio:device0 > + > +The list below provides a brief description for each file. > +-------------------------------------- > Firstly these need documenting in > Documentation/abi/testing/syfs-bus-iio-mpu6050 or similar using the > standard formats found in there. > > +For MPU6050: > +temperature (Read-only) > +Read temperature data directly from the temperature register. > Not abi compliant in_temp_input probably. > + > +sampling_frequency (Read/write) > +Configure the ADC sampling rate and FIFO output rate. > + > +sampling_frequency_available(read-only) > +show commonly used frequency > + > +clock_source (Read-only) > +Check which clock-source is used by the chip. > What controls this? I'd be tempted to drop it as not terribly useful to > the user if they can't change it. > Probably a debugging aid? > + > +power_state (Read/write) > +turn on/off the power supply > + > +self_test (read-only) > +read this entry trigger self test. The return value is D. > +D is the success/fail. > +For different chip, the result is different for success/fail. > +1 means success 0 means fail. The LSB of D is for gyro; the bit next to > +LSB of D is for accel. The bit 2 of D is for compass result. > That's in the magic value category. If you do need a self test like this, > make it output a nice string to say what happened. > > + > +key (read-only) > +show the key value of this driver. Used by MPL. > Define the acronym! > + > +gyro_matrix (read-only) > +show the orient matrix obtained from board file. > why? > + > +gyro_enable (read/write) > +enable/disable gyro functionality. affect raw_gyro. turn off this will > +shut down gyro and save power. > If the startup time is not horendous do this dynamically. E.g. bring it up > when a reading is requested or if it in use by the buffered interfaces. > + > +accl_enable (read/write) > +enable/disable accelerometer functionality. affect raw_accl. > +turn off this will shut down accel and save power. > + > +firmware_loaded (read/write) > +Flag indicate the whether firmware is loaded or not in the DMP engine. > +0 means no firmware loaded. 1 means firmware is already loaded . This > +flag can only be written as 0. 1 is updated internally. > Not sure this should be exposed to the users. Firmware should always be > loaded and done automatically before the device interfaces appear. > If there is another reason for this, please give details. > + > +dmp_on(read/write) > +This entry controls whether to run DMP or not. To enable DMP , > +firmware_loaded must be 1. write 1 to enable DMP and write 0 to disable > dmp. > + > +dmp_in_on(read/write) > +This entry controls whether dmp interrupt is on/off. firmware_loaded > +must be 1. sometimes, it is desirable that interrupt is off while DMP > +is > running. > This is definitely not something that should be exposed to userspace. Work > out when it is 'desirable' and do the appropriate control in driver. > + > +dmp_event_int_on(read/write) > +This entry controls whether dmp event interrupt is on/off. Setting this > +on would turn off the data interrupt and turn on the event interrupt. > +No data interrupt would be generated. Only when event happens, does an > +interrupt generate. This can be used in power saving mode when system > +is waiting for a special event to wake up. > Again, raw interrupt controls like this are not abi compliant and should > not be exposed to the user. It is far from obvious when users will want > this and when they will not. If it is useful in power saving mode then > enable it, if not don't.. > + > +dmp_firmware (write only binary file) > +This is the entry that firmware code is loaded into. If the action is > succeful, > +firmware_loaded will be updated as 1. In order to load new firmware, > +firmware_loaded flag should be set 0. > No. Sorry, but the kernel has standard ways of loading firmware. Those are > what you need to use. > + > +lpa_mode(read-write) > +Low power accelerometer mode > +lpa_freq(read-write) > +low power acceleromter frequency. > Hmm.. There are drivers doing this sort of thing but it generalises very > badly. > What result does it actually have on the accelerometer? I'd much rather > it was controlled by dropping into this if they frequency was set > appropriately rather than via this exta control > + > +accel_matrix > +orient matrix for accel > in_accel_orientation_matrix perhaps? Needs to be associated with the > channels explicitly. > + > +flick_lower, > +flick_upper, > +flick_counter, > +flick_message_on, > +flick_int_on, > +flick_axis, > +Flick related entry > That's pretty opaque. Thes probably want to be mapped to the standard > event types and those extended if necessary. Certainly don't want to be > here. > + > +pedometer_time > +pedometer_steps, > +Pedometer related entry > Cool. Not see that before. Probably want to do that with a new channel > type. No reason we won't get more pedometers at some point. > > + > +event_flick > +event_tap > +event_orientation > +event_display_orientation > +event related entry. These entry must use poll to read. > Using poll in sysfs is pretty heavily frowned upon except for extremely > unlikely error conditions. These need to go through the event interface > of iio. > If we > need to extend that to handle them then by all means send patches to do > so. > + > +tap_on > +control tap function of DMP > + > +dmp_int_on > +turn on/off dmp interrupt. > you have both dmp_in_on and dmp_int_on. I don't like either ;) > + > +dmp_output_rate > +control dmp output rate when dmp is on. > That's another 'sampling frequency' for the relevant channels. > + > +tap_time > +tap_min_count > +tap_threshold > +tap related entries. control various parameters of tap function. > More stuff that needs to go through the event interface. > + > +orientation_on > +turn on/off orientation function of DMP. > Hmm.. Is this for power reasons? We really need to start a discussion > about fine grained power control for this sort of device. Right now I > think you may have to drop it or control it via the enabled channels on > the buffered interface. > + > +display_orientation_on > +turn on/off display orientation function of DMP. > + > +quaternion_on > +turn on/off quaterniion data output. must use DMP. > +------------------------------------------------------------------- > +for MPU9150 and secondary compass > +MPU9150 has every entry MPU6050 has. It has additional entries: > + > +compass_enable (read/write) > +enable this will enable compass function. > + > +compass_matrix (read-only) > +compass orient matrix > Need to map to normal channel types (or add one if this doesn't map to a > magnetometer?) > +----------------------------------------------------------------------- > +----------- > +low power accelerometer mode > +Lower power accelerometer mode is a special mode. It works only for > accelerometer. > +It has two entries, lpa_mode and lpa_freq. Only MPU6050 and MPU9150 has > this mode. > +To run low power accel mode, set lpa_mode to 1, set lpa_freq to 0~3, > which corresponds > +to 1.25Hz, 5Hz, 20Hz, 40Hz. "gyro_enable" and "compass_enable" must be > zero. "dmp_on" > +must be zero. > Then enable it automatically if the acceleration is all that is enabled > and the frequency is one of those. > +----------------------------------------------------------------------- > +------------ > +dmp event. > +dmp event is event out by the DMP unit inside MPU. Only MPU6050 and > MPU9150 supports this. > +There are four sysfs entreis, event_flick, event_tap and > event_orientation and > entries > +event_display_orientation. These four events must be polled before > +read. The proper method to poll sysfs is: > +1. open file. > +2. dummy read. > +3. poll. > +4. once the poll passed, use fopen and fread to read the sysfs entry. > +5. interpret the data. > Nope. These need to come out of a proper event interface. The load > involved in doing polling on sysfs is huge and gets very rude responses > from GregKH and others. > As this patch will go via Greg after me, you really don't want to do this! > +----------------------------------------------------------------------- > +------- If streaming to a userspace application, the recommended way to > +access > gyro/accel/compass > +data is via /dev/iio:device0. Follow these steps to get constant > readings from > +the driver: > It will only be /dev/iio:device[0] if this is the first iio device > added.... > + > +1. Write a 1 to power_state to turn on the chip. This is the default > setting > + after installing the driver. > +2. Write the desired output rate to fifo_rate. > err. fifo_rate is documented. It is probably what we would normally map > to sampling_frequency. I'm guessing there may be additional sampling > frequencies for the motion calculation units? We may need to think hard > about how to control those? To my mind there ought to be an 'ideal' set > of values for a given output rate from the firmware processing. > +3. write 1 to enable to turn on the event. > +4. Read /dev/iio:device0 to get a string of gyro/accel/compass data. > +5. Parse this string to obtain each gyro/accel/compass element. > +6. If dmp firmware code is loaded, using "dmp_on" to enable/disable dmp . > +7. If compass is enabled, output will have compass data. > +========================================================================= > == > + Recommended sysfs entry setup senquence 1. without > +DMP firmware > +1.1 set "power_state" to 1, > +1.2 change scale and fifo rate value to your need. > +1.3 change gyro_enable and accle_enable and compass_enable to your > needs. For example, > +if you want gyro only, set accl_enable to 0 or set accl_enable to zero > and compass_enable to zero. > +If you want accel only, set gyro_enable to 0 or set gyro_enable to zero > and compass_enable to zero. > +If you want compass only, disable gyro and accel. > +1.4 set "enable" to 1. you will get output you want. > + > +2. With DMP firmware > +2.1 set "power_state" to 1, > +2.2 write "0" to firmware_loaded if it is not zero already. > +2.3 load firmware into "dmp_firmware" as a whole. Don't split the DMP > firmware image. > +2.4 make sure firmware_loaded is 1 after loading. > +2.5 make other configurations similar to the situation as without DMP > firmware. > +2.6 set dmp_on to 1. > +2.7 set "enable" to 1. > +======================================================= > +The enable function is using enable entry under > "/sys/bus/iio/devices/iio:device0/buffer" > +========================================================== > +test applications: > +Test application is mpu_iio > provided here? > +------------------------------------------ > +To run with MPU9150/MPU6050: > +using the following command: > +for orientation/tap/flick/display orientation event: > +mpu_iio -c 10 -l 3 -p > +for normal data print > +mpu_iio -c 10 -l 3 -r > +---------------------------------------- > +Please use mpu_iio.c and iio_utils.h as the sample code for your > development. > diff --git a/drivers/staging/iio/imu/mpu6050/dmpDefaultMPU6050.c > b/drivers/staging/iio/imu/mpu6050/dmpDefaultMPU6050.c > new file mode 100644 > index 0000000..5803643 > --- /dev/null > +++ b/drivers/staging/iio/imu/mpu6050/dmpDefaultMPU6050.c > @@ -0,0 +1,16 @@ > +/* > + * Copyright (C) 2012 Invensense, Inc. > + * > + * This software is licensed under the terms of the GNU General Public > + * License version 2, as published by the Free Software Foundation, and > + * may be copied, distributed, and modified under those terms. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + */ > +#include "dmpKey.h" > +#include "dmpmap.h" > + > Some of these are less than entirely obvious. Perhaps some comments would > help? > +#define CFG_27 (2745) > ... > + > I hate to point out the obvious, but a macro might serve better here. > #define D(a, b) (a*256 + b) > +#define D_1_2 (256 + 2) > +#define D_1_4 (256 + 4) > ... > > + > +#define D_HOST_NO_MOT (976) > + > So a lot of the above is about providing the config? > Loose the defines and put them straight into here e.g. > > static const struct tkeyLabel dmpTConfig[] = { > {KEY_CFG_27, 2745}, etc. > +static const struct tKeyLabel dmpTConfig[] = { > + {KEY_CFG_27, CFG_27}, > + {KEY_CFG_20, CFG_20}, > .... > > +}; > +#define NUM_LOCAL_KEYS (sizeof(dmpTConfig)/sizeof(dmpTConfig[0])) > kernel has ARRAY_SIZE macro > + > +static struct tKeyLabel keys[NUM_KEYS]; > + > +unsigned short inv_dmp_get_address(unsigned short key) { > + static int isSorted; > Is this going to play well if you have more than one of your chips > present? > Possibly, I haven't really thought it through! > + if (!isSorted) { > + int kk; > + for (kk = 0; kk < NUM_KEYS; ++kk) { > + keys[kk].addr = 0xffff; > + keys[kk].key = kk; > + } > + for (kk = 0; kk < NUM_LOCAL_KEYS; ++kk) > + keys[dmpTConfig[kk].key].addr = > dmpTConfig[kk].addr; > + isSorted = 1; > + } > + if (key >= NUM_KEYS) > + return 0xffff; > + return keys[key].addr; > +} > +/** > + * @} > + */ > diff --git a/drivers/staging/iio/imu/mpu6050/dmpKey.h > b/drivers/staging/iio/imu/mpu6050/dmpKey.h > new file mode 100644 > index 0000000..e8e1951 > --- /dev/null > +++ b/drivers/staging/iio/imu/mpu6050/dmpKey.h > @@ -0,0 +1,16 @@ > +/* > + * Copyright (C) 2012 Invensense, Inc. > + * > + * This software is licensed under the terms of the GNU General Public > + * License version 2, as published by the Free Software Foundation, and > + * may be copied, distributed, and modified under those terms. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + */ > +#ifndef DMPKEY_H__ > +#define DMPKEY_H__ > + > Not sure the stringing them off the previous is a good idea. > If they really are always like this, then use an enum instead. > +#define KEY_CFG_25 (0) > +#define KEY_CFG_24 (KEY_CFG_25 + 1) > ,,, > > + > +struct tKeyLabel { > + unsigned short key; > + unsigned short addr; > +}; > + > This is an 'interesting' set of defines. > Why not just use the value in the code? > Or for that matter put them in order... > > +#define DINA0A 0x0a > +#define DINA22 0x22 > ... > + > +#endif > diff --git a/drivers/staging/iio/imu/mpu6050/dmpmap.h > b/drivers/staging/iio/imu/mpu6050/dmpmap.h > new file mode 100644 > index 0000000..420e19d > --- /dev/null > +++ b/drivers/staging/iio/imu/mpu6050/dmpmap.h > @@ -0,0 +1,17 @@ > +/* > +* Copyright (C) 2012 Invensense, Inc. > +* > +* This software is licensed under the terms of the GNU General Public > +* License version 2, as published by the Free Software Foundation, and > +* may be copied, distributed, and modified under those terms. > +* > +* This program is distributed in the hope that it will be useful, > +* but WITHOUT ANY WARRANTY; without even the implied warranty of > +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +* GNU General Public License for more details. > +* > +*/ > + > +#ifndef DMPMAP_H > +#define DMPMAP_H > + > If we are going to have this, perhaps have some documenation? > Also it's only included from one place that I can see. Just flatten it in > there and drop this header. > > +#define DMP_PTAT 0 > +#define DMP_XGYR 2 > ... > + > +#endif > diff --git a/drivers/staging/iio/imu/mpu6050/inv_mpu_iio.h > b/drivers/staging/iio/imu/mpu6050/inv_mpu_iio.h > new file mode 100644 > index 0000000..0958d4a > --- /dev/null > +++ b/drivers/staging/iio/imu/mpu6050/inv_mpu_iio.h > @@ -0,0 +1,25 @@ > +/* > +* Copyright (C) 2012 Invensense, Inc. > +* > +* This software is licensed under the terms of the GNU General Public > +* License version 2, as published by the Free Software Foundation, and > +* may be copied, distributed, and modified under those terms. > +* > +* This program is distributed in the hope that it will be useful, > +* but WITHOUT ANY WARRANTY; without even the implied warranty of > +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +* GNU General Public License for more details. > +* > +*/ > + > +#ifndef _INV_MPU_IIO_H_ > +#define _INV_MPU_IIO_H_ > + > +#include > +#include > +#include > +#include > +#include > +#include "./mpu.h" > +#include "../../iio.h" > +#include "../../buffer.h" > Do these as etc. > Actually you seem to be on a somewhat out of data tree. You'll want to > rebase on staging/staging-next before the next submission. > > +#include "dmpKey.h" > +/** > Nice docs. Thanks. > + * struct inv_reg_map_s - Notable slave registers. > + * @sample_rate_div: Divider applied to gyro output rate. > + * @lpf: Configures internal LPF. > Spell it out, low_pass_filter (I guess?) > + * @bank_sel: Selects between memory banks. > + * @user_ctrl: Enables/resets the FIFO. > + * @fifo_en: Determines which data will appear in FIFO. > + * @gyro_config: gyro config register. > + * @accl_config: accel config register > + * @fifo_count_h: Upper byte of FIFO count. > + * @fifo_r_w: FIFO register. > + * @raw_gyro Address of first gyro register. > + * @raw_accl Address of first accel register. > + * @temperature temperature register > + * @int_enable: Interrupt enable register. > + * @int_status: Interrupt flags. > + * @pwr_mgmt_1: Controls chip's power state and clock source. > + * @pwr_mgmt_2: Controls power state of individual sensors. > + * @mem_start_addr: Address of first memory read. > + * @mem_r_w: Access to memory. > + * @prgm_strt_addrh firmware program start address register > + */ > +struct inv_reg_map_s { > + unsigned char sample_rate_div; > As in kernel, u8 is the right type to use. > + unsigned char lpf; > .... > + const short *compass_st_lower; > + short irq; > + int accel_bias[3]; > + int gyro_bias[3]; > I'd use fixed length types s16 perhaps? > + short raw_gyro[3]; > + short raw_accel[3]; > + short raw_compass[3]; > + unsigned char compass_scale; > + unsigned char i2c_addr; > + unsigned char compass_divider; > + unsigned char compass_counter; > + unsigned char sample_divider; > + unsigned char fifo_divider; > + unsigned char orient_data; > + unsigned char display_orient_data; > + unsigned char tap_data; > + enum inv_channel_num num_channels; > + void *sl_handle; > + unsigned int irq_dur_ns; > + long long last_isr_time; > +#ifdef CONFIG_INV_TESTING > + unsigned long i2c_readcount; > + unsigned long i2c_writecount; > +#endif > +}; > + > > + int (*setup)(struct inv_mpu_iio_s *); > + int (*combine_data)(unsigned char *in, short *out); > + int (*get_mode)(struct inv_mpu_iio_s *); > + int (*set_lpf)(struct inv_mpu_iio_s *, int rate); > + int (*set_fs)(struct inv_mpu_iio_s *, int fs); }; > + > Are these specific to your handling or to the AKM chips themselves? > If the akm chips, should be in a separate header. > I'd much rather see a generic driver for these with the extra hooks you > need rather than rolling them into your driver and having lots of code > repitition. > > +/* AKM definitions */ > +#define REG_AKM_ID 0x00 > +#define REG_AKM_STATUS 0x02 > +#define REG_AKM_MEASURE_DATA 0x03 > +#define REG_AKM_MODE 0x0A > +#define REG_AKM_ST_CTRL 0x0C > > ... > + ATTR_COMPASS_ENABLE, > + ATTR_POWER_STATE, > + ATTR_FIRMWARE_LOADED, > Clear these out, or do them as a debugfs interface as some other drivers > use. > +#ifdef CONFIG_INV_TESTING > + ATTR_I2C_COUNTERS, > + ATTR_REG_WRITE, > +#endif > +}; > + > +enum inv_accl_fs_e { > + INV_FS_02G = 0, > + INV_FS_04G, > + INV_FS_08G, > + INV_FS_16G, > + NUM_ACCL_FSR > +}; > ... > +int inv_i2c_read_base(struct inv_mpu_iio_s *st, unsigned short i2c_addr, > + unsigned char reg, unsigned short length, unsigned char *data); > This isn't defined anywhere that I can see? Each patch should stand on its > own. If I can't build them one at a time then I reject them. This is > vital in a more general sense for kernel development as we HAVE to have a > bisectable set of patches. > > +int inv_i2c_single_write_base(struct inv_mpu_iio_s *st, > + unsigned short i2c_addr, unsigned char reg, unsigned char data); > int > +inv_do_test(struct inv_mpu_iio_s *st, int self_test_flag, > + int *gyro_result, int *accl_result); > +int mpu_memory_write(struct i2c_adapter *i2c_adap, > + unsigned char mpu_addr, > + unsigned short mem_addr, > + unsigned int len, unsigned char const *data); > int > +mpu_memory_read(struct i2c_adapter *i2c_adap, > + unsigned char mpu_addr, > + unsigned short mem_addr, > + unsigned int len, unsigned char *data); int > +inv_hw_self_test(struct inv_mpu_iio_s *st); > + > +#define mem_w(a, b, c) mpu_memory_write(st->sl_handle,\ > + st->i2c_addr, a, b, c) > +#define mem_w_key(key, b, c) mpu_memory_write(st->sl_handle,\ > + st->i2c_addr, inv_dmp_get_address(key), b, c) > #define > +inv_i2c_read(st, reg, len, data) \ > + inv_i2c_read_base(st, st->i2c_addr, reg, len, data) #define > +inv_i2c_single_write(st, reg, data) \ > + inv_i2c_single_write_base(st, st->i2c_addr, reg, data) #define > +inv_secondary_read(reg, len, data) \ > + inv_i2c_read_base(st, st->plat_data.secondary_i2c_addr, reg, len, > +data) #define inv_secondary_write(reg, data) \ > + inv_i2c_single_write_base(st, st->plat_data.secondary_i2c_addr, \ > + reg, data) > +#endif /* #ifndef _INV_MPU_IIO_H_ */ > + > diff --git a/drivers/staging/iio/imu/mpu6050/inv_mpu_ring.c > b/drivers/staging/iio/imu/mpu6050/inv_mpu_ring.c > new file mode 100644 > index 0000000..528da5f > --- /dev/null > +++ b/drivers/staging/iio/imu/mpu6050/inv_mpu_ring.c > @@ -0,0 +1,44 @@ > +/* > +* Copyright (C) 2012 Invensense, Inc. > +* > +* This software is licensed under the terms of the GNU General Public > +* License version 2, as published by the Free Software Foundation, and > +* may be copied, distributed, and modified under those terms. > +* > +* This program is distributed in the hope that it will be useful, > +* but WITHOUT ANY WARRANTY; without even the implied warranty of > +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +* GNU General Public License for more details. > +* > +*/ > + > +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt > ... > > +static void inv_scan_query(struct iio_dev *indio_dev) { > + struct inv_mpu_iio_s *st = iio_priv(indio_dev); > + struct iio_buffer *ring = indio_dev->buffer; > + > + if (iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_X) || > + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_Y) || > + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_Z)) > + st->chip_config.gyro_fifo_enable = 1; > st->chip_config.gyro_fifo_enable = > iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_X) || > iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_Y) || > iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_GYRO_Z); > + else > + st->chip_config.gyro_fifo_enable = 0; > + > + if (iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_ACCL_X) || > + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_ACCL_Y) || > + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_ACCL_Z)) > + st->chip_config.accl_fifo_enable = 1; > + else > + st->chip_config.accl_fifo_enable = 0; > + > + if (iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_MAGN_X) || > + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_MAGN_Y) || > + iio_scan_mask_query(indio_dev, ring, INV_MPU_SCAN_MAGN_Z)) > + st->chip_config.compass_fifo_enable = 1; > + else > + st->chip_config.compass_fifo_enable = 0; } > + > +/** > + * reset_fifo_itg() - Reset FIFO related registers. > + * @st: Device driver instance. > + */ > +static int reset_fifo_itg(struct iio_dev *indio_dev) { > + struct inv_reg_map_s *reg; > + int result; > + unsigned char val; > + struct inv_mpu_iio_s *st = iio_priv(indio_dev); > I'd just use st->reg directly, can't see why taking a copy helps other > than confusing me slightly ;) > + reg = &st->reg; > + > + inv_scan_query(indio_dev); > + /* disable interrupt */ > + result = inv_i2c_single_write(st, reg->int_enable, 0); > + if (result) { > + pr_err("int_enable write failed\n"); > + return result; > + } > + /* disable the sensor output to FIFO */ > + result = inv_i2c_single_write(st, reg->fifo_en, 0); > + if (result) > + goto reset_fifo_fail; > .... > + return result; > +} > + > > As functions go, this one currently doesn't seem to have a great deal of > point... drop it, you can always introduce it later if it has more to do. > +/** > + * inv_reset_fifo() - Reset FIFO related registers. > + * @st: Device driver instance. > + */ > +static int inv_reset_fifo(struct iio_dev *indio_dev) { > + return reset_fifo_itg(indio_dev); > +} > + > .... > +/** > + * inv_clear_kfifo() - clear time stamp fifo > + * @st: Device driver instance. > + */ > +void inv_clear_kfifo(struct inv_mpu_iio_s *st) { > + unsigned long flags; > + spin_lock_irqsave(&st->time_stamp_lock, flags); > + kfifo_reset(&st->timestamps); > + spin_unlock_irqrestore(&st->time_stamp_lock, flags); } > + > ... > + > +/** > + * inv_read_fifo() - Transfer data from FIFO to ring buffer. > + */ > +irqreturn_t inv_read_fifo(int irq, void *dev_id) { > + > Bonus blank line here. Yup, I'm getting nitpicky ;) > + struct inv_mpu_iio_s *st = (struct inv_mpu_iio_s *)dev_id; > + struct iio_dev *indio_dev = iio_priv_to_dev(st); > + size_t bytes_per_datum; > + int result; > + unsigned char data[BYTES_FOR_DMP + QUATERNION_BYTES]; > + unsigned short fifo_count; > + unsigned int copied; > + s64 timestamp; > + struct inv_reg_map_s *reg; > + s64 buf[8]; > + unsigned char *tmp; > + reg = &st->reg; > Given the number of repeats of checking if anything is turned on, perhaps > a inv_anything_enabled inline function might make for shorter easier to > read code. > + if (!(st->chip_config.accl_fifo_enable | > + st->chip_config.gyro_fifo_enable | > + st->chip_config.dmp_on | > + st->chip_config.compass_fifo_enable)) > + goto end_session; > ... > + > +int inv_postenable(struct iio_dev *indio_dev) { > + return set_inv_enable(indio_dev, true); > bonus blank line. This formatting stuff does matter if you are reviewing > a lot of code. Makes it simpler to do. > + > +} > + > +int inv_predisable(struct iio_dev *indio_dev) { > + return set_inv_enable(indio_dev, false); } > + > +static const struct iio_buffer_setup_ops inv_mpu_ring_setup_ops = { > + .preenable = &iio_sw_buffer_preenable, > + .postenable = &inv_postenable, > + .predisable = &inv_predisable, > +}; > + > +int inv_mpu_configure_ring(struct iio_dev *indio_dev) { > + int ret; > + struct inv_mpu_iio_s *st = iio_priv(indio_dev); > + struct iio_buffer *ring; > + > + ring = iio_kfifo_allocate(indio_dev); > + if (!ring) > + return -ENOMEM; > + indio_dev->buffer = ring; > + /* setup ring buffer */ > + ring->scan_timestamp = true; > + indio_dev->setup_ops = &inv_mpu_ring_setup_ops; > + /*scan count double count timestamp. should subtract 1. but > + number of channels still includes timestamp*/ > + ret = request_threaded_irq(st->client->irq, inv_irq_handler, > + inv_read_fifo, > + IRQF_TRIGGER_RISING | IRQF_SHARED, > + "inv_irq", st); > + if (ret) > + goto error_iio_sw_rb_free; > + > + return 0; > +error_iio_sw_rb_free: > + iio_kfifo_free(indio_dev->buffer); > + return ret; > +} > > +/** > + * @} > + */ > + > diff --git a/drivers/staging/iio/imu/mpu6050/mpu.h > b/drivers/staging/iio/imu/mpu6050/mpu.h > new file mode 100644 > index 0000000..5105fb2 > --- /dev/null > +++ b/drivers/staging/iio/imu/mpu6050/mpu.h > @@ -0,0 +1,15 @@ > +/* > +* Copyright (C) 2012 Invensense, Inc. > +* > +* This software is licensed under the terms of the GNU General Public > +* License version 2, as published by the Free Software Foundation, and > +* may be copied, distributed, and modified under those terms. > +* > +* This program is distributed in the hope that it will be useful, > +* but WITHOUT ANY WARRANTY; without even the implied warranty of > +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +* GNU General Public License for more details. > +* > +*/ > + > +/** > I may be missing something but is this kerneldoc? If not it doesn't belong > in a kernel driver... > + * @addtogroup DRIVERS > + * @brief Hardware drivers. > + * > + * @{ > + * @file mpu.h > + * @brief mpu definition > + */ > + > +#ifndef __MPU_H_ > +#define __MPU_H_ > + > +#ifdef __KERNEL__ > +#include > +#include > +#endif > + > +enum secondary_slave_type { > + SECONDARY_SLAVE_TYPE_NONE, > + SECONDARY_SLAVE_TYPE_ACCEL, > + SECONDARY_SLAVE_TYPE_COMPASS, > + SECONDARY_SLAVE_TYPE_PRESSURE, > + > + SECONDARY_SLAVE_TYPE_TYPES > +}; > + > +}; > + > +#define INV_PROD_KEY(ver, rev) (ver * 100 + rev) > blank line here please. > +/** > + * struct mpu_platform_data - Platform data for the mpu driver > + * @int_config: Bits [7:3] of the int config register. > + * @level_shifter: 0: VLogic, 1: VDD > + * @orientation: Orientation matrix of the gyroscope > + * @sec_slave_type: secondary slave device type, can be compass, > accel, etc > + * @sec_slave_id: id of the secondary slave device > + * @secondary_i2c_address: secondary device's i2c address > + * @secondary_orientation: secondary device's orientation matrix > + * > + * Contains platform specific information on how to configure the > MPU3050 to > + * work on this platform. The orientation matricies are 3x3 rotation > matricies > + * that are applied to the data to rotate from the mounting orientation > to the > + * platform orientation. The values must be one of 0, 1, or -1 and > each row and > + * column should have exactly 1 non-zero value. > + */ > +struct mpu_platform_data { > why the __ versions? > + __u8 int_config; > + __u8 level_shifter; > + __s8 orientation[9]; > + enum secondary_slave_type sec_slave_type; > + enum ext_slave_id sec_slave_id; > + __u16 secondary_i2c_addr; > + __s8 secondary_orientation[9]; > + __u8 key[16]; > +}; > + > +#endif /* __MPU_H_ */ > -- > 1.7.0.4 > -- > To unsubscribe from this list: send the line "unsubscribe linux-iio" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html >