Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 22 Aug 2015 14:23:33 -0400
From:      Brian Fundakowski Feldman <brianfundakowskifeldman@gmail.com>
To:        Tom Jones <jones@sdf.org>, loos@freebsd.org
Cc:        embedded@freebsd.org
Subject:   Re: spigen(4) SPI Generic IO interface -- need comments
Message-ID:  <CAEv1%2BOXe4w8hJXQu2MsoMLz6ixeG3hU3BmLZpssG15SaPd9JGw@mail.gmail.com>
In-Reply-To: <CAEv1%2BOUhSAJxxWAfW2GUFVw=H-_KOs2dGg2d7uhZnFbqsHE5Qw@mail.gmail.com>
References:  <CAEv1%2BOU4cFpMpeQGfnCP7L4Q_k18rOSOA9JBnKUa99DS5dFnWA@mail.gmail.com> <20150817160423.GB3078@gmail.com> <CAEv1%2BOUhSAJxxWAfW2GUFVw=H-_KOs2dGg2d7uhZnFbqsHE5Qw@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
--001a113f3c707013b3051dea7b77
Content-Type: text/plain; charset=UTF-8

I've added a couple more features:
 * clock adjustment via ioctl, independent per spigenN device
 * mmap(2) support for very low latency

On Tue, Aug 18, 2015 at 6:47 PM, Brian Fundakowski Feldman <
brianfundakowskifeldman@gmail.com> wrote:

> On Mon, Aug 17, 2015 at 12:04 PM Tom Jones <jones@sdf.org> wrote:
>
>> On Mon, Aug 17, 2015 at 10:00:26AM -0400, Brian Fundakowski Feldman wrote:
>> > I'm woefully out-of-practice with my kernel hackery (but still pretty
>> > proficient in jiggery-pokery) so I would like to get comments on a
>> little
>> > driver I just made for interfacing arbitrarily in userland with SPI
>> > components.  The only thing I'm exposing is a /dev/spigenN node with a
>> > single transfer ioctl and I put together a test circuit and program
>> with an
>> > MCP3008 10-bit ADC IC to validate that it basically works, other than
>> the
>> > limitation that the transfers must be octet-multiply-sized, but I
>> haven't
>> > looked at the SoC's (I'm using a Raspberry Pi 2) data sheet to tell
>> whether
>> > that's just a limit on the spibus(4) interface or the Broadcom SPI
>> driver
>> > or the Broadcom SoC itself.
>> >
>> > I hit one snag in development where I simply called the ioctl wrong and
>> > found copyin(9) to page fault HARD if given a bogus user address to copy
>> > from, and panic the kernel.  I can post up the test program if anyone
>> wants
>> > but it's very trivial: I just align the start bit and the command data
>> into
>> > the least significant bits of the first octet, shift it up two
>> positions so
>> > the NULs get clocked out as part of the command field, and provide two
>> > octets for the data field to retrieve back the 10-bit digital value.
>>
>> Oh, cool.
>>
>> I did the same earlier this year, have you seen[1]?.
>>
>> The FreeBSD i2c api is the same/very similar the linux one[2][3]. Have you
>> considered adding some of the ioctls[3] or the data structures to make it
>> easier to port code?
>>
>> [1]:
>> https://lists.freebsd.org/pipermail/freebsd-embedded/2015-April/002466.html
>> [2]: https://www.kernel.org/doc/Documentation/i2c/dev-interface
>> [3]:
>> https://www.freebsd.org/cgi/man.cgi?query=iic&apropos=0&sektion=0&manpath=FreeBSD+10.2-RELEASE&arch=default&format=html
>> [4]: https://www.kernel.org/doc/Documentation/spi/spidev
>
>
> I've iterated a bit on this to try to make some more sensible API,
> behaving reasonably about being able to set the SPI clock speed.  I'm going
> to implement an mmap handler so I can have my low-latency operation mode,
> as well.  I don't like the Linux APIs one bit because it's just not safe to
> allow all those configuration changes on a per-transfer basis...
>
> Moving this to -embedded because it's more apt than -hackers.
>

--001a113f3c707013b3051dea7b77
Content-Type: application/octet-stream; name="spigen_with_mmap.patch"
Content-Disposition: attachment; filename="spigen_with_mmap.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_idne77xk1

SW5kZXg6IGFybS9icm9hZGNvbS9iY20yODM1L2JjbTI4MzVfc3BpLmMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
YXJtL2Jyb2FkY29tL2JjbTI4MzUvYmNtMjgzNV9zcGkuYwkocmV2aXNpb24gMjg2ODkwKQorKysg
YXJtL2Jyb2FkY29tL2JjbTI4MzUvYmNtMjgzNV9zcGkuYwkod29ya2luZyBjb3B5KQpAQCAtMTA3
LDYgKzEwNywyNSBAQAogCUJDTV9TUElfV1JJVEUoc2MsIG9mZiwgcmVnKTsKIH0KIAorLyoKKyAq
IFNldCB0aGUgY2xvY2sgc3BlZWQgcmVnaXN0ZXIgYW5kIHJldHVybiB0aGUgY2xvY2sgc3BlZWQg
YWN0dWFsbHkgdXNlZCwKKyAqIGFmdGVyIGNvcnJlY3Rpb25zIHRvIGZpdCB3aXRoaW4gU1BJX0NP
UkVfQ0xLLgorICovCitzdGF0aWMgdWludDMyX3QKK2JjbV9zcGlfc2V0X2Nsb2NrX3NwZWVkKHN0
cnVjdCBiY21fc3BpX3NvZnRjICpzYywgY29uc3QgdWludDMyX3QgY2xvY2tfc3BlZWQpCit7CisJ
dWludDMyX3QgY2xrID0gU1BJX0NPUkVfQ0xLIC8gY2xvY2tfc3BlZWQ7CisKKwlpZiAoY2xrIDw9
IDEpCisJCWNsayA9IDI7CisJZWxzZSBpZiAoY2xrICUgMikKKwkJY2xrLS07CisJaWYgKGNsayA+
IDB4ZmZmZikKKwkJY2xrID0gMDsKKwlCQ01fU1BJX1dSSVRFKHNjLCBTUElfQ0xLLCBjbGspOwor
CXJldHVybiAoY2xrID09IDAgPyAwIDogU1BJX0NPUkVfQ0xLIC8gY2xrKTsKK30KKwogc3RhdGlj
IGludAogYmNtX3NwaV9jbG9ja19wcm9jKFNZU0NUTF9IQU5ETEVSX0FSR1MpCiB7CkBAIC0xMTcs
MjYgKzEzNiwxOSBAQAogCXNjID0gKHN0cnVjdCBiY21fc3BpX3NvZnRjICopYXJnMTsKIAogCUJD
TV9TUElfTE9DSyhzYyk7Ci0JY2xrID0gQkNNX1NQSV9SRUFEKHNjLCBTUElfQ0xLKTsKKwljbGsg
PSBzYy0+c2NfY2xvY2tfc3BlZWQ7CiAJQkNNX1NQSV9VTkxPQ0soc2MpOwotCWNsayAmPSAweGZm
ZmY7Ci0JaWYgKGNsayA9PSAwKQotCQljbGsgPSA2NTUzNjsKLQljbGsgPSBTUElfQ09SRV9DTEsg
LyBjbGs7CiAKIAllcnJvciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZjbGssIHNpemVvZihj
bGspLCByZXEpOwogCWlmIChlcnJvciAhPSAwIHx8IHJlcS0+bmV3cHRyID09IE5VTEwpCiAJCXJl
dHVybiAoZXJyb3IpOwogCi0JY2xrID0gU1BJX0NPUkVfQ0xLIC8gY2xrOwotCWlmIChjbGsgPD0g
MSkKLQkJY2xrID0gMjsKLQllbHNlIGlmIChjbGsgJSAyKQotCQljbGstLTsKLQlpZiAoY2xrID4g
MHhmZmZmKQotCQljbGsgPSAwOwogCUJDTV9TUElfTE9DSyhzYyk7Ci0JQkNNX1NQSV9XUklURShz
YywgU1BJX0NMSywgY2xrKTsKKwlpZiAoc2MtPnNjX2ZsYWdzICYgQkNNX1NQSV9CVVNZKSB7CisJ
CUJDTV9TUElfVU5MT0NLKHNjKTsKKwkJcmV0dXJuIChFQlVTWSk7CisJfQorCXNjLT5zY19jbG9j
a19zcGVlZCA9IGJjbV9zcGlfc2V0X2Nsb2NrX3NwZWVkKHNjLCBjbGspOwogCUJDTV9TUElfVU5M
T0NLKHNjKTsKIAogCXJldHVybiAoMCk7CkBAIC0zMTAsNyArMzIyLDggQEAKIAlCQ01fU1BJX1dS
SVRFKHNjLCBTUElfQ1MsIFNQSV9DU19DTEVBUl9SWEZJRk8gfCBTUElfQ1NfQ0xFQVJfVFhGSUZP
KTsKIAogCS8qIFNldCB0aGUgU1BJIGNsb2NrIHRvIDUwMEtoei4gKi8KLQlCQ01fU1BJX1dSSVRF
KHNjLCBTUElfQ0xLLCBTUElfQ09SRV9DTEsgLyA1MDAwMDApOworCXNjLT5zY19jbG9ja19zcGVl
ZCA9IDUwMDAwMDsKKwlCQ01fU1BJX1dSSVRFKHNjLCBTUElfQ0xLLCBTUElfQ09SRV9DTEsgLyBz
Yy0+c2NfY2xvY2tfc3BlZWQpOwogCiAjaWZkZWYJQkNNX1NQSV9ERUJVRwogCWJjbV9zcGlfcHJp
bnRyKGRldik7CkBAIC00MTgsNiArNDMxLDcgQEAKIGJjbV9zcGlfdHJhbnNmZXIoZGV2aWNlX3Qg
ZGV2LCBkZXZpY2VfdCBjaGlsZCwgc3RydWN0IHNwaV9jb21tYW5kICpjbWQpCiB7CiAJc3RydWN0
IGJjbV9zcGlfc29mdGMgKnNjOworCWNvbnN0IHVpbnQzMl90IGNsb2NrX3NwZWVkX2h6ID0gY21k
LT5jbG9ja19zcGVlZF9oejsKIAlpbnQgY3MsIGVycjsKIAogCXNjID0gZGV2aWNlX2dldF9zb2Z0
YyhkZXYpOwpAQCAtNDUwLDYgKzQ2NCwxMCBAQAogCSAgICBTUElfQ1NfQ0xFQVJfUlhGSUZPIHwg
U1BJX0NTX0NMRUFSX1RYRklGTywKIAkgICAgU1BJX0NTX0NMRUFSX1JYRklGTyB8IFNQSV9DU19D
TEVBUl9UWEZJRk8pOwogCisJLyogU3dpdGNoIGNsb2NrIHNwZWVkIGlmIG5lY2Vzc2FyeS4gKi8K
KwlpZiAoY2xvY2tfc3BlZWRfaHogIT0gMCAmJiBjbG9ja19zcGVlZF9oeiAhPSBzYy0+c2NfY2xv
Y2tfc3BlZWQpCisJCWJjbV9zcGlfc2V0X2Nsb2NrX3NwZWVkKHNjLCBjbG9ja19zcGVlZF9oeik7
CisKIAkvKiBTYXZlIGEgcG9pbnRlciB0byB0aGUgU1BJIGNvbW1hbmQuICovCiAJc2MtPnNjX2Nt
ZCA9IGNtZDsKIAlzYy0+c2NfcmVhZCA9IDA7CkBAIC00NzAsNiArNDg4LDEwIEBACiAJLyogTWFr
ZSBzdXJlIHRoZSBTUEkgZW5naW5lIGFuZCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4gKi8KIAli
Y21fc3BpX21vZGlmeXJlZyhzYywgU1BJX0NTLCBTUElfQ1NfVEEgfCBTUElfQ1NfSU5UUiB8IFNQ
SV9DU19JTlRELCAwKTsKIAorCS8qIFN3aXRjaCB0aGUgY2xvY2sgc3BlZWQgYmFjayBpZiBuZWNl
c3NhcnkuICovCisJaWYgKGNsb2NrX3NwZWVkX2h6ICE9IDAgJiYgY2xvY2tfc3BlZWRfaHogIT0g
c2MtPnNjX2Nsb2NrX3NwZWVkKQorCQliY21fc3BpX3NldF9jbG9ja19zcGVlZChzYywgc2MtPnNj
X2Nsb2NrX3NwZWVkKTsKKwogCS8qIFJlbGVhc2UgdGhlIGNvbnRyb2xsZXIgYW5kIHdha2V1cCB0
aGUgbmV4dCB0aHJlYWQgd2FpdGluZyBmb3IgaXQuICovCiAJc2MtPnNjX2ZsYWdzID0gMDsKIAl3
YWtldXBfb25lKGRldik7CkBAIC00ODcsNiArNTA5LDcgQEAKIAlyZXR1cm4gKGVycik7CiB9CiAK
Kwogc3RhdGljIHBoYW5kbGVfdAogYmNtX3NwaV9nZXRfbm9kZShkZXZpY2VfdCBidXMsIGRldmlj
ZV90IGRldikKIHsKSW5kZXg6IGFybS9icm9hZGNvbS9iY20yODM1L2JjbTI4MzVfc3BpdmFyLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gYXJtL2Jyb2FkY29tL2JjbTI4MzUvYmNtMjgzNV9zcGl2YXIuaAkocmV2
aXNpb24gMjg2ODkwKQorKysgYXJtL2Jyb2FkY29tL2JjbTI4MzUvYmNtMjgzNV9zcGl2YXIuaAko
d29ya2luZyBjb3B5KQpAQCAtNTQsNiArNTQsNyBAQAogCXVpbnQzMl90CQlzY19yZWFkOwogCXVp
bnQzMl90CQlzY19mbGFnczsKIAl1aW50MzJfdAkJc2Nfd3JpdHRlbjsKKwl1aW50MzJfdAkJc2Nf
Y2xvY2tfc3BlZWQ7CiAJdm9pZCAqCQkJc2NfaW50cmhhbmQ7CiB9OwogCkluZGV4OiBhcm0vbHBj
L3NzZDEyODkuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBhcm0vbHBjL3NzZDEyODkuYwkocmV2aXNpb24gMjg2
ODkwKQorKysgYXJtL2xwYy9zc2QxMjg5LmMJKHdvcmtpbmcgY29weSkKQEAgLTE1Nyw3ICsxNTcs
OCBAQAogc3RhdGljIF9faW5saW5lIHZvaWQKIHNzZDEyODlfc3BpX3NlbmQoc3RydWN0IHNzZDEy
ODlfc29mdGMgKnNjLCB1aW50OF90ICpkYXRhLCBpbnQgbGVuKQogewotCXN0cnVjdCBzcGlfY29t
bWFuZCBjbWQ7CisJc3RydWN0IHNwaV9jb21tYW5kIGNtZCA9IFNQSV9DT01NQU5EX0lOSVRJQUxJ
WkVSOworCiAJdWludDhfdCBidWZmZXJbOF07CiAJY21kLnR4X2NtZCA9IGRhdGE7CiAJY21kLnR4
X2NtZF9zeiA9IGxlbjsKSW5kZXg6IGNvbmYvZmlsZXMKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gY29uZi9maWxl
cwkocmV2aXNpb24gMjg2ODkwKQorKysgY29uZi9maWxlcwkod29ya2luZyBjb3B5KQpAQCAtMjQ1
Miw2ICsyNDUyLDcgQEAKIGRldi9zcGlidXMvb2Z3X3NwaWJ1cy5jCQlvcHRpb25hbCBmZHQgc3Bp
YnVzCiBkZXYvc3BpYnVzL3NwaWJ1cy5jCQlvcHRpb25hbCBzcGlidXMJCQkJXAogCWRlcGVuZGVu
Y3kJInNwaWJ1c19pZi5oIgorZGV2L3NwaWJ1cy9zcGlnZW4uYwkJb3B0aW9uYWwgc3BpYnVzCiBk
ZXYvc3BpYnVzL3NwaWJ1c19pZi5tCQlvcHRpb25hbCBzcGlidXMKIGRldi9zdGUvaWZfc3RlLmMJ
CW9wdGlvbmFsIHN0ZSBwY2kKIGRldi9zdGcvdG1jMThjMzAuYwkJb3B0aW9uYWwgc3RnCkluZGV4
OiBkZXYvc3BpYnVzL3NwaS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRldi9zcGlidXMvc3BpLmgJKHJldmlz
aW9uIDI4Njg5MCkKKysrIGRldi9zcGlidXMvc3BpLmgJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYg
KzI3LDcgQEAKICAqLwogCiBzdHJ1Y3Qgc3BpX2NvbW1hbmQgeworCXVpbnQzMl90IGNsb2NrX3Nw
ZWVkX2h6OwogCXZvaWQJKnR4X2NtZDsKIAl1aW50MzJfdCB0eF9jbWRfc3o7CiAJdm9pZAkqcnhf
Y21kOwpAQCAtMzcsNCArMzgsNiBAQAogCXVpbnQzMl90IHJ4X2RhdGFfc3o7CiB9OwogCisjZGVm
aW5lCVNQSV9DT01NQU5EX0lOSVRJQUxJWkVSCXsgMCB9CisKICNkZWZpbmUJU1BJX0NISVBfU0VM
RUNUX0hJR0gJMHgxCQkvKiBDaGlwIHNlbGVjdCBoaWdoIChlbHNlIGxvdykgKi8KSW5kZXg6IGRl
di9zcGlidXMvc3BpZ2VuLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZGV2L3NwaWJ1cy9zcGlnZW4uYwkocmV2
aXNpb24gMCkKKysrIGRldi9zcGlidXMvc3BpZ2VuLmMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0MDIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDE1IEJyaWFuIEZ1bmRha293c2tpIEZl
bGRtYW4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9S
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQg
U0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICog
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAq
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5j
bHVkZSA8c3lzL2NkZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNsdWRlIDxz
eXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lzdG0uaD4KKyNpbmNsdWRlIDxzeXMvYnVzLmg+
CisjaW5jbHVkZSA8c3lzL2NvbmYuaD4KKyNpbmNsdWRlIDxzeXMva2VybmVsLmg+CisjaW5jbHVk
ZSA8c3lzL2xvY2suaD4KKyNpbmNsdWRlIDxzeXMvbWFsbG9jLmg+CisjaW5jbHVkZSA8c3lzL21t
YW4uaD4KKyNpbmNsdWRlIDxzeXMvbXV0ZXguaD4KKyNpbmNsdWRlIDxzeXMvbW9kdWxlLmg+Cisj
aW5jbHVkZSA8c3lzL3Byb2MuaD4KKyNpbmNsdWRlIDxzeXMvcndsb2NrLmg+CisjaW5jbHVkZSA8
c3lzL3NwaWdlbmlvLmg+CisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2luY2x1ZGUgPHN5cy90
eXBlcy5oPgorIAorI2luY2x1ZGUgPHZtL3ZtLmg+CisjaW5jbHVkZSA8dm0vdm1fZXh0ZXJuLmg+
CisjaW5jbHVkZSA8dm0vdm1fb2JqZWN0Lmg+CisjaW5jbHVkZSA8dm0vdm1fcGFnZS5oPgorI2lu
Y2x1ZGUgPHZtL3ZtX3BhZ2VyLmg+CisKKyNpbmNsdWRlIDxkZXYvc3BpYnVzL3NwaS5oPgorCisj
aW5jbHVkZSAic3BpYnVzX2lmLmgiCisKK3N0cnVjdCBzcGlnZW5fc29mdGMgeworCWRldmljZV90
IHNjX2RldjsKKwlzdHJ1Y3QgY2RldiAqc2NfY2RldjsKKwlzdHJ1Y3QgbXR4IHNjX210eDsKKwl1
aW50MzJfdCBzY19jbG9ja19zcGVlZDsKKwl1aW50MzJfdCBzY19jb21tYW5kX2xlbmd0aF9tYXg7
IC8qIGNhbm5vdCBjaGFuZ2Ugd2hpbGUgbW1hcHBlZCAqLworCXVpbnQzMl90IHNjX2RhdGFfbGVu
Z3RoX21heDsgICAgLyogY2Fubm90IGNoYW5nZSB3aGlsZSBtbWFwcGVkICovCisJdm1fb2JqZWN0
X3Qgc2NfbW1hcF9idWZmZXI7ICAgICAvKiBjb21tYW5kLCB0aGVuIGRhdGEgKi8KKwl2bV9vZmZz
ZXRfdCBzY19tbWFwX2t2YWRkcjsKKwlzaXplX3Qgc2NfbW1hcF9idWZmZXJfc2l6ZTsKKwlpbnQg
c2NfbW1hcF9idXN5OworfTsKKworc3RhdGljIGludAorc3BpZ2VuX3Byb2JlKGRldmljZV90IGRl
dikKK3sKKwlkZXZpY2Vfc2V0X2Rlc2MoZGV2LCAiU1BJIEdlbmVyaWMgSU8iKTsKKwlyZXR1cm4g
KDApOworfQorCitzdGF0aWMgaW50IHNwaWdlbl9vcGVuKHN0cnVjdCBjZGV2ICosIGludCwgaW50
LCBzdHJ1Y3QgdGhyZWFkICopOworc3RhdGljIGludCBzcGlnZW5faW9jdGwoc3RydWN0IGNkZXYg
KiwgdV9sb25nLCBjYWRkcl90LCBpbnQsIHN0cnVjdCB0aHJlYWQgKik7CitzdGF0aWMgaW50IHNw
aWdlbl9jbG9zZShzdHJ1Y3QgY2RldiAqLCBpbnQsIGludCwgc3RydWN0IHRocmVhZCAqKTsKK3N0
YXRpYyBkX21tYXBfc2luZ2xlX3Qgc3BpZ2VuX21tYXBfc2luZ2xlOworCitzdGF0aWMgc3RydWN0
IGNkZXZzdyBzcGlnZW5fY2RldnN3ID0geworCS5kX3ZlcnNpb24gPSAgICAgRF9WRVJTSU9OLAor
CS5kX25hbWUgPSAgICAgICAgInNwaWdlbiIsCisJLmRfb3BlbiA9ICAgICAgICBzcGlnZW5fb3Bl
biwKKwkuZF9pb2N0bCA9ICAgICAgIHNwaWdlbl9pb2N0bCwKKwkuZF9tbWFwX3NpbmdsZSA9IHNw
aWdlbl9tbWFwX3NpbmdsZSwKKwkuZF9jbG9zZSA9ICAgICAgIHNwaWdlbl9jbG9zZQorfTsKKwor
c3RhdGljIGludAorc3BpZ2VuX2NvbW1hbmRfbGVuZ3RoX21heF9wcm9jKFNZU0NUTF9IQU5ETEVS
X0FSR1MpCit7CisJc3RydWN0IHNwaWdlbl9zb2Z0YyAqc2MgPSAoc3RydWN0IHNwaWdlbl9zb2Z0
YyAqKWFyZzE7CisJdWludDMyX3QgY29tbWFuZF9sZW5ndGhfbWF4OworCWludCBlcnJvcjsKKwor
CW10eF9sb2NrKCZzYy0+c2NfbXR4KTsKKwljb21tYW5kX2xlbmd0aF9tYXggPSBzYy0+c2NfY29t
bWFuZF9sZW5ndGhfbWF4OworCW10eF91bmxvY2soJnNjLT5zY19tdHgpOworCWVycm9yID0gc3lz
Y3RsX2hhbmRsZV9pbnQob2lkcCwgJmNvbW1hbmRfbGVuZ3RoX21heCwKKwkgICAgc2l6ZW9mKGNv
bW1hbmRfbGVuZ3RoX21heCksIHJlcSk7CisJaWYgKGVycm9yID09IDAgJiYgcmVxLT5uZXdwdHIg
IT0gTlVMTCkgeworCQltdHhfbG9jaygmc2MtPnNjX210eCk7CisJCWlmIChzYy0+c2NfbW1hcF9i
dWZmZXIgIT0gTlVMTCkKKwkJCWVycm9yID0gRUJVU1k7CisJCWVsc2UKKwkJCXNjLT5zY19jb21t
YW5kX2xlbmd0aF9tYXggPSBjb21tYW5kX2xlbmd0aF9tYXg7CisJCW10eF91bmxvY2soJnNjLT5z
Y19tdHgpOworCX0KKwlyZXR1cm4gKGVycm9yKTsKK30KKworc3RhdGljIGludAorc3BpZ2VuX2Rh
dGFfbGVuZ3RoX21heF9wcm9jKFNZU0NUTF9IQU5ETEVSX0FSR1MpCit7CisJc3RydWN0IHNwaWdl
bl9zb2Z0YyAqc2MgPSAoc3RydWN0IHNwaWdlbl9zb2Z0YyAqKWFyZzE7CisJdWludDMyX3QgZGF0
YV9sZW5ndGhfbWF4OworCWludCBlcnJvcjsKKworCW10eF9sb2NrKCZzYy0+c2NfbXR4KTsKKwlk
YXRhX2xlbmd0aF9tYXggPSBzYy0+c2NfZGF0YV9sZW5ndGhfbWF4OworCW10eF91bmxvY2soJnNj
LT5zY19tdHgpOworCWVycm9yID0gc3lzY3RsX2hhbmRsZV9pbnQob2lkcCwgJmRhdGFfbGVuZ3Ro
X21heCwKKwkgICAgc2l6ZW9mKGRhdGFfbGVuZ3RoX21heCksIHJlcSk7CisJaWYgKGVycm9yID09
IDAgJiYgcmVxLT5uZXdwdHIgIT0gTlVMTCkgeworCQltdHhfbG9jaygmc2MtPnNjX210eCk7CisJ
CWlmIChzYy0+c2NfbW1hcF9idWZmZXIgIT0gTlVMTCkKKwkJCWVycm9yID0gRUJVU1k7CisJCWVs
c2UKKwkJCXNjLT5zY19kYXRhX2xlbmd0aF9tYXggPSBkYXRhX2xlbmd0aF9tYXg7CisJCW10eF91
bmxvY2soJnNjLT5zY19tdHgpOworCX0KKwlyZXR1cm4gKGVycm9yKTsKK30KKworc3RhdGljIHZv
aWQKK3NwaWdlbl9zeXNjdGxfaW5pdChzdHJ1Y3Qgc3BpZ2VuX3NvZnRjICpzYykKK3sKKwlzdHJ1
Y3Qgc3lzY3RsX2N0eF9saXN0ICpjdHg7CisJc3RydWN0IHN5c2N0bF9vaWQgKnRyZWVfbm9kZTsK
KwlzdHJ1Y3Qgc3lzY3RsX29pZF9saXN0ICp0cmVlOworCisJLyoKKwkgKiBBZGQgc3lzdGVtIHN5
c2N0bCB0cmVlL2hhbmRsZXJzLgorCSAqLworCWN0eCA9IGRldmljZV9nZXRfc3lzY3RsX2N0eChz
Yy0+c2NfZGV2KTsKKwl0cmVlX25vZGUgPSBkZXZpY2VfZ2V0X3N5c2N0bF90cmVlKHNjLT5zY19k
ZXYpOworCXRyZWUgPSBTWVNDVExfQ0hJTERSRU4odHJlZV9ub2RlKTsKKwlTWVNDVExfQUREX1BS
T0MoY3R4LCB0cmVlLCBPSURfQVVUTywgImNvbW1hbmRfbGVuZ3RoX21heCIsCisJICAgIENUTEZM
QUdfTVBTQUZFIHwgQ1RMRkxBR19SVyB8IENUTFRZUEVfVUlOVCwgc2MsIHNpemVvZigqc2MpLAor
CSAgICBzcGlnZW5fY29tbWFuZF9sZW5ndGhfbWF4X3Byb2MsICJJVSIsICJTUEkgY29tbWFuZCBo
ZWFkZXIgcG9ydGlvbiAob2N0ZXRzKSIpOworCVNZU0NUTF9BRERfUFJPQyhjdHgsIHRyZWUsIE9J
RF9BVVRPLCAiZGF0YV9sZW5ndGhfbWF4IiwKKwkgICAgQ1RMRkxBR19NUFNBRkUgfCBDVExGTEFH
X1JXIHwgQ1RMVFlQRV9VSU5ULCBzYywgc2l6ZW9mKCpzYyksCisJICAgIHNwaWdlbl9kYXRhX2xl
bmd0aF9tYXhfcHJvYywgIklVIiwgIlNQSSBkYXRhIHRyYWlsZXIgcG9ydGlvbiAob2N0ZXRzKSIp
OworfQorCitzdGF0aWMgaW50CitzcGlnZW5fYXR0YWNoKGRldmljZV90IGRldikKK3sKKwlzdHJ1
Y3Qgc3BpZ2VuX3NvZnRjICpzYzsKKwljb25zdCBpbnQgdW5pdCA9IGRldmljZV9nZXRfdW5pdChk
ZXYpOworCisJc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisJc2MtPnNjX2RldiA9IGRldjsK
KwlzYy0+c2NfY2RldiA9IG1ha2VfZGV2KCZzcGlnZW5fY2RldnN3LCB1bml0LAorCSAgICBVSURf
Uk9PVCwgR0lEX09QRVJBVE9SLCAwNjYwLCAic3BpZ2VuJWQiLCB1bml0KTsKKwlzYy0+c2NfY2Rl
di0+c2lfZHJ2MSA9IGRldjsKKwlzYy0+c2NfY29tbWFuZF9sZW5ndGhfbWF4ID0gUEFHRV9TSVpF
OworCXNjLT5zY19kYXRhX2xlbmd0aF9tYXggPSBQQUdFX1NJWkU7CisJbXR4X2luaXQoJnNjLT5z
Y19tdHgsIGRldmljZV9nZXRfbmFtZXVuaXQoZGV2KSwgTlVMTCwgTVRYX0RFRik7CisJc3BpZ2Vu
X3N5c2N0bF9pbml0KHNjKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgCitzcGln
ZW5fb3BlbihzdHJ1Y3QgY2RldiAqZGV2LCBpbnQgb2ZsYWdzLCBpbnQgZGV2dHlwZSwgc3RydWN0
IHRocmVhZCAqdGQpCit7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitzcGlnZW5f
dHJhbnNmZXIoc3RydWN0IGNkZXYgKmNkZXYsIHN0cnVjdCBzcGlnZW5fdHJhbnNmZXIgKnN0KQor
eworCXN0cnVjdCBzcGlfY29tbWFuZCB0cmFuc2ZlciA9IFNQSV9DT01NQU5EX0lOSVRJQUxJWkVS
OworCWRldmljZV90IGRldiA9IGNkZXYtPnNpX2RydjE7CisJc3RydWN0IHNwaWdlbl9zb2Z0YyAq
c2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisJaW50IGVycm9yID0gMDsKKworCW10eF9sb2Nr
KCZzYy0+c2NfbXR4KTsKKwlpZiAoc3QtPnN0X2NvbW1hbmQuaW92X2xlbiA9PSAwIHx8IHN0LT5z
dF9kYXRhLmlvdl9sZW4gPT0gMCkKKwkJZXJyb3IgPSBFSU5WQUw7CisJZWxzZSBpZiAoc3QtPnN0
X2NvbW1hbmQuaW92X2xlbiA+IHNjLT5zY19jb21tYW5kX2xlbmd0aF9tYXggfHwKKwkgICAgc3Qt
PnN0X2RhdGEuaW92X2xlbiA+IHNjLT5zY19kYXRhX2xlbmd0aF9tYXgpCisJCWVycm9yID0gRU5P
TUVNOworCWVsc2UKKwkJdHJhbnNmZXIuY2xvY2tfc3BlZWRfaHogPSBzYy0+c2NfY2xvY2tfc3Bl
ZWQ7CisJbXR4X3VubG9jaygmc2MtPnNjX210eCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gKGVy
cm9yKTsKKwkKKyNpZiAwCisJZGV2aWNlX3ByaW50ZihkZXYsICJjbWQgJXAgJXUgZGF0YSAlcCAl
dVxuIiwgc3QtPnN0X2NvbW1hbmQuaW92X2Jhc2UsCisJICAgIHN0LT5zdF9jb21tYW5kLmlvdl9s
ZW4sIHN0LT5zdF9kYXRhLmlvdl9iYXNlLCBzdC0+c3RfZGF0YS5pb3ZfbGVuKTsKKyNlbmRpZgor
CXRyYW5zZmVyLnR4X2NtZCA9IHRyYW5zZmVyLnJ4X2NtZCA9IG1hbGxvYyhzdC0+c3RfY29tbWFu
ZC5pb3ZfbGVuLAorCSAgICBNX0RFVkJVRiwgTV9XQUlUT0spOworCWlmICh0cmFuc2Zlci50eF9j
bWQgPT0gTlVMTCkKKwkJcmV0dXJuIChFTk9NRU0pOworCXRyYW5zZmVyLnR4X2RhdGEgPSB0cmFu
c2Zlci5yeF9kYXRhID0gbWFsbG9jKHN0LT5zdF9kYXRhLmlvdl9sZW4sCisJICAgIE1fREVWQlVG
LCBNX1dBSVRPSyk7CisJaWYgKHRyYW5zZmVyLnR4X2RhdGEgPT0gTlVMTCkgeworCQlmcmVlKHRy
YW5zZmVyLnR4X2NtZCwgTV9ERVZCVUYpOworCQlyZXR1cm4gKEVOT01FTSk7CisJfQorCisJZXJy
b3IgPSBjb3B5aW4oc3QtPnN0X2NvbW1hbmQuaW92X2Jhc2UsIHRyYW5zZmVyLnR4X2NtZCwKKwkg
ICAgdHJhbnNmZXIudHhfY21kX3N6ID0gdHJhbnNmZXIucnhfY21kX3N6ID0gc3QtPnN0X2NvbW1h
bmQuaW92X2xlbik7CQorCWlmIChlcnJvciA9PSAwKQorCQllcnJvciA9IGNvcHlpbihzdC0+c3Rf
ZGF0YS5pb3ZfYmFzZSwgdHJhbnNmZXIudHhfZGF0YSwKKwkJICAgIHRyYW5zZmVyLnR4X2RhdGFf
c3ogPSB0cmFuc2Zlci5yeF9kYXRhX3N6ID0KKwkJICAgICAgICAgICAgICAgICAgICAgICAgICBz
dC0+c3RfZGF0YS5pb3ZfbGVuKTsJCisJaWYgKGVycm9yID09IDApCisJCWVycm9yID0gU1BJQlVT
X1RSQU5TRkVSKGRldmljZV9nZXRfcGFyZW50KGRldiksIGRldiwgJnRyYW5zZmVyKTsKKwlpZiAo
ZXJyb3IgPT0gMCkgeworCQllcnJvciA9IGNvcHlvdXQodHJhbnNmZXIucnhfY21kLCBzdC0+c3Rf
Y29tbWFuZC5pb3ZfYmFzZSwKKwkJICAgIHRyYW5zZmVyLnJ4X2NtZF9zeik7CisJCWlmIChlcnJv
ciA9PSAwKQorCQkJZXJyb3IgPSBjb3B5b3V0KHRyYW5zZmVyLnJ4X2RhdGEsIHN0LT5zdF9kYXRh
Lmlvdl9iYXNlLAorCQkJICAgIHRyYW5zZmVyLnJ4X2RhdGFfc3opOworCX0KKworCWZyZWUodHJh
bnNmZXIudHhfY21kLCBNX0RFVkJVRik7CisJZnJlZSh0cmFuc2Zlci50eF9kYXRhLCBNX0RFVkJV
Rik7CisJcmV0dXJuIChlcnJvcik7Cit9CisKK3N0YXRpYyBpbnQKK3NwaWdlbl90cmFuc2Zlcl9t
bWFwcGVkKHN0cnVjdCBjZGV2ICpjZGV2LCBzdHJ1Y3Qgc3BpZ2VuX3RyYW5zZmVyX21tYXBwZWQg
KnN0bSkKK3sKKwlzdHJ1Y3Qgc3BpX2NvbW1hbmQgdHJhbnNmZXIgPSBTUElfQ09NTUFORF9JTklU
SUFMSVpFUjsKKwlkZXZpY2VfdCBkZXYgPSBjZGV2LT5zaV9kcnYxOworCXN0cnVjdCBzcGlnZW5f
c29mdGMgKnNjID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYpOworCWludCBlcnJvciA9IDA7CisKKwlt
dHhfbG9jaygmc2MtPnNjX210eCk7CisJaWYgKHNjLT5zY19tbWFwX2J1c3kpCisJCWVycm9yID0g
RUJVU1k7CisJZWxzZSBpZiAoc3RtLT5zdG1fY29tbWFuZF9sZW5ndGggPiBzYy0+c2NfY29tbWFu
ZF9sZW5ndGhfbWF4IHx8CisJICAgIHN0bS0+c3RtX2RhdGFfbGVuZ3RoID4gc2MtPnNjX2RhdGFf
bGVuZ3RoX21heCkKKwkJZXJyb3IgPSBFMkJJRzsKKwllbHNlIGlmIChzYy0+c2NfbW1hcF9idWZm
ZXIgPT0gTlVMTCkKKwkJZXJyb3IgPSBFSU5WQUw7CisJZWxzZSBpZiAoc2MtPnNjX21tYXBfYnVm
ZmVyX3NpemUgPAorCSAgICBzdG0tPnN0bV9jb21tYW5kX2xlbmd0aCArIHN0bS0+c3RtX2RhdGFf
bGVuZ3RoKQorCQllcnJvciA9IEVOT01FTTsKKwllbHNlCisJCXRyYW5zZmVyLmNsb2NrX3NwZWVk
X2h6ID0gc2MtPnNjX2Nsb2NrX3NwZWVkOworCWlmIChlcnJvciA9PSAwKQorCQlzYy0+c2NfbW1h
cF9idXN5ID0gMTsKKwltdHhfdW5sb2NrKCZzYy0+c2NfbXR4KTsKKwlpZiAoZXJyb3IpCisJCXJl
dHVybiAoZXJyb3IpOworCQorCXRyYW5zZmVyLnR4X2NtZCA9IHRyYW5zZmVyLnJ4X2NtZCA9ICh2
b2lkICopc2MtPnNjX21tYXBfa3ZhZGRyOworCXRyYW5zZmVyLnR4X2NtZF9zeiA9IHRyYW5zZmVy
LnJ4X2NtZF9zeiA9IHN0bS0+c3RtX2NvbW1hbmRfbGVuZ3RoOworCXRyYW5zZmVyLnR4X2RhdGEg
PSB0cmFuc2Zlci5yeF9kYXRhID0KKwkgICAgKHZvaWQgKikoc2MtPnNjX21tYXBfa3ZhZGRyICsg
c3RtLT5zdG1fY29tbWFuZF9sZW5ndGgpOworCXRyYW5zZmVyLnR4X2RhdGFfc3ogPSB0cmFuc2Zl
ci5yeF9kYXRhX3N6ID0gc3RtLT5zdG1fZGF0YV9sZW5ndGg7CisJZXJyb3IgPSBTUElCVVNfVFJB
TlNGRVIoZGV2aWNlX2dldF9wYXJlbnQoZGV2KSwgZGV2LCAmdHJhbnNmZXIpOworCisJbXR4X2xv
Y2soJnNjLT5zY19tdHgpOworCUtBU1NFUlQoc2MtPnNjX21tYXBfYnVzeSwgKCJtbWFwIG5vIGxv
bmdlciBtYXJrZWQgYnVzeSIpKTsKKwlzYy0+c2NfbW1hcF9idXN5ID0gMDsKKwltdHhfdW5sb2Nr
KCZzYy0+c2NfbXR4KTsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworc3RhdGljIGludAorc3BpZ2Vu
X2lvY3RsKHN0cnVjdCBjZGV2ICpjZGV2LCB1X2xvbmcgY21kLCBjYWRkcl90IGRhdGEsIGludCBm
ZmxhZywKKyAgICBzdHJ1Y3QgdGhyZWFkICp0ZCkKK3sKKwlkZXZpY2VfdCBkZXYgPSBjZGV2LT5z
aV9kcnYxOworCXN0cnVjdCBzcGlnZW5fc29mdGMgKnNjID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYp
OworCWludCBlcnJvcjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTUElHRU5JT0NfVFJBTlNG
RVI6CisJCWVycm9yID0gc3BpZ2VuX3RyYW5zZmVyKGNkZXYsIChzdHJ1Y3Qgc3BpZ2VuX3RyYW5z
ZmVyICopZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU1BJR0VOSU9DX1RSQU5TRkVSX01NQVBQRUQ6
CisJCWVycm9yID0gc3BpZ2VuX3RyYW5zZmVyX21tYXBwZWQoY2RldiwgKHN0cnVjdCBzcGlnZW5f
dHJhbnNmZXJfbW1hcHBlZCAqKWRhdGEpOworCQlicmVhazsKKwljYXNlIFNQSUdFTklPQ19HRVRf
Q0xPQ0tfU1BFRUQ6CisJCW10eF9sb2NrKCZzYy0+c2NfbXR4KTsKKwkJKih1aW50MzJfdCAqKWRh
dGEgPSBzYy0+c2NfY2xvY2tfc3BlZWQ7CisJCW10eF91bmxvY2soJnNjLT5zY19tdHgpOworCQll
cnJvciA9IDA7CisJCWJyZWFrOworCWNhc2UgU1BJR0VOSU9DX1NFVF9DTE9DS19TUEVFRDoKKwkJ
bXR4X2xvY2soJnNjLT5zY19tdHgpOworCQlzYy0+c2NfY2xvY2tfc3BlZWQgPSAqKHVpbnQzMl90
ICopZGF0YTsKKwkJbXR4X3VubG9jaygmc2MtPnNjX210eCk7CisJCWVycm9yID0gMDsKKwkJYnJl
YWs7CisJZGVmYXVsdDoKKwkJZXJyb3IgPSBFT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gKGVycm9y
KTsKK30KKworc3RhdGljIGludAorc3BpZ2VuX21tYXBfc2luZ2xlKHN0cnVjdCBjZGV2ICpjZGV2
LCB2bV9vb2Zmc2V0X3QgKm9mZnNldCwKKyAgICB2bV9zaXplX3Qgc2l6ZSwgc3RydWN0IHZtX29i
amVjdCAqKm9iamVjdCwgaW50IG5wcm90KQoreworCWRldmljZV90IGRldiA9IGNkZXYtPnNpX2Ry
djE7CisJc3RydWN0IHNwaWdlbl9zb2Z0YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisJ
dm1fcGFnZV90ICptOworCXNpemVfdCBuLCBwYWdlczsKKworCWlmIChzaXplID09IDAgfHwKKwkg
ICAgKG5wcm90ICYgKFBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUpKQorCSAgICAh
PSAoUFJPVF9SRUFEIHwgUFJPVF9XUklURSkpCisJCXJldHVybiAoRUlOVkFMKTsKKwlzaXplID0g
cm91bmR1cDIoc2l6ZSwgUEFHRV9TSVpFKTsKKwlwYWdlcyA9IHNpemUgLyBQQUdFX1NJWkU7CisK
KwltdHhfbG9jaygmc2MtPnNjX210eCk7CisJaWYgKHNjLT5zY19tbWFwX2J1ZmZlciAhPSBOVUxM
KSB7CisJCW10eF91bmxvY2soJnNjLT5zY19tdHgpOworCQlyZXR1cm4gKEVCVVNZKTsKKwl9IGVs
c2UgaWYgKHNpemUgPiBzYy0+c2NfY29tbWFuZF9sZW5ndGhfbWF4ICsgc2MtPnNjX2RhdGFfbGVu
Z3RoX21heCkgeworCQltdHhfdW5sb2NrKCZzYy0+c2NfbXR4KTsKKwkJcmV0dXJuIChFMkJJRyk7
CisJfQorCXNjLT5zY19tbWFwX2J1ZmZlcl9zaXplID0gc2l6ZTsKKwkqb2Zmc2V0ID0gMDsKKwlz
Yy0+c2NfbW1hcF9idWZmZXIgPSAqb2JqZWN0ID0gdm1fcGFnZXJfYWxsb2NhdGUoT0JKVF9QSFlT
LCAwLCBzaXplLAorCSAgICBucHJvdCwgKm9mZnNldCwgY3VydGhyZWFkLT50ZF91Y3JlZCk7CisJ
bSA9IG1hbGxvYyhzaXplb2YoKm0pICogcGFnZXMsIE1fVEVNUCwgTV9XQUlUT0spOworCVZNX09C
SkVDVF9XTE9DSygqb2JqZWN0KTsKKwl2bV9vYmplY3RfcmVmZXJlbmNlX2xvY2tlZCgqb2JqZWN0
KTsgLy8ga2VybmVsIGFuZCB1c2VybGFuZCBib3RoCisJZm9yIChuID0gMDsgbiA8IHBhZ2VzOyBu
KyspIHsKKwkJbVtuXSA9IHZtX3BhZ2VfZ3JhYigqb2JqZWN0LCBuLAorCQkgICAgVk1fQUxMT0Nf
Tk9CVVNZIHwgVk1fQUxMT0NfWkVSTyB8IFZNX0FMTE9DX1dJUkVEKTsKKwkJbVtuXS0+dmFsaWQg
PSBWTV9QQUdFX0JJVFNfQUxMOworCX0KKwlWTV9PQkpFQ1RfV1VOTE9DSygqb2JqZWN0KTsKKwlz
Yy0+c2NfbW1hcF9rdmFkZHIgPSBrdmFfYWxsb2Moc2l6ZSk7CisJcG1hcF9xZW50ZXIoc2MtPnNj
X21tYXBfa3ZhZGRyLCBtLCBwYWdlcyk7CisJZnJlZShtLCBNX1RFTVApOworCW10eF91bmxvY2so
JnNjLT5zY19tdHgpOworCisJaWYgKCpvYmplY3QgPT0gTlVMTCkKKwkJIHJldHVybiAoRUlOVkFM
KTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IAorc3BpZ2VuX2Nsb3NlKHN0cnVjdCBj
ZGV2ICpjZGV2LCBpbnQgZmZsYWcsIGludCBkZXZ0eXBlLCBzdHJ1Y3QgdGhyZWFkICp0ZCkKK3sK
KwlkZXZpY2VfdCBkZXYgPSBjZGV2LT5zaV9kcnYxOworCXN0cnVjdCBzcGlnZW5fc29mdGMgKnNj
ID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYpOworCisJbXR4X2xvY2soJnNjLT5zY19tdHgpOworCWlm
IChzYy0+c2NfbW1hcF9idWZmZXIgIT0gTlVMTCkgeworCQlwbWFwX3FyZW1vdmUoc2MtPnNjX21t
YXBfa3ZhZGRyLAorCQkgICAgc2MtPnNjX21tYXBfYnVmZmVyX3NpemUgLyBQQUdFX1NJWkUpOwor
CQlrdmFfZnJlZShzYy0+c2NfbW1hcF9rdmFkZHIsIHNjLT5zY19tbWFwX2J1ZmZlcl9zaXplKTsK
KwkJc2MtPnNjX21tYXBfa3ZhZGRyID0gMDsKKwkJdm1fb2JqZWN0X2RlYWxsb2NhdGUoc2MtPnNj
X21tYXBfYnVmZmVyKTsKKwkJc2MtPnNjX21tYXBfYnVmZmVyID0gTlVMTDsKKwkJc2MtPnNjX21t
YXBfYnVmZmVyX3NpemUgPSAwOworCX0KKwltdHhfdW5sb2NrKCZzYy0+c2NfbXR4KTsKKwlyZXR1
cm4gKDApOworfQorCitzdGF0aWMgaW50CitzcGlnZW5fZGV0YWNoKGRldmljZV90IGRldikKK3sK
KworCXJldHVybiAoRUlPKTsKK30KKworc3RhdGljIGRldmNsYXNzX3Qgc3BpZ2VuX2RldmNsYXNz
OworCitzdGF0aWMgZGV2aWNlX21ldGhvZF90IHNwaWdlbl9tZXRob2RzW10gPSB7CisJLyogRGV2
aWNlIGludGVyZmFjZSAqLworCURFVk1FVEhPRChkZXZpY2VfcHJvYmUsCQlzcGlnZW5fcHJvYmUp
LAorCURFVk1FVEhPRChkZXZpY2VfYXR0YWNoLAlzcGlnZW5fYXR0YWNoKSwKKwlERVZNRVRIT0Qo
ZGV2aWNlX2RldGFjaCwJc3BpZ2VuX2RldGFjaCksCisKKwl7IDAsIDAgfQorfTsKKworc3RhdGlj
IGRyaXZlcl90IHNwaWdlbl9kcml2ZXIgPSB7CisJInNwaWdlbiIsCisJc3BpZ2VuX21ldGhvZHMs
CisJc2l6ZW9mKHN0cnVjdCBzcGlnZW5fc29mdGMpLAorfTsKKworRFJJVkVSX01PRFVMRShzcGln
ZW4sIHNwaWJ1cywgc3BpZ2VuX2RyaXZlciwgc3BpZ2VuX2RldmNsYXNzLCAwLCAwKTsKClByb3Bl
cnR5IGNoYW5nZXMgb246IGRldi9zcGlidXMvc3BpZ2VuLmMKX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3Zu
OmVvbC1zdHlsZQojIyAtMCwwICsxICMjCituYXRpdmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBw
cm9wZXJ0eQpBZGRlZDogc3ZuOmtleXdvcmRzCiMjIC0wLDAgKzEgIyMKK0ZyZWVCU0Q9JUgKXCBO
byBuZXdsaW5lIGF0IGVuZCBvZiBwcm9wZXJ0eQpBZGRlZDogc3ZuOm1pbWUtdHlwZQojIyAtMCww
ICsxICMjCit0ZXh0L3BsYWluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgcHJvcGVydHkKSW5kZXg6
IHN5cy9zcGlnZW5pby5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9zcGlnZW5pby5oCShyZXZpc2lvbiAw
KQorKysgc3lzL3NwaWdlbmlvLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1MiBAQAorLyot
CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgRG91ZyBSYWJzb24KKyAqIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVU
SE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
CisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0Uu
CisgKgorICoJJEZyZWVCU0QkCisgKi8KKworI2lmbmRlZiBfU1lTX1NQSUdFTklPX0hfCisjZGVm
aW5lIF9TWVNfU1BJR0VOSU9fSF8KKworI2luY2x1ZGUgPHN5cy9faW92ZWMuaD4KKworc3RydWN0
IHNwaWdlbl90cmFuc2ZlciB7CisJc3RydWN0IGlvdmVjIHN0X2NvbW1hbmQ7IC8qIG1hc3RlciB0
byBzbGF2ZSAqLworCXN0cnVjdCBpb3ZlYyBzdF9kYXRhOyAgICAvKiBzbGF2ZSB0byBtYXN0ZXIg
YW5kL29yIG1hc3RlciB0byBzbGF2ZSAqLworfTsKKworc3RydWN0IHNwaWdlbl90cmFuc2Zlcl9t
bWFwcGVkIHsKKwlzaXplX3Qgc3RtX2NvbW1hbmRfbGVuZ3RoOyAvKiBhdCBvZmZzZXQgMCBpbiBt
bWFwKDIpIGFyZWEgKi8KKwlzaXplX3Qgc3RtX2RhdGFfbGVuZ3RoOyAgICAvKiBhdCBvZmZzZXQg
c3RtX2NvbW1hbmRfbGVuZ3RoICovCit9OworCisjZGVmaW5lIFNQSUdFTklPQ19CQVNFICAgICAn
UycKKyNkZWZpbmUgU1BJR0VOSU9DX1RSQU5TRkVSIAkgICBfSU9XKFNQSUdFTklPQ19CQVNFLCAw
LCBcCisJICAgIHN0cnVjdCBzcGlnZW5fdHJhbnNmZXIpCisjZGVmaW5lIFNQSUdFTklPQ19UUkFO
U0ZFUl9NTUFQUEVEIF9JT1coU1BJR0VOSU9DX0JBU0UsIDEsIFwKKwkgICAgc3RydWN0IHNwaWdl
bl90cmFuc2Zlcl9tbWFwcGVkKQorI2RlZmluZSBTUElHRU5JT0NfR0VUX0NMT0NLX1NQRUVEICBf
SU9SKFNQSUdFTklPQ19CQVNFLCAyLCB1aW50MzJfdCkKKyNkZWZpbmUgU1BJR0VOSU9DX1NFVF9D
TE9DS19TUEVFRCAgX0lPVyhTUElHRU5JT0NfQkFTRSwgMywgdWludDMyX3QpCisKKyNlbmRpZiAv
KiAhX1NZU19TUElHRU5JT19IXyAqLwoKUHJvcGVydHkgY2hhbmdlcyBvbjogc3lzL3NwaWdlbmlv
LmgKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fXwpBZGRlZDogc3ZuOmVvbC1zdHlsZQojIyAtMCwwICsxICMjCituYXRpdmUK
XCBObyBuZXdsaW5lIGF0IGVuZCBvZiBwcm9wZXJ0eQpBZGRlZDogc3ZuOmtleXdvcmRzCiMjIC0w
LDAgKzEgIyMKK0ZyZWVCU0Q9JUgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBwcm9wZXJ0eQpBZGRl
ZDogc3ZuOm1pbWUtdHlwZQojIyAtMCwwICsxICMjCit0ZXh0L3BsYWluClwgTm8gbmV3bGluZSBh
dCBlbmQgb2YgcHJvcGVydHkK
--001a113f3c707013b3051dea7b77--



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