All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <585C815B.4030000@hisilicon.com>

diff --git a/a/1.txt b/N1/1.txt
index ecab391..6952097 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,228 +1,300 @@
-SGnvvIxNaW5nLAoKCk9uIDIwMTYvMTIvMjIgMTY6MTUsIE1pbmcgTGVpIHdyb3RlOgo+IEhpIEd1
-eXMsCj4gCj4gT24gVHVlLCBOb3YgOCwgMjAxNiBhdCAxMTo0NyBBTSwgemhpY2hhbmcueXVhbgo+
-IDx5dWFuemhpY2hhbmdAaGlzaWxpY29uLmNvbT4gd3JvdGU6Cj4+IEZvciBhcm02NCwgdGhlcmUg
-aXMgbm8gSS9PIHNwYWNlIGFzIG90aGVyIGFyY2hpdGVjdHVyYWwgcGxhdGZvcm1zLCBzdWNoIGFz
-Cj4+IFg4Ni4gTW9zdCBJL08gYWNjZXNzZXMgYXJlIGFjaGlldmVkIGJhc2VkIG9uIE1NSU8uIEJ1
-dCBmb3Igc29tZSBhcm02NCBTb0NzLAo+PiBzdWNoIGFzIEhpcDA2LCB3aGVuIGFjY2Vzc2luZyBz
-b21lIGxlZ2FjeSBJU0EgZGV2aWNlcyBjb25uZWN0ZWQgdG8gTFBDLCB0aG9zZQo+PiBrbm93biBw
-b3J0IGFkZHJlc3NlcyBhcmUgdXNlZCB0byBjb250cm9sIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdl
-dCBkZXZpY2VzLCBmb3IKPj4gZXhhbXBsZSwgMHgyZjggaXMgZm9yIFVBUlQsIDB4ZTQgaXMgZm9y
-IGlwbWktYnQuIEl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZQo+PiBub3JtYWwgTU1JTyBtb2RlIGlu
-IHVzaW5nLgo+Pgo+PiBUbyBkcml2ZSB0aGVzZSBkZXZpY2VzLCB0aGlzIHBhdGNoIGludHJvZHVj
-ZXMgYSBtZXRob2QgbmFtZWQgaW5kaXJlY3QtSU8uCj4+IEluIHRoaXMgbWV0aG9kIHRoZSBpbi9v
-dXQgcGFpciBpbiBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lvLmggd2lsbCBiZQo+PiByZWRlZmlu
-ZWQuIFdoZW4gdXBwZXIgbGF5ZXIgZHJpdmVycyBjYWxsIGluL291dCB3aXRoIHRob3NlIGtub3du
-IGxlZ2FjeSBwb3J0Cj4+IGFkZHJlc3NlcyB0byBhY2Nlc3MgdGhlIHBlcmlwaGVyYWxzLCB0aGUg
-aG9va2luZyBmdW5jdGlvbnMgY29ycnJlc3BvbmRpbmcgdG8KPj4gdGhvc2UgdGFyZ2V0IHBlcmlw
-aGVyYWxzIHdpbGwgYmUgY2FsbGVkLiBUaHJvdWdoIHRoaXMgd2F5LCB0aG9zZSB1cHBlciBsYXll
-cgo+PiBkcml2ZXJzIHdoaWNoIGRlcGVuZCBvbiBpbi9vdXQgY2FuIHJ1biBvbiBIaXAwNiB3aXRo
-b3V0IGFueSBjaGFuZ2VzLgo+Pgo+PiBDYzogQ2F0YWxpbiBNYXJpbmFzIDxjYXRhbGluLm1hcmlu
-YXNAYXJtLmNvbT4KPj4gQ2M6IFdpbGwgRGVhY29uIDx3aWxsLmRlYWNvbkBhcm0uY29tPgo+PiBT
-aWduZWQtb2ZmLWJ5OiB6aGljaGFuZy55dWFuIDx5dWFuemhpY2hhbmdAaGlzaWxpY29uLmNvbT4K
-Pj4gU2lnbmVkLW9mZi1ieTogR2FicmllbGUgUGFvbG9uaSA8Z2FicmllbGUucGFvbG9uaUBodWF3
-ZWkuY29tPgo+PiAtLS0KPj4gIGFyY2gvYXJtNjQvS2NvbmZpZyAgICAgICAgICAgICB8ICA2ICsr
-Kwo+PiAgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9leHRpby5oIHwgOTQgKysrKysrKysrKysrKysr
-KysrKysrKysrKysrKysrKysrKysrKysrKysrCj4+ICBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lv
-LmggICAgfCAyOSArKysrKysrKysrKysrCj4+ICBhcmNoL2FybTY0L2tlcm5lbC9NYWtlZmlsZSAg
-ICAgfCAgMSArCj4+ICBhcmNoL2FybTY0L2tlcm5lbC9leHRpby5jICAgICAgfCAyNyArKysrKysr
-KysrKysKPj4gIDUgZmlsZXMgY2hhbmdlZCwgMTU3IGluc2VydGlvbnMoKykKPiAKPiBXaGVuIEkg
-YXBwbGllZCB0aGVzZSB0aHJlZSBwYXRjaGVzIGFnYWluc3QgY3VycmVudCBsaW51cyB0cmVlIGFu
-ZAo+IGVuYWJsZSBDT05GSUdfSElTSUxJQ09OX0xQQywgdGhlIGZvbGxvd2luZyBidWlsZCBmYWls
-dXJlWzFdIGlzCj4gdHJpZ2dlcmVkIHdoZW4gcnVubmluZyAnbWFrZSBtb2R1bGVzJy4KPiAKClRo
-YW5rcyBmb3IgeW91ciByZXBvcnQhCgpUaGlzIHBhdGNoIGhhcyBjb21waWxhdGlvbiBpc3N1ZSBv
-biBzb21lIGFyY2hpdGVjdHVyZXMsIHNvcnJ5IGZvciB0aGUgaW5jb252ZW5pZW5jZSBjYXVzZWQg
-YnkgdGhpcyEKVGhlIG9uZ29pbmcgdjYgd2lsbCBzb2x2ZSB0aGVzZSBpc3N1ZXMuCkkgd2lsbCB0
-cmFjZSB0aGlzIGZhaWx1cmUgYW5kIHByb3ZpZGUgYSBmaXggaWYgeW91IGNhbiBub3Qgd2FpdCBm
-b3IgdGhlIG5leHQgdmVyc2lvbi4KCkNvdWxkIHlvdSBzZW5kIG1lIHlvdXIgLmNvbmZpZyBpbiBw
-cml2YXRlPyBJIGRvbid0IHdhbnQgdG8gYm90aGVyIGFsbCB0aGUgaGFja2VyIGluIHRoZSBtYWls
-LWxpc3QuCgoKVGhhbmtzLApaaGljaGFuZwoKPiAKPiBUaGFua3MsCj4gTWluZwo+IAo+IFsxXSAn
-bWFrZSBtb2R1bGVzJyBmYWlsdXJlIGxvZwo+IAo+ICAgQnVpbGRpbmcgbW9kdWxlcywgc3RhZ2Ug
-Mi4KPiAgIE1PRFBPU1QgMjI2MCBtb2R1bGVzCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3dhdGNo
-ZG9nL3dkdF9wY2kua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dGIiIFtkcml2ZXJzL3dhdGNo
-ZG9nL3dkdF9wY2kua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dGIiIFtkcml2ZXJzL3dhdGNo
-ZG9nL3Bjd2RfcGNpLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3dhdGNo
-ZG9nL3Bjd2RfcGNpLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJvdXR3IiBbZHJpdmVycy92aWRl
-by92Z2FzdGF0ZS5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0YiIgW2RyaXZlcnMvdmlkZW8v
-dmdhc3RhdGUua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogImluYiIgW2RyaXZlcnMvdmlkZW8vdmdh
-c3RhdGUua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dHciIFtkcml2ZXJzL3ZpZGVvL2ZiZGV2
-L3Z0ODYyM2ZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3ZpZGVvL2Zi
-ZGV2L3Z0ODYyM2ZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJvdXRiIiBbZHJpdmVycy92aWRl
-by9mYmRldi92dDg2MjNmYi5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0dyIgW2RyaXZlcnMv
-dmlkZW8vZmJkZXYvdHJpZGVudGZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2
-ZXJzL3ZpZGVvL2ZiZGV2L3RyaWRlbnRmYi5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0YiIg
-W2RyaXZlcnMvdmlkZW8vZmJkZXYvdHJpZGVudGZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJp
-bmIiIFtkcml2ZXJzL3ZpZGVvL2ZiZGV2L3RkZnhmYi5rb10gdW5kZWZpbmVkIQo+IC4uLi4uCj4g
-RVJST1I6ICJpbmIiIFtkcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5rb10gdW5kZWZpbmVkIQo+IEVS
-Uk9SOiAiaW5iIiBbZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5rb10gdW5kZWZpbmVkIQo+IHNjcmlw
-dHMvTWFrZWZpbGUubW9kcG9zdDo5MTogcmVjaXBlIGZvciB0YXJnZXQgJ19fbW9kcG9zdCcgZmFp
-bGVkCj4gbWFrZVsxXTogKioqIFtfX21vZHBvc3RdIEVycm9yIDEKPiBNYWtlZmlsZToxMTk2OiBy
-ZWNpcGUgZm9yIHRhcmdldCAnbW9kdWxlcycgZmFpbGVkCj4gbWFrZTogKioqIFttb2R1bGVzXSBF
-cnJvciAyCj4gCj4gCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9pbmNsdWRlL2Fz
-bS9leHRpby5oCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8u
-Ywo+Pgo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29u
-ZmlnCj4+IGluZGV4IDk2OWVmODguLmI0NDA3MGIgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQv
-S2NvbmZpZwo+PiArKysgYi9hcmNoL2FybTY0L0tjb25maWcKPj4gQEAgLTE2Myw2ICsxNjMsMTIg
-QEAgY29uZmlnIEFSQ0hfTU1BUF9STkRfQ09NUEFUX0JJVFNfTUlOCj4+ICBjb25maWcgQVJDSF9N
-TUFQX1JORF9DT01QQVRfQklUU19NQVgKPj4gICAgICAgICBkZWZhdWx0IDE2Cj4+Cj4+ICtjb25m
-aWcgQVJNNjRfSU5ESVJFQ1RfUElPCj4+ICsgICAgICAgYm9vbCAiYWNjZXNzIHBlcmlwaGVyYWxz
-IHdpdGggbGVnYWN5IEkvTyBwb3J0Igo+PiArICAgICAgIGhlbHAKPj4gKyAgICAgICAgIFN1cHBv
-cnQgc3BlY2lhbCBhY2Nlc3NvcnMgZm9yIElTQSBJL08gZGV2aWNlcy4gVGhpcyBpcyBuZWVkZWQg
-Zm9yCj4+ICsgICAgICAgICBTb0NzIHRoYXQgZG8gbm90IHN1cHBvcnQgc3RhbmRhcmQgcmVhZC93
-cml0ZSBmb3IgdGhlIElTQSByYW5nZS4KPj4gKwo+PiAgY29uZmlnIE5PX0lPUE9SVF9NQVAKPj4g
-ICAgICAgICBkZWZfYm9vbCB5IGlmICFQQ0kKPj4KPj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQv
-aW5jbHVkZS9hc20vZXh0aW8uaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXh0aW8uaAo+PiBu
-ZXcgZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi42YWUwNzg3Cj4+IC0tLSAvZGV2
-L251bGwKPj4gKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9leHRpby5oCj4+IEBAIC0wLDAg
-KzEsOTQgQEAKPj4gKy8qCj4+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSGlzaWxpY29uIExpbWl0
-ZWQsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCj4+ICsgKiBBdXRob3I6IFpoaWNoYW5nIFl1YW4gPHl1
-YW56aGljaGFuZ0BoaXNpbGljb24uY29tPgo+PiArICoKPj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBm
-cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4+ICsg
-KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZl
-cnNpb24gMiBhcwo+PiArICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
-b24uCj4+ICsgKgo+PiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
-IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
-IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+PiArICogTUVSQ0hBTlRBQklM
-SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+PiArICog
-R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KPj4gKyAqCj4+ICsg
-KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs
-aWMgTGljZW5zZQo+PiArICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8
-aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCj4+ICsgKi8KPj4gKwo+PiArI2lmbmRlZiBf
-X0xJTlVYX0VYVElPX0gKPj4gKyNkZWZpbmUgX19MSU5VWF9FWFRJT19ICj4+ICsKPj4gK3N0cnVj
-dCBleHRpb19vcHMgewo+PiArICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQ7LyogaW5jbHVzaXZl
-LCBzeXMgaW8gYWRkciAqLwo+PiArICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kOy8qIGluY2x1c2l2
-ZSwgc3lzIGlvIGFkZHIgKi8KPj4gKwo+PiArICAgICAgIHU2NCAoKnBmaW4pKHZvaWQgKmRldm9i
-aiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsIHNpemVfdCBkbGVuKTsKPj4gKyAgICAgICB2b2lkICgq
-cGZvdXQpKHZvaWQgKmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsIHUzMiBvdXR2YWwsCj4+
-ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGxlbik7Cj4+
-ICsgICAgICAgdTY0ICgqcGZpbnMpKHZvaWQgKmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIs
-IHZvaWQgKmluYnVmLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBk
-bGVuLCB1bnNpZ25lZCBpbnQgY291bnQpOwo+PiArICAgICAgIHZvaWQgKCpwZm91dHMpKHZvaWQg
-KmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsCj4+ICsgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgY29uc3Qgdm9pZCAqb3V0YnVmLCBzaXplX3QgZGxlbiwKPj4gKyAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQpOwo+PiArICAgICAgIHZvaWQg
-KmRldnBhcmE7Cj4+ICt9Owo+PiArCj4+ICtleHRlcm4gc3RydWN0IGV4dGlvX29wcyAqYXJtNjRf
-ZXh0aW9fb3BzOwo+PiArCj4+ICsjZGVmaW5lIERFQ0xBUkVfRVhUSU8oYncsIHR5cGUpICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArZXh0ZXJuIHR5
-cGUgaW4jI2J3KHVuc2lnbmVkIGxvbmcgYWRkcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgIFwKPj4gK2V4dGVybiB2b2lkIG91dCMjYncodHlwZSB2YWx1ZSwgdW5zaWdu
-ZWQgbG9uZyBhZGRyKTsgICAgICAgICAgICAgICAgICAgXAo+PiArZXh0ZXJuIHZvaWQgaW5zIyNi
-dyh1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KTtc
-Cj4+ICtleHRlcm4gdm9pZCBvdXRzIyNidyh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQg
-KmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KTsKPj4gKwo+PiArI2RlZmluZSBCVUlMRF9FWFRJ
-TyhidywgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+
-ICt0eXBlIGluIyNidyh1bnNpZ25lZCBsb25nIGFkZHIpICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAreyAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+ICsgICAgICAg
-aWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9fb3BzLT5zdGFydCA+IGFkZHIgfHwg
-ICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgYXJtNjRfZXh0aW9fb3BzLT5lbmQg
-PCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAgICAgICAgICAgICAgcmV0dXJuIHJl
-YWQjI2J3KFBDSV9JT0JBU0UgKyBhZGRyKTsgICAgICAgICAgICAgICAgICAgICBcCj4+ICsgICAg
-ICAgcmV0dXJuIGFybTY0X2V4dGlvX29wcy0+cGZpbiA/ICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGFybTY0X2V4dGlvX29wcy0+cGZpbihhcm02
-NF9leHRpb19vcHMtPmRldnBhcmEsICAgICAgICAgXAo+PiArICAgICAgICAgICAgICAgICAgICAg
-ICBhZGRyLCBzaXplb2YodHlwZSkpIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICBcCj4+ICt9
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArdm9pZCBvdXQjI2J3KHR5cGUg
-dmFsdWUsIHVuc2lnbmVkIGxvbmcgYWRkcikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+
-ICt7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICBpZiAoIWFybTY0X2V4dGlvX29wcyB8fCBhcm02
-NF9leHRpb19vcHMtPnN0YXJ0ID4gYWRkciB8fCAgICAgICAgXAo+PiArICAgICAgICAgICAgICAg
-ICAgICAgICBhcm02NF9leHRpb19vcHMtPmVuZCA8IGFkZHIpICAgICAgICAgICAgICAgICAgICBc
-Cj4+ICsgICAgICAgICAgICAgICB3cml0ZSMjYncodmFsdWUsIFBDSV9JT0JBU0UgKyBhZGRyKTsg
-ICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArICAgICAgICAgICAg
-ICAgaWYgKGFybTY0X2V4dGlvX29wcy0+cGZvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICBcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgIGFybTY0X2V4dGlvX29wcy0+cGZvdXQoYXJt
-NjRfZXh0aW9fb3BzLT5kZXZwYXJhLFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICBhZGRyLCB2YWx1ZSwgc2l6ZW9mKHR5cGUpKTsgICAgICAgICAgICAgXAo+PiArfSAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICBcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gK3ZvaWQgaW5zIyNidyh1bnNpZ25lZCBsb25n
-IGFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KSAgICAgXAo+PiAreyAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICBcCj4+ICsgICAgICAgaWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9f
-b3BzLT5zdGFydCA+IGFkZHIgfHwgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg
-YXJtNjRfZXh0aW9fb3BzLT5lbmQgPCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAg
-ICAgICAgICAgICAgcmVhZHMjI2J3KFBDSV9JT0JBU0UgKyBhZGRyLCBidWZmZXIsIGNvdW50KTsg
-ICAgICAgICAgICBcCj4+ICsgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGlmIChh
-cm02NF9leHRpb19vcHMtPnBmaW5zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAr
-ICAgICAgICAgICAgICAgICAgICAgICBhcm02NF9leHRpb19vcHMtPnBmaW5zKGFybTY0X2V4dGlv
-X29wcy0+ZGV2cGFyYSxcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciwg
-YnVmZmVyLCBzaXplb2YodHlwZSksIGNvdW50KTsgICAgIFwKPj4gK30gICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+
-PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICBcCj4+ICt2b2lkIG91dHMjI2J3KHVuc2lnbmVkIGxvbmcgYWRkciwg
-Y29uc3Qgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgY291bnQpICAgICAgXAo+PiAreyAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICBcCj4+ICsgICAgICAgaWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9f
-b3BzLT5zdGFydCA+IGFkZHIgfHwgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg
-YXJtNjRfZXh0aW9fb3BzLT5lbmQgPCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAg
-ICAgICAgICAgICAgd3JpdGVzIyNidyhQQ0lfSU9CQVNFICsgYWRkciwgYnVmZmVyLCBjb3VudCk7
-ICAgICAgICAgICBcCj4+ICsgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGlmIChh
-cm02NF9leHRpb19vcHMtPnBmb3V0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAr
-ICAgICAgICAgICAgICAgICAgICAgICBhcm02NF9leHRpb19vcHMtPnBmb3V0cyhhcm02NF9leHRp
-b19vcHMtPmRldnBhcmEsXAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIs
-IGJ1ZmZlciwgc2l6ZW9mKHR5cGUpLCBjb3VudCk7ICAgICBcCj4+ICt9Cj4+ICsKPj4gK3N0YXRp
-YyBpbmxpbmUgdm9pZCBhcm02NF9zZXRfZXh0b3BzKHN0cnVjdCBleHRpb19vcHMgKm9wcykKPj4g
-K3sKPj4gKyAgICAgICBpZiAob3BzKQo+PiArICAgICAgICAgICAgICAgV1JJVEVfT05DRShhcm02
-NF9leHRpb19vcHMsIG9wcyk7Cj4+ICt9Cj4+ICsKPj4gKyNlbmRpZiAvKiBfX0xJTlVYX0VYVElP
-X0gqLwo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9h
-cm02NC9pbmNsdWRlL2FzbS9pby5oCj4+IGluZGV4IDBiYmE0MjcuLjEzNjczNWQgMTAwNjQ0Cj4+
-IC0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW8uaAo+PiArKysgYi9hcmNoL2FybTY0L2lu
-Y2x1ZGUvYXNtL2lvLmgKPj4gQEAgLTMxLDYgKzMxLDcgQEAKPj4gICNpbmNsdWRlIDxhc20vZWFy
-bHlfaW9yZW1hcC5oPgo+PiAgI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS5oPgo+PiAgI2luY2x1
-ZGUgPGFzbS9jcHVmZWF0dXJlLmg+Cj4+ICsjaW5jbHVkZSA8YXNtL2V4dGlvLmg+Cj4+Cj4+ICAj
-aW5jbHVkZSA8eGVuL3hlbi5oPgo+Pgo+PiBAQCAtMTQ5LDYgKzE1MCwzNCBAQCBzdGF0aWMgaW5s
-aW5lIHU2NCBfX3Jhd19yZWFkcShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCj4+
-ICAjZGVmaW5lIElPX1NQQUNFX0xJTUlUICAgICAgICAgKFBDSV9JT19TSVpFIC0gMSkKPj4gICNk
-ZWZpbmUgUENJX0lPQkFTRSAgICAgICAgICAgICAoKHZvaWQgX19pb21lbSAqKVBDSV9JT19TVEFS
-VCkKPj4KPj4gKwo+PiArLyoKPj4gKyAqIHJlZGVmaW5lIHRoZSBpbihzKWIvb3V0KHMpYiBmb3Ig
-aW5kaXJlY3QtSU8uCj4+ICsgKi8KPj4gKyNpZmRlZiBDT05GSUdfQVJNNjRfSU5ESVJFQ1RfUElP
-Cj4+ICsjZGVmaW5lIGluYiBpbmIKPj4gKyNkZWZpbmUgb3V0YiBvdXRiCj4+ICsjZGVmaW5lIGlu
-c2IgaW5zYgo+PiArI2RlZmluZSBvdXRzYiBvdXRzYgo+PiArLyogZXh0ZXJuYWwgZGVjbGFyYXRp
-b24gKi8KPj4gK0RFQ0xBUkVfRVhUSU8oYiwgdTgpCj4+ICsKPj4gKyNkZWZpbmUgaW53IGludwo+
-PiArI2RlZmluZSBvdXR3IG91dHcKPj4gKyNkZWZpbmUgaW5zdyBpbnN3Cj4+ICsjZGVmaW5lIG91
-dHN3IG91dHN3Cj4+ICsKPj4gK0RFQ0xBUkVfRVhUSU8odywgdTE2KQo+PiArCj4+ICsjZGVmaW5l
-IGlubCBpbmwKPj4gKyNkZWZpbmUgb3V0bCBvdXRsCj4+ICsjZGVmaW5lIGluc2wgaW5zbAo+PiAr
-I2RlZmluZSBvdXRzbCBvdXRzbAo+PiArCj4+ICtERUNMQVJFX0VYVElPKGwsIHUzMikKPj4gKyNl
-bmRpZgo+PiArCj4+ICsKPj4gIC8qCj4+ICAgKiBTdHJpbmcgdmVyc2lvbiBvZiBJL08gbWVtb3J5
-IGFjY2VzcyBvcGVyYXRpb25zLgo+PiAgICovCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tl
-cm5lbC9NYWtlZmlsZSBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+IGluZGV4IDdkNjZi
-YmEuLjYwZTA0ODIgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+
-ICsrKyBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+IEBAIC0zMSw2ICszMSw3IEBAIGFy
-bTY0LW9iai0kKENPTkZJR19DT01QQVQpICAgICAgICAgICAgKz0gc3lzMzIubyBrdXNlcjMyLm8g
-c2lnbmFsMzIubyAgICAgICAgIFwKPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgIHN5c19jb21wYXQubyBlbnRyeTMyLm8KPj4gIGFybTY0LW9iai0kKENPTkZJR19G
-VU5DVElPTl9UUkFDRVIpICAgICs9IGZ0cmFjZS5vIGVudHJ5LWZ0cmFjZS5vCj4+ICBhcm02NC1v
-YmotJChDT05GSUdfTU9EVUxFUykgICAgICAgICAgICArPSBhcm02NGtzeW1zLm8gbW9kdWxlLm8K
-Pj4gK2FybTY0LW9iai0kKENPTkZJR19BUk02NF9JTkRJUkVDVF9QSU8pICs9IGV4dGlvLm8KPj4g
-IGFybTY0LW9iai0kKENPTkZJR19BUk02NF9NT0RVTEVfUExUUykgICs9IG1vZHVsZS1wbHRzLm8K
-Pj4gIGFybTY0LW9iai0kKENPTkZJR19QRVJGX0VWRU5UUykgICAgICAgICAgICAgICAgKz0gcGVy
-Zl9yZWdzLm8gcGVyZl9jYWxsY2hhaW4ubwo+PiAgYXJtNjQtb2JqLSQoQ09ORklHX0hXX1BFUkZf
-RVZFTlRTKSAgICAgKz0gcGVyZl9ldmVudC5vCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tl
-cm5lbC9leHRpby5jIGIvYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8uYwo+PiBuZXcgZmlsZSBtb2Rl
-IDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi42NDdiM2ZhCj4+IC0tLSAvZGV2L251bGwKPj4gKysr
-IGIvYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8uYwo+PiBAQCAtMCwwICsxLDI3IEBACj4+ICsvKgo+
-PiArICogQ29weXJpZ2h0IChDKSAyMDE2IEhpc2lsaWNvbiBMaW1pdGVkLCBBbGwgUmlnaHRzIFJl
-c2VydmVkLgo+PiArICogQXV0aG9yOiBaaGljaGFuZyBZdWFuIDx5dWFuemhpY2hhbmdAaGlzaWxp
-Y29uLmNvbT4KPj4gKyAqCj4+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91
-IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+PiArICogaXQgdW5kZXIgdGhlIHRl
-cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKPj4gKyAq
-IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+PiArICoKPj4gKyAq
-IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
-dXNlZnVsLAo+PiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
-IGltcGxpZWQgd2FycmFudHkgb2YKPj4gKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
-UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKPj4gKyAqIEdOVSBHZW5lcmFsIFB1Ymxp
-YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4+ICsgKgo+PiArICogWW91IHNob3VsZCBoYXZl
-IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKPj4gKyAq
-IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9y
-Zy9saWNlbnNlcy8+Lgo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRlIDxsaW51eC9pby5oPgo+PiAr
-Cj4+ICtzdHJ1Y3QgZXh0aW9fb3BzICphcm02NF9leHRpb19vcHM7Cj4+ICsKPj4gKwo+PiArQlVJ
-TERfRVhUSU8oYiwgdTgpCj4+ICsKPj4gK0JVSUxEX0VYVElPKHcsIHUxNikKPj4gKwo+PiArQlVJ
-TERfRVhUSU8obCwgdTMyKQo+PiAtLQo+PiAxLjkuMQo+Pgo+IAo+IAo+IAoKCl9fX19fX19fX19f
-X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFp
-bGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlz
-dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK
+Hi,Ming,
+
+
+On 2016/12/22 16:15, Ming Lei wrote:
+> Hi Guys,
+> 
+> On Tue, Nov 8, 2016 at 11:47 AM, zhichang.yuan
+> <yuanzhichang@hisilicon.com> wrote:
+>> For arm64, there is no I/O space as other architectural platforms, such as
+>> X86. Most I/O accesses are achieved based on MMIO. But for some arm64 SoCs,
+>> such as Hip06, when accessing some legacy ISA devices connected to LPC, those
+>> known port addresses are used to control the corresponding target devices, for
+>> example, 0x2f8 is for UART, 0xe4 is for ipmi-bt. It is different from the
+>> normal MMIO mode in using.
+>>
+>> To drive these devices, this patch introduces a method named indirect-IO.
+>> In this method the in/out pair in arch/arm64/include/asm/io.h will be
+>> redefined. When upper layer drivers call in/out with those known legacy port
+>> addresses to access the peripherals, the hooking functions corrresponding to
+>> those target peripherals will be called. Through this way, those upper layer
+>> drivers which depend on in/out can run on Hip06 without any changes.
+>>
+>> Cc: Catalin Marinas <catalin.marinas@arm.com>
+>> Cc: Will Deacon <will.deacon@arm.com>
+>> Signed-off-by: zhichang.yuan <yuanzhichang@hisilicon.com>
+>> Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>
+>> ---
+>>  arch/arm64/Kconfig             |  6 +++
+>>  arch/arm64/include/asm/extio.h | 94 ++++++++++++++++++++++++++++++++++++++++++
+>>  arch/arm64/include/asm/io.h    | 29 +++++++++++++
+>>  arch/arm64/kernel/Makefile     |  1 +
+>>  arch/arm64/kernel/extio.c      | 27 ++++++++++++
+>>  5 files changed, 157 insertions(+)
+> 
+> When I applied these three patches against current linus tree and
+> enable CONFIG_HISILICON_LPC, the following build failure[1] is
+> triggered when running 'make modules'.
+> 
+
+Thanks for your report!
+
+This patch has compilation issue on some architectures, sorry for the inconvenience caused by this!
+The ongoing v6 will solve these issues.
+I will trace this failure and provide a fix if you can not wait for the next version.
+
+Could you send me your .config in private? I don't want to bother all the hacker in the mail-list.
+
+
+Thanks,
+Zhichang
+
+> 
+> Thanks,
+> Ming
+> 
+> [1] 'make modules' failure log
+> 
+>   Building modules, stage 2.
+>   MODPOST 2260 modules
+> ERROR: "inb" [drivers/watchdog/wdt_pci.ko] undefined!
+> ERROR: "outb" [drivers/watchdog/wdt_pci.ko] undefined!
+> ERROR: "outb" [drivers/watchdog/pcwd_pci.ko] undefined!
+> ERROR: "inb" [drivers/watchdog/pcwd_pci.ko] undefined!
+> ERROR: "outw" [drivers/video/vgastate.ko] undefined!
+> ERROR: "outb" [drivers/video/vgastate.ko] undefined!
+> ERROR: "inb" [drivers/video/vgastate.ko] undefined!
+> ERROR: "outw" [drivers/video/fbdev/vt8623fb.ko] undefined!
+> ERROR: "inb" [drivers/video/fbdev/vt8623fb.ko] undefined!
+> ERROR: "outb" [drivers/video/fbdev/vt8623fb.ko] undefined!
+> ERROR: "outw" [drivers/video/fbdev/tridentfb.ko] undefined!
+> ERROR: "inb" [drivers/video/fbdev/tridentfb.ko] undefined!
+> ERROR: "outb" [drivers/video/fbdev/tridentfb.ko] undefined!
+> ERROR: "inb" [drivers/video/fbdev/tdfxfb.ko] undefined!
+> .....
+> ERROR: "inb" [drivers/ata/pata_cmd64x.ko] undefined!
+> ERROR: "inb" [drivers/ata/pata_artop.ko] undefined!
+> scripts/Makefile.modpost:91: recipe for target '__modpost' failed
+> make[1]: *** [__modpost] Error 1
+> Makefile:1196: recipe for target 'modules' failed
+> make: *** [modules] Error 2
+> 
+> 
+>>  create mode 100644 arch/arm64/include/asm/extio.h
+>>  create mode 100644 arch/arm64/kernel/extio.c
+>>
+>> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
+>> index 969ef88..b44070b 100644
+>> --- a/arch/arm64/Kconfig
+>> +++ b/arch/arm64/Kconfig
+>> @@ -163,6 +163,12 @@ config ARCH_MMAP_RND_COMPAT_BITS_MIN
+>>  config ARCH_MMAP_RND_COMPAT_BITS_MAX
+>>         default 16
+>>
+>> +config ARM64_INDIRECT_PIO
+>> +       bool "access peripherals with legacy I/O port"
+>> +       help
+>> +         Support special accessors for ISA I/O devices. This is needed for
+>> +         SoCs that do not support standard read/write for the ISA range.
+>> +
+>>  config NO_IOPORT_MAP
+>>         def_bool y if !PCI
+>>
+>> diff --git a/arch/arm64/include/asm/extio.h b/arch/arm64/include/asm/extio.h
+>> new file mode 100644
+>> index 0000000..6ae0787
+>> --- /dev/null
+>> +++ b/arch/arm64/include/asm/extio.h
+>> @@ -0,0 +1,94 @@
+>> +/*
+>> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved.
+>> + * Author: Zhichang Yuan <yuanzhichang@hisilicon.com>
+>> + *
+>> + * This program is free software; you can redistribute it and/or modify
+>> + * it under the terms of the GNU General Public License version 2 as
+>> + * published by the Free Software Foundation.
+>> + *
+>> + * 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.
+>> + *
+>> + * You should have received a copy of the GNU General Public License
+>> + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+>> + */
+>> +
+>> +#ifndef __LINUX_EXTIO_H
+>> +#define __LINUX_EXTIO_H
+>> +
+>> +struct extio_ops {
+>> +       unsigned long start;/* inclusive, sys io addr */
+>> +       unsigned long end;/* inclusive, sys io addr */
+>> +
+>> +       u64 (*pfin)(void *devobj, unsigned long ptaddr, size_t dlen);
+>> +       void (*pfout)(void *devobj, unsigned long ptaddr, u32 outval,
+>> +                                       size_t dlen);
+>> +       u64 (*pfins)(void *devobj, unsigned long ptaddr, void *inbuf,
+>> +                               size_t dlen, unsigned int count);
+>> +       void (*pfouts)(void *devobj, unsigned long ptaddr,
+>> +                               const void *outbuf, size_t dlen,
+>> +                               unsigned int count);
+>> +       void *devpara;
+>> +};
+>> +
+>> +extern struct extio_ops *arm64_extio_ops;
+>> +
+>> +#define DECLARE_EXTIO(bw, type)                                                \
+>> +extern type in##bw(unsigned long addr);                                        \
+>> +extern void out##bw(type value, unsigned long addr);                   \
+>> +extern void ins##bw(unsigned long addr, void *buffer, unsigned int count);\
+>> +extern void outs##bw(unsigned long addr, const void *buffer, unsigned int count);
+>> +
+>> +#define BUILD_EXTIO(bw, type)                                          \
+>> +type in##bw(unsigned long addr)                                                \
+>> +{                                                                      \
+>> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \
+>> +                       arm64_extio_ops->end < addr)                    \
+>> +               return read##bw(PCI_IOBASE + addr);                     \
+>> +       return arm64_extio_ops->pfin ?                                  \
+>> +               arm64_extio_ops->pfin(arm64_extio_ops->devpara,         \
+>> +                       addr, sizeof(type)) : -1;                       \
+>> +}                                                                      \
+>> +                                                                       \
+>> +void out##bw(type value, unsigned long addr)                           \
+>> +{                                                                      \
+>> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \
+>> +                       arm64_extio_ops->end < addr)                    \
+>> +               write##bw(value, PCI_IOBASE + addr);                    \
+>> +       else                                                            \
+>> +               if (arm64_extio_ops->pfout)                             \
+>> +                       arm64_extio_ops->pfout(arm64_extio_ops->devpara,\
+>> +                               addr, value, sizeof(type));             \
+>> +}                                                                      \
+>> +                                                                       \
+>> +void ins##bw(unsigned long addr, void *buffer, unsigned int count)     \
+>> +{                                                                      \
+>> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \
+>> +                       arm64_extio_ops->end < addr)                    \
+>> +               reads##bw(PCI_IOBASE + addr, buffer, count);            \
+>> +       else                                                            \
+>> +               if (arm64_extio_ops->pfins)                             \
+>> +                       arm64_extio_ops->pfins(arm64_extio_ops->devpara,\
+>> +                               addr, buffer, sizeof(type), count);     \
+>> +}                                                                      \
+>> +                                                                       \
+>> +void outs##bw(unsigned long addr, const void *buffer, unsigned int count)      \
+>> +{                                                                      \
+>> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \
+>> +                       arm64_extio_ops->end < addr)                    \
+>> +               writes##bw(PCI_IOBASE + addr, buffer, count);           \
+>> +       else                                                            \
+>> +               if (arm64_extio_ops->pfouts)                            \
+>> +                       arm64_extio_ops->pfouts(arm64_extio_ops->devpara,\
+>> +                               addr, buffer, sizeof(type), count);     \
+>> +}
+>> +
+>> +static inline void arm64_set_extops(struct extio_ops *ops)
+>> +{
+>> +       if (ops)
+>> +               WRITE_ONCE(arm64_extio_ops, ops);
+>> +}
+>> +
+>> +#endif /* __LINUX_EXTIO_H*/
+>> diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h
+>> index 0bba427..136735d 100644
+>> --- a/arch/arm64/include/asm/io.h
+>> +++ b/arch/arm64/include/asm/io.h
+>> @@ -31,6 +31,7 @@
+>>  #include <asm/early_ioremap.h>
+>>  #include <asm/alternative.h>
+>>  #include <asm/cpufeature.h>
+>> +#include <asm/extio.h>
+>>
+>>  #include <xen/xen.h>
+>>
+>> @@ -149,6 +150,34 @@ static inline u64 __raw_readq(const volatile void __iomem *addr)
+>>  #define IO_SPACE_LIMIT         (PCI_IO_SIZE - 1)
+>>  #define PCI_IOBASE             ((void __iomem *)PCI_IO_START)
+>>
+>> +
+>> +/*
+>> + * redefine the in(s)b/out(s)b for indirect-IO.
+>> + */
+>> +#ifdef CONFIG_ARM64_INDIRECT_PIO
+>> +#define inb inb
+>> +#define outb outb
+>> +#define insb insb
+>> +#define outsb outsb
+>> +/* external declaration */
+>> +DECLARE_EXTIO(b, u8)
+>> +
+>> +#define inw inw
+>> +#define outw outw
+>> +#define insw insw
+>> +#define outsw outsw
+>> +
+>> +DECLARE_EXTIO(w, u16)
+>> +
+>> +#define inl inl
+>> +#define outl outl
+>> +#define insl insl
+>> +#define outsl outsl
+>> +
+>> +DECLARE_EXTIO(l, u32)
+>> +#endif
+>> +
+>> +
+>>  /*
+>>   * String version of I/O memory access operations.
+>>   */
+>> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
+>> index 7d66bba..60e0482 100644
+>> --- a/arch/arm64/kernel/Makefile
+>> +++ b/arch/arm64/kernel/Makefile
+>> @@ -31,6 +31,7 @@ arm64-obj-$(CONFIG_COMPAT)            += sys32.o kuser32.o signal32.o         \
+>>                                            sys_compat.o entry32.o
+>>  arm64-obj-$(CONFIG_FUNCTION_TRACER)    += ftrace.o entry-ftrace.o
+>>  arm64-obj-$(CONFIG_MODULES)            += arm64ksyms.o module.o
+>> +arm64-obj-$(CONFIG_ARM64_INDIRECT_PIO) += extio.o
+>>  arm64-obj-$(CONFIG_ARM64_MODULE_PLTS)  += module-plts.o
+>>  arm64-obj-$(CONFIG_PERF_EVENTS)                += perf_regs.o perf_callchain.o
+>>  arm64-obj-$(CONFIG_HW_PERF_EVENTS)     += perf_event.o
+>> diff --git a/arch/arm64/kernel/extio.c b/arch/arm64/kernel/extio.c
+>> new file mode 100644
+>> index 0000000..647b3fa
+>> --- /dev/null
+>> +++ b/arch/arm64/kernel/extio.c
+>> @@ -0,0 +1,27 @@
+>> +/*
+>> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved.
+>> + * Author: Zhichang Yuan <yuanzhichang@hisilicon.com>
+>> + *
+>> + * This program is free software; you can redistribute it and/or modify
+>> + * it under the terms of the GNU General Public License version 2 as
+>> + * published by the Free Software Foundation.
+>> + *
+>> + * 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.
+>> + *
+>> + * You should have received a copy of the GNU General Public License
+>> + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+>> + */
+>> +
+>> +#include <linux/io.h>
+>> +
+>> +struct extio_ops *arm64_extio_ops;
+>> +
+>> +
+>> +BUILD_EXTIO(b, u8)
+>> +
+>> +BUILD_EXTIO(w, u16)
+>> +
+>> +BUILD_EXTIO(l, u32)
+>> --
+>> 1.9.1
+>>
+> 
+> 
+>
diff --git a/a/content_digest b/N1/content_digest
index d3eaabc..d2ac1db 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -5,258 +5,327 @@
  "Subject\0Re: [PATCH V5 1/3] ARM64 LPC: Indirect ISA port IO introduced\0"
  "Date\0Fri, 23 Dec 2016 09:43:55 +0800\0"
  "To\0Ming Lei <tom.leiming@gmail.com>\0"
- "Cc\0Mark Rutland <mark.rutland@arm.com>"
-  gabriele.paoloni@huawei.com
-  Benjamin Herrenschmidt <benh@kernel.crashing.org>
+ "Cc\0Catalin Marinas <catalin.marinas@arm.com>"
   Will Deacon <will.deacon@arm.com>
-  linuxarm@huawei.com
-  Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+  Rob Herring <robh+dt@kernel.org>
+  Bjorn Helgaas <bhelgaas@google.com>
+  Mark Rutland <mark.rutland@arm.com>
+  Olof Johansson <olof@lixom.net>
   Arnd Bergmann <arnd@arndb.de>
-  xuwei5@hisilicon.com
-  linux-serial@vger.kernel.org
-  Catalin Marinas <catalin.marinas@arm.com>
+  linux-arm-kernel <linux-arm-kernel@lists.infradead.org>
+  Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+  Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
+  linuxarm@huawei.com
   devicetree@vger.kernel.org <devicetree@vger.kernel.org>
+  linux-pci@vger.kernel.org <linux-pci@vger.kernel.org>
+  linux-serial@vger.kernel.org
   minyard@acm.org
+  Benjamin Herrenschmidt <benh@kernel.crashing.org>
   Liviu Dudau <liviu.dudau@arm.com>
-  john.garry@huawei.com
   zourongrong@gmail.com
-  Rob Herring <robh+dt@kernel.org>
-  Bjorn Helgaas <bhelgaas@google.com>
-  kantyzc@163.com
-  zhichang.yuan02@gmail.com
-  linux-arm-kernel <linux-arm-kernel@lists.infradead.org>
-  linux-pci@vger.kernel.org <linux-pci@vger.kernel.org>
-  Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
- " Olof Johansson <olof@lixom.net>\0"
+  john.garry@huawei.com
+ " gabriele.paoloni@huawei.com\0"
  "\00:1\0"
  "b\0"
- "SGnvvIxNaW5nLAoKCk9uIDIwMTYvMTIvMjIgMTY6MTUsIE1pbmcgTGVpIHdyb3RlOgo+IEhpIEd1\n"
- "eXMsCj4gCj4gT24gVHVlLCBOb3YgOCwgMjAxNiBhdCAxMTo0NyBBTSwgemhpY2hhbmcueXVhbgo+\n"
- "IDx5dWFuemhpY2hhbmdAaGlzaWxpY29uLmNvbT4gd3JvdGU6Cj4+IEZvciBhcm02NCwgdGhlcmUg\n"
- "aXMgbm8gSS9PIHNwYWNlIGFzIG90aGVyIGFyY2hpdGVjdHVyYWwgcGxhdGZvcm1zLCBzdWNoIGFz\n"
- "Cj4+IFg4Ni4gTW9zdCBJL08gYWNjZXNzZXMgYXJlIGFjaGlldmVkIGJhc2VkIG9uIE1NSU8uIEJ1\n"
- "dCBmb3Igc29tZSBhcm02NCBTb0NzLAo+PiBzdWNoIGFzIEhpcDA2LCB3aGVuIGFjY2Vzc2luZyBz\n"
- "b21lIGxlZ2FjeSBJU0EgZGV2aWNlcyBjb25uZWN0ZWQgdG8gTFBDLCB0aG9zZQo+PiBrbm93biBw\n"
- "b3J0IGFkZHJlc3NlcyBhcmUgdXNlZCB0byBjb250cm9sIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdl\n"
- "dCBkZXZpY2VzLCBmb3IKPj4gZXhhbXBsZSwgMHgyZjggaXMgZm9yIFVBUlQsIDB4ZTQgaXMgZm9y\n"
- "IGlwbWktYnQuIEl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZQo+PiBub3JtYWwgTU1JTyBtb2RlIGlu\n"
- "IHVzaW5nLgo+Pgo+PiBUbyBkcml2ZSB0aGVzZSBkZXZpY2VzLCB0aGlzIHBhdGNoIGludHJvZHVj\n"
- "ZXMgYSBtZXRob2QgbmFtZWQgaW5kaXJlY3QtSU8uCj4+IEluIHRoaXMgbWV0aG9kIHRoZSBpbi9v\n"
- "dXQgcGFpciBpbiBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lvLmggd2lsbCBiZQo+PiByZWRlZmlu\n"
- "ZWQuIFdoZW4gdXBwZXIgbGF5ZXIgZHJpdmVycyBjYWxsIGluL291dCB3aXRoIHRob3NlIGtub3du\n"
- "IGxlZ2FjeSBwb3J0Cj4+IGFkZHJlc3NlcyB0byBhY2Nlc3MgdGhlIHBlcmlwaGVyYWxzLCB0aGUg\n"
- "aG9va2luZyBmdW5jdGlvbnMgY29ycnJlc3BvbmRpbmcgdG8KPj4gdGhvc2UgdGFyZ2V0IHBlcmlw\n"
- "aGVyYWxzIHdpbGwgYmUgY2FsbGVkLiBUaHJvdWdoIHRoaXMgd2F5LCB0aG9zZSB1cHBlciBsYXll\n"
- "cgo+PiBkcml2ZXJzIHdoaWNoIGRlcGVuZCBvbiBpbi9vdXQgY2FuIHJ1biBvbiBIaXAwNiB3aXRo\n"
- "b3V0IGFueSBjaGFuZ2VzLgo+Pgo+PiBDYzogQ2F0YWxpbiBNYXJpbmFzIDxjYXRhbGluLm1hcmlu\n"
- "YXNAYXJtLmNvbT4KPj4gQ2M6IFdpbGwgRGVhY29uIDx3aWxsLmRlYWNvbkBhcm0uY29tPgo+PiBT\n"
- "aWduZWQtb2ZmLWJ5OiB6aGljaGFuZy55dWFuIDx5dWFuemhpY2hhbmdAaGlzaWxpY29uLmNvbT4K\n"
- "Pj4gU2lnbmVkLW9mZi1ieTogR2FicmllbGUgUGFvbG9uaSA8Z2FicmllbGUucGFvbG9uaUBodWF3\n"
- "ZWkuY29tPgo+PiAtLS0KPj4gIGFyY2gvYXJtNjQvS2NvbmZpZyAgICAgICAgICAgICB8ICA2ICsr\n"
- "Kwo+PiAgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9leHRpby5oIHwgOTQgKysrKysrKysrKysrKysr\n"
- "KysrKysrKysrKysrKysrKysrKysrKysrKysrCj4+ICBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lv\n"
- "LmggICAgfCAyOSArKysrKysrKysrKysrCj4+ICBhcmNoL2FybTY0L2tlcm5lbC9NYWtlZmlsZSAg\n"
- "ICAgfCAgMSArCj4+ICBhcmNoL2FybTY0L2tlcm5lbC9leHRpby5jICAgICAgfCAyNyArKysrKysr\n"
- "KysrKysKPj4gIDUgZmlsZXMgY2hhbmdlZCwgMTU3IGluc2VydGlvbnMoKykKPiAKPiBXaGVuIEkg\n"
- "YXBwbGllZCB0aGVzZSB0aHJlZSBwYXRjaGVzIGFnYWluc3QgY3VycmVudCBsaW51cyB0cmVlIGFu\n"
- "ZAo+IGVuYWJsZSBDT05GSUdfSElTSUxJQ09OX0xQQywgdGhlIGZvbGxvd2luZyBidWlsZCBmYWls\n"
- "dXJlWzFdIGlzCj4gdHJpZ2dlcmVkIHdoZW4gcnVubmluZyAnbWFrZSBtb2R1bGVzJy4KPiAKClRo\n"
- "YW5rcyBmb3IgeW91ciByZXBvcnQhCgpUaGlzIHBhdGNoIGhhcyBjb21waWxhdGlvbiBpc3N1ZSBv\n"
- "biBzb21lIGFyY2hpdGVjdHVyZXMsIHNvcnJ5IGZvciB0aGUgaW5jb252ZW5pZW5jZSBjYXVzZWQg\n"
- "YnkgdGhpcyEKVGhlIG9uZ29pbmcgdjYgd2lsbCBzb2x2ZSB0aGVzZSBpc3N1ZXMuCkkgd2lsbCB0\n"
- "cmFjZSB0aGlzIGZhaWx1cmUgYW5kIHByb3ZpZGUgYSBmaXggaWYgeW91IGNhbiBub3Qgd2FpdCBm\n"
- "b3IgdGhlIG5leHQgdmVyc2lvbi4KCkNvdWxkIHlvdSBzZW5kIG1lIHlvdXIgLmNvbmZpZyBpbiBw\n"
- "cml2YXRlPyBJIGRvbid0IHdhbnQgdG8gYm90aGVyIGFsbCB0aGUgaGFja2VyIGluIHRoZSBtYWls\n"
- "LWxpc3QuCgoKVGhhbmtzLApaaGljaGFuZwoKPiAKPiBUaGFua3MsCj4gTWluZwo+IAo+IFsxXSAn\n"
- "bWFrZSBtb2R1bGVzJyBmYWlsdXJlIGxvZwo+IAo+ICAgQnVpbGRpbmcgbW9kdWxlcywgc3RhZ2Ug\n"
- "Mi4KPiAgIE1PRFBPU1QgMjI2MCBtb2R1bGVzCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3dhdGNo\n"
- "ZG9nL3dkdF9wY2kua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dGIiIFtkcml2ZXJzL3dhdGNo\n"
- "ZG9nL3dkdF9wY2kua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dGIiIFtkcml2ZXJzL3dhdGNo\n"
- "ZG9nL3Bjd2RfcGNpLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3dhdGNo\n"
- "ZG9nL3Bjd2RfcGNpLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJvdXR3IiBbZHJpdmVycy92aWRl\n"
- "by92Z2FzdGF0ZS5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0YiIgW2RyaXZlcnMvdmlkZW8v\n"
- "dmdhc3RhdGUua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogImluYiIgW2RyaXZlcnMvdmlkZW8vdmdh\n"
- "c3RhdGUua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dHciIFtkcml2ZXJzL3ZpZGVvL2ZiZGV2\n"
- "L3Z0ODYyM2ZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3ZpZGVvL2Zi\n"
- "ZGV2L3Z0ODYyM2ZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJvdXRiIiBbZHJpdmVycy92aWRl\n"
- "by9mYmRldi92dDg2MjNmYi5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0dyIgW2RyaXZlcnMv\n"
- "dmlkZW8vZmJkZXYvdHJpZGVudGZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2\n"
- "ZXJzL3ZpZGVvL2ZiZGV2L3RyaWRlbnRmYi5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0YiIg\n"
- "W2RyaXZlcnMvdmlkZW8vZmJkZXYvdHJpZGVudGZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJp\n"
- "bmIiIFtkcml2ZXJzL3ZpZGVvL2ZiZGV2L3RkZnhmYi5rb10gdW5kZWZpbmVkIQo+IC4uLi4uCj4g\n"
- "RVJST1I6ICJpbmIiIFtkcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5rb10gdW5kZWZpbmVkIQo+IEVS\n"
- "Uk9SOiAiaW5iIiBbZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5rb10gdW5kZWZpbmVkIQo+IHNjcmlw\n"
- "dHMvTWFrZWZpbGUubW9kcG9zdDo5MTogcmVjaXBlIGZvciB0YXJnZXQgJ19fbW9kcG9zdCcgZmFp\n"
- "bGVkCj4gbWFrZVsxXTogKioqIFtfX21vZHBvc3RdIEVycm9yIDEKPiBNYWtlZmlsZToxMTk2OiBy\n"
- "ZWNpcGUgZm9yIHRhcmdldCAnbW9kdWxlcycgZmFpbGVkCj4gbWFrZTogKioqIFttb2R1bGVzXSBF\n"
- "cnJvciAyCj4gCj4gCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9pbmNsdWRlL2Fz\n"
- "bS9leHRpby5oCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8u\n"
- "Ywo+Pgo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29u\n"
- "ZmlnCj4+IGluZGV4IDk2OWVmODguLmI0NDA3MGIgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQv\n"
- "S2NvbmZpZwo+PiArKysgYi9hcmNoL2FybTY0L0tjb25maWcKPj4gQEAgLTE2Myw2ICsxNjMsMTIg\n"
- "QEAgY29uZmlnIEFSQ0hfTU1BUF9STkRfQ09NUEFUX0JJVFNfTUlOCj4+ICBjb25maWcgQVJDSF9N\n"
- "TUFQX1JORF9DT01QQVRfQklUU19NQVgKPj4gICAgICAgICBkZWZhdWx0IDE2Cj4+Cj4+ICtjb25m\n"
- "aWcgQVJNNjRfSU5ESVJFQ1RfUElPCj4+ICsgICAgICAgYm9vbCAiYWNjZXNzIHBlcmlwaGVyYWxz\n"
- "IHdpdGggbGVnYWN5IEkvTyBwb3J0Igo+PiArICAgICAgIGhlbHAKPj4gKyAgICAgICAgIFN1cHBv\n"
- "cnQgc3BlY2lhbCBhY2Nlc3NvcnMgZm9yIElTQSBJL08gZGV2aWNlcy4gVGhpcyBpcyBuZWVkZWQg\n"
- "Zm9yCj4+ICsgICAgICAgICBTb0NzIHRoYXQgZG8gbm90IHN1cHBvcnQgc3RhbmRhcmQgcmVhZC93\n"
- "cml0ZSBmb3IgdGhlIElTQSByYW5nZS4KPj4gKwo+PiAgY29uZmlnIE5PX0lPUE9SVF9NQVAKPj4g\n"
- "ICAgICAgICBkZWZfYm9vbCB5IGlmICFQQ0kKPj4KPj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQv\n"
- "aW5jbHVkZS9hc20vZXh0aW8uaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXh0aW8uaAo+PiBu\n"
- "ZXcgZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi42YWUwNzg3Cj4+IC0tLSAvZGV2\n"
- "L251bGwKPj4gKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9leHRpby5oCj4+IEBAIC0wLDAg\n"
- "KzEsOTQgQEAKPj4gKy8qCj4+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSGlzaWxpY29uIExpbWl0\n"
- "ZWQsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCj4+ICsgKiBBdXRob3I6IFpoaWNoYW5nIFl1YW4gPHl1\n"
- "YW56aGljaGFuZ0BoaXNpbGljb24uY29tPgo+PiArICoKPj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBm\n"
- "cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4+ICsg\n"
- "KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZl\n"
- "cnNpb24gMiBhcwo+PiArICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp\n"
- "b24uCj4+ICsgKgo+PiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl\n"
- "IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7\n"
- "IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+PiArICogTUVSQ0hBTlRBQklM\n"
- "SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+PiArICog\n"
- "R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KPj4gKyAqCj4+ICsg\n"
- "KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs\n"
- "aWMgTGljZW5zZQo+PiArICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8\n"
- "aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCj4+ICsgKi8KPj4gKwo+PiArI2lmbmRlZiBf\n"
- "X0xJTlVYX0VYVElPX0gKPj4gKyNkZWZpbmUgX19MSU5VWF9FWFRJT19ICj4+ICsKPj4gK3N0cnVj\n"
- "dCBleHRpb19vcHMgewo+PiArICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQ7LyogaW5jbHVzaXZl\n"
- "LCBzeXMgaW8gYWRkciAqLwo+PiArICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kOy8qIGluY2x1c2l2\n"
- "ZSwgc3lzIGlvIGFkZHIgKi8KPj4gKwo+PiArICAgICAgIHU2NCAoKnBmaW4pKHZvaWQgKmRldm9i\n"
- "aiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsIHNpemVfdCBkbGVuKTsKPj4gKyAgICAgICB2b2lkICgq\n"
- "cGZvdXQpKHZvaWQgKmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsIHUzMiBvdXR2YWwsCj4+\n"
- "ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGxlbik7Cj4+\n"
- "ICsgICAgICAgdTY0ICgqcGZpbnMpKHZvaWQgKmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIs\n"
- "IHZvaWQgKmluYnVmLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBk\n"
- "bGVuLCB1bnNpZ25lZCBpbnQgY291bnQpOwo+PiArICAgICAgIHZvaWQgKCpwZm91dHMpKHZvaWQg\n"
- "KmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsCj4+ICsgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgY29uc3Qgdm9pZCAqb3V0YnVmLCBzaXplX3QgZGxlbiwKPj4gKyAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQpOwo+PiArICAgICAgIHZvaWQg\n"
- "KmRldnBhcmE7Cj4+ICt9Owo+PiArCj4+ICtleHRlcm4gc3RydWN0IGV4dGlvX29wcyAqYXJtNjRf\n"
- "ZXh0aW9fb3BzOwo+PiArCj4+ICsjZGVmaW5lIERFQ0xBUkVfRVhUSU8oYncsIHR5cGUpICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArZXh0ZXJuIHR5\n"
- "cGUgaW4jI2J3KHVuc2lnbmVkIGxvbmcgYWRkcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgIFwKPj4gK2V4dGVybiB2b2lkIG91dCMjYncodHlwZSB2YWx1ZSwgdW5zaWdu\n"
- "ZWQgbG9uZyBhZGRyKTsgICAgICAgICAgICAgICAgICAgXAo+PiArZXh0ZXJuIHZvaWQgaW5zIyNi\n"
- "dyh1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KTtc\n"
- "Cj4+ICtleHRlcm4gdm9pZCBvdXRzIyNidyh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQg\n"
- "KmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KTsKPj4gKwo+PiArI2RlZmluZSBCVUlMRF9FWFRJ\n"
- "TyhidywgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+\n"
- "ICt0eXBlIGluIyNidyh1bnNpZ25lZCBsb25nIGFkZHIpICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAreyAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+ICsgICAgICAg\n"
- "aWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9fb3BzLT5zdGFydCA+IGFkZHIgfHwg\n"
- "ICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgYXJtNjRfZXh0aW9fb3BzLT5lbmQg\n"
- "PCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAgICAgICAgICAgICAgcmV0dXJuIHJl\n"
- "YWQjI2J3KFBDSV9JT0JBU0UgKyBhZGRyKTsgICAgICAgICAgICAgICAgICAgICBcCj4+ICsgICAg\n"
- "ICAgcmV0dXJuIGFybTY0X2V4dGlvX29wcy0+cGZpbiA/ICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGFybTY0X2V4dGlvX29wcy0+cGZpbihhcm02\n"
- "NF9leHRpb19vcHMtPmRldnBhcmEsICAgICAgICAgXAo+PiArICAgICAgICAgICAgICAgICAgICAg\n"
- "ICBhZGRyLCBzaXplb2YodHlwZSkpIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICBcCj4+ICt9\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArdm9pZCBvdXQjI2J3KHR5cGUg\n"
- "dmFsdWUsIHVuc2lnbmVkIGxvbmcgYWRkcikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+\n"
- "ICt7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICBpZiAoIWFybTY0X2V4dGlvX29wcyB8fCBhcm02\n"
- "NF9leHRpb19vcHMtPnN0YXJ0ID4gYWRkciB8fCAgICAgICAgXAo+PiArICAgICAgICAgICAgICAg\n"
- "ICAgICAgICBhcm02NF9leHRpb19vcHMtPmVuZCA8IGFkZHIpICAgICAgICAgICAgICAgICAgICBc\n"
- "Cj4+ICsgICAgICAgICAgICAgICB3cml0ZSMjYncodmFsdWUsIFBDSV9JT0JBU0UgKyBhZGRyKTsg\n"
- "ICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArICAgICAgICAgICAg\n"
- "ICAgaWYgKGFybTY0X2V4dGlvX29wcy0+cGZvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICBcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgIGFybTY0X2V4dGlvX29wcy0+cGZvdXQoYXJt\n"
- "NjRfZXh0aW9fb3BzLT5kZXZwYXJhLFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICBhZGRyLCB2YWx1ZSwgc2l6ZW9mKHR5cGUpKTsgICAgICAgICAgICAgXAo+PiArfSAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICBcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gK3ZvaWQgaW5zIyNidyh1bnNpZ25lZCBsb25n\n"
- "IGFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KSAgICAgXAo+PiAreyAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICBcCj4+ICsgICAgICAgaWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9f\n"
- "b3BzLT5zdGFydCA+IGFkZHIgfHwgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg\n"
- "YXJtNjRfZXh0aW9fb3BzLT5lbmQgPCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAg\n"
- "ICAgICAgICAgICAgcmVhZHMjI2J3KFBDSV9JT0JBU0UgKyBhZGRyLCBidWZmZXIsIGNvdW50KTsg\n"
- "ICAgICAgICAgICBcCj4+ICsgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGlmIChh\n"
- "cm02NF9leHRpb19vcHMtPnBmaW5zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAr\n"
- "ICAgICAgICAgICAgICAgICAgICAgICBhcm02NF9leHRpb19vcHMtPnBmaW5zKGFybTY0X2V4dGlv\n"
- "X29wcy0+ZGV2cGFyYSxcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciwg\n"
- "YnVmZmVyLCBzaXplb2YodHlwZSksIGNvdW50KTsgICAgIFwKPj4gK30gICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+\n"
- "PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICBcCj4+ICt2b2lkIG91dHMjI2J3KHVuc2lnbmVkIGxvbmcgYWRkciwg\n"
- "Y29uc3Qgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgY291bnQpICAgICAgXAo+PiAreyAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICBcCj4+ICsgICAgICAgaWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9f\n"
- "b3BzLT5zdGFydCA+IGFkZHIgfHwgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg\n"
- "YXJtNjRfZXh0aW9fb3BzLT5lbmQgPCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAg\n"
- "ICAgICAgICAgICAgd3JpdGVzIyNidyhQQ0lfSU9CQVNFICsgYWRkciwgYnVmZmVyLCBjb3VudCk7\n"
- "ICAgICAgICAgICBcCj4+ICsgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGlmIChh\n"
- "cm02NF9leHRpb19vcHMtPnBmb3V0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAr\n"
- "ICAgICAgICAgICAgICAgICAgICAgICBhcm02NF9leHRpb19vcHMtPnBmb3V0cyhhcm02NF9leHRp\n"
- "b19vcHMtPmRldnBhcmEsXAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIs\n"
- "IGJ1ZmZlciwgc2l6ZW9mKHR5cGUpLCBjb3VudCk7ICAgICBcCj4+ICt9Cj4+ICsKPj4gK3N0YXRp\n"
- "YyBpbmxpbmUgdm9pZCBhcm02NF9zZXRfZXh0b3BzKHN0cnVjdCBleHRpb19vcHMgKm9wcykKPj4g\n"
- "K3sKPj4gKyAgICAgICBpZiAob3BzKQo+PiArICAgICAgICAgICAgICAgV1JJVEVfT05DRShhcm02\n"
- "NF9leHRpb19vcHMsIG9wcyk7Cj4+ICt9Cj4+ICsKPj4gKyNlbmRpZiAvKiBfX0xJTlVYX0VYVElP\n"
- "X0gqLwo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9h\n"
- "cm02NC9pbmNsdWRlL2FzbS9pby5oCj4+IGluZGV4IDBiYmE0MjcuLjEzNjczNWQgMTAwNjQ0Cj4+\n"
- "IC0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW8uaAo+PiArKysgYi9hcmNoL2FybTY0L2lu\n"
- "Y2x1ZGUvYXNtL2lvLmgKPj4gQEAgLTMxLDYgKzMxLDcgQEAKPj4gICNpbmNsdWRlIDxhc20vZWFy\n"
- "bHlfaW9yZW1hcC5oPgo+PiAgI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS5oPgo+PiAgI2luY2x1\n"
- "ZGUgPGFzbS9jcHVmZWF0dXJlLmg+Cj4+ICsjaW5jbHVkZSA8YXNtL2V4dGlvLmg+Cj4+Cj4+ICAj\n"
- "aW5jbHVkZSA8eGVuL3hlbi5oPgo+Pgo+PiBAQCAtMTQ5LDYgKzE1MCwzNCBAQCBzdGF0aWMgaW5s\n"
- "aW5lIHU2NCBfX3Jhd19yZWFkcShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCj4+\n"
- "ICAjZGVmaW5lIElPX1NQQUNFX0xJTUlUICAgICAgICAgKFBDSV9JT19TSVpFIC0gMSkKPj4gICNk\n"
- "ZWZpbmUgUENJX0lPQkFTRSAgICAgICAgICAgICAoKHZvaWQgX19pb21lbSAqKVBDSV9JT19TVEFS\n"
- "VCkKPj4KPj4gKwo+PiArLyoKPj4gKyAqIHJlZGVmaW5lIHRoZSBpbihzKWIvb3V0KHMpYiBmb3Ig\n"
- "aW5kaXJlY3QtSU8uCj4+ICsgKi8KPj4gKyNpZmRlZiBDT05GSUdfQVJNNjRfSU5ESVJFQ1RfUElP\n"
- "Cj4+ICsjZGVmaW5lIGluYiBpbmIKPj4gKyNkZWZpbmUgb3V0YiBvdXRiCj4+ICsjZGVmaW5lIGlu\n"
- "c2IgaW5zYgo+PiArI2RlZmluZSBvdXRzYiBvdXRzYgo+PiArLyogZXh0ZXJuYWwgZGVjbGFyYXRp\n"
- "b24gKi8KPj4gK0RFQ0xBUkVfRVhUSU8oYiwgdTgpCj4+ICsKPj4gKyNkZWZpbmUgaW53IGludwo+\n"
- "PiArI2RlZmluZSBvdXR3IG91dHcKPj4gKyNkZWZpbmUgaW5zdyBpbnN3Cj4+ICsjZGVmaW5lIG91\n"
- "dHN3IG91dHN3Cj4+ICsKPj4gK0RFQ0xBUkVfRVhUSU8odywgdTE2KQo+PiArCj4+ICsjZGVmaW5l\n"
- "IGlubCBpbmwKPj4gKyNkZWZpbmUgb3V0bCBvdXRsCj4+ICsjZGVmaW5lIGluc2wgaW5zbAo+PiAr\n"
- "I2RlZmluZSBvdXRzbCBvdXRzbAo+PiArCj4+ICtERUNMQVJFX0VYVElPKGwsIHUzMikKPj4gKyNl\n"
- "bmRpZgo+PiArCj4+ICsKPj4gIC8qCj4+ICAgKiBTdHJpbmcgdmVyc2lvbiBvZiBJL08gbWVtb3J5\n"
- "IGFjY2VzcyBvcGVyYXRpb25zLgo+PiAgICovCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tl\n"
- "cm5lbC9NYWtlZmlsZSBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+IGluZGV4IDdkNjZi\n"
- "YmEuLjYwZTA0ODIgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+\n"
- "ICsrKyBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+IEBAIC0zMSw2ICszMSw3IEBAIGFy\n"
- "bTY0LW9iai0kKENPTkZJR19DT01QQVQpICAgICAgICAgICAgKz0gc3lzMzIubyBrdXNlcjMyLm8g\n"
- "c2lnbmFsMzIubyAgICAgICAgIFwKPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgIHN5c19jb21wYXQubyBlbnRyeTMyLm8KPj4gIGFybTY0LW9iai0kKENPTkZJR19G\n"
- "VU5DVElPTl9UUkFDRVIpICAgICs9IGZ0cmFjZS5vIGVudHJ5LWZ0cmFjZS5vCj4+ICBhcm02NC1v\n"
- "YmotJChDT05GSUdfTU9EVUxFUykgICAgICAgICAgICArPSBhcm02NGtzeW1zLm8gbW9kdWxlLm8K\n"
- "Pj4gK2FybTY0LW9iai0kKENPTkZJR19BUk02NF9JTkRJUkVDVF9QSU8pICs9IGV4dGlvLm8KPj4g\n"
- "IGFybTY0LW9iai0kKENPTkZJR19BUk02NF9NT0RVTEVfUExUUykgICs9IG1vZHVsZS1wbHRzLm8K\n"
- "Pj4gIGFybTY0LW9iai0kKENPTkZJR19QRVJGX0VWRU5UUykgICAgICAgICAgICAgICAgKz0gcGVy\n"
- "Zl9yZWdzLm8gcGVyZl9jYWxsY2hhaW4ubwo+PiAgYXJtNjQtb2JqLSQoQ09ORklHX0hXX1BFUkZf\n"
- "RVZFTlRTKSAgICAgKz0gcGVyZl9ldmVudC5vCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tl\n"
- "cm5lbC9leHRpby5jIGIvYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8uYwo+PiBuZXcgZmlsZSBtb2Rl\n"
- "IDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi42NDdiM2ZhCj4+IC0tLSAvZGV2L251bGwKPj4gKysr\n"
- "IGIvYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8uYwo+PiBAQCAtMCwwICsxLDI3IEBACj4+ICsvKgo+\n"
- "PiArICogQ29weXJpZ2h0IChDKSAyMDE2IEhpc2lsaWNvbiBMaW1pdGVkLCBBbGwgUmlnaHRzIFJl\n"
- "c2VydmVkLgo+PiArICogQXV0aG9yOiBaaGljaGFuZyBZdWFuIDx5dWFuemhpY2hhbmdAaGlzaWxp\n"
- "Y29uLmNvbT4KPj4gKyAqCj4+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91\n"
- "IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+PiArICogaXQgdW5kZXIgdGhlIHRl\n"
- "cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKPj4gKyAq\n"
- "IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+PiArICoKPj4gKyAq\n"
- "IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg\n"
- "dXNlZnVsLAo+PiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl\n"
- "IGltcGxpZWQgd2FycmFudHkgb2YKPj4gKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP\n"
- "UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKPj4gKyAqIEdOVSBHZW5lcmFsIFB1Ymxp\n"
- "YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4+ICsgKgo+PiArICogWW91IHNob3VsZCBoYXZl\n"
- "IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKPj4gKyAq\n"
- "IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9y\n"
- "Zy9saWNlbnNlcy8+Lgo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRlIDxsaW51eC9pby5oPgo+PiAr\n"
- "Cj4+ICtzdHJ1Y3QgZXh0aW9fb3BzICphcm02NF9leHRpb19vcHM7Cj4+ICsKPj4gKwo+PiArQlVJ\n"
- "TERfRVhUSU8oYiwgdTgpCj4+ICsKPj4gK0JVSUxEX0VYVElPKHcsIHUxNikKPj4gKwo+PiArQlVJ\n"
- "TERfRVhUSU8obCwgdTMyKQo+PiAtLQo+PiAxLjkuMQo+Pgo+IAo+IAo+IAoKCl9fX19fX19fX19f\n"
- "X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFp\n"
- "bGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlz\n"
- dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK
+ "Hi\357\274\214Ming,\n"
+ "\n"
+ "\n"
+ "On 2016/12/22 16:15, Ming Lei wrote:\n"
+ "> Hi Guys,\n"
+ "> \n"
+ "> On Tue, Nov 8, 2016 at 11:47 AM, zhichang.yuan\n"
+ "> <yuanzhichang@hisilicon.com> wrote:\n"
+ ">> For arm64, there is no I/O space as other architectural platforms, such as\n"
+ ">> X86. Most I/O accesses are achieved based on MMIO. But for some arm64 SoCs,\n"
+ ">> such as Hip06, when accessing some legacy ISA devices connected to LPC, those\n"
+ ">> known port addresses are used to control the corresponding target devices, for\n"
+ ">> example, 0x2f8 is for UART, 0xe4 is for ipmi-bt. It is different from the\n"
+ ">> normal MMIO mode in using.\n"
+ ">>\n"
+ ">> To drive these devices, this patch introduces a method named indirect-IO.\n"
+ ">> In this method the in/out pair in arch/arm64/include/asm/io.h will be\n"
+ ">> redefined. When upper layer drivers call in/out with those known legacy port\n"
+ ">> addresses to access the peripherals, the hooking functions corrresponding to\n"
+ ">> those target peripherals will be called. Through this way, those upper layer\n"
+ ">> drivers which depend on in/out can run on Hip06 without any changes.\n"
+ ">>\n"
+ ">> Cc: Catalin Marinas <catalin.marinas@arm.com>\n"
+ ">> Cc: Will Deacon <will.deacon@arm.com>\n"
+ ">> Signed-off-by: zhichang.yuan <yuanzhichang@hisilicon.com>\n"
+ ">> Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>\n"
+ ">> ---\n"
+ ">>  arch/arm64/Kconfig             |  6 +++\n"
+ ">>  arch/arm64/include/asm/extio.h | 94 ++++++++++++++++++++++++++++++++++++++++++\n"
+ ">>  arch/arm64/include/asm/io.h    | 29 +++++++++++++\n"
+ ">>  arch/arm64/kernel/Makefile     |  1 +\n"
+ ">>  arch/arm64/kernel/extio.c      | 27 ++++++++++++\n"
+ ">>  5 files changed, 157 insertions(+)\n"
+ "> \n"
+ "> When I applied these three patches against current linus tree and\n"
+ "> enable CONFIG_HISILICON_LPC, the following build failure[1] is\n"
+ "> triggered when running 'make modules'.\n"
+ "> \n"
+ "\n"
+ "Thanks for your report!\n"
+ "\n"
+ "This patch has compilation issue on some architectures, sorry for the inconvenience caused by this!\n"
+ "The ongoing v6 will solve these issues.\n"
+ "I will trace this failure and provide a fix if you can not wait for the next version.\n"
+ "\n"
+ "Could you send me your .config in private? I don't want to bother all the hacker in the mail-list.\n"
+ "\n"
+ "\n"
+ "Thanks,\n"
+ "Zhichang\n"
+ "\n"
+ "> \n"
+ "> Thanks,\n"
+ "> Ming\n"
+ "> \n"
+ "> [1] 'make modules' failure log\n"
+ "> \n"
+ ">   Building modules, stage 2.\n"
+ ">   MODPOST 2260 modules\n"
+ "> ERROR: \"inb\" [drivers/watchdog/wdt_pci.ko] undefined!\n"
+ "> ERROR: \"outb\" [drivers/watchdog/wdt_pci.ko] undefined!\n"
+ "> ERROR: \"outb\" [drivers/watchdog/pcwd_pci.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/watchdog/pcwd_pci.ko] undefined!\n"
+ "> ERROR: \"outw\" [drivers/video/vgastate.ko] undefined!\n"
+ "> ERROR: \"outb\" [drivers/video/vgastate.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/video/vgastate.ko] undefined!\n"
+ "> ERROR: \"outw\" [drivers/video/fbdev/vt8623fb.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/video/fbdev/vt8623fb.ko] undefined!\n"
+ "> ERROR: \"outb\" [drivers/video/fbdev/vt8623fb.ko] undefined!\n"
+ "> ERROR: \"outw\" [drivers/video/fbdev/tridentfb.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/video/fbdev/tridentfb.ko] undefined!\n"
+ "> ERROR: \"outb\" [drivers/video/fbdev/tridentfb.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/video/fbdev/tdfxfb.ko] undefined!\n"
+ "> .....\n"
+ "> ERROR: \"inb\" [drivers/ata/pata_cmd64x.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/ata/pata_artop.ko] undefined!\n"
+ "> scripts/Makefile.modpost:91: recipe for target '__modpost' failed\n"
+ "> make[1]: *** [__modpost] Error 1\n"
+ "> Makefile:1196: recipe for target 'modules' failed\n"
+ "> make: *** [modules] Error 2\n"
+ "> \n"
+ "> \n"
+ ">>  create mode 100644 arch/arm64/include/asm/extio.h\n"
+ ">>  create mode 100644 arch/arm64/kernel/extio.c\n"
+ ">>\n"
+ ">> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig\n"
+ ">> index 969ef88..b44070b 100644\n"
+ ">> --- a/arch/arm64/Kconfig\n"
+ ">> +++ b/arch/arm64/Kconfig\n"
+ ">> @@ -163,6 +163,12 @@ config ARCH_MMAP_RND_COMPAT_BITS_MIN\n"
+ ">>  config ARCH_MMAP_RND_COMPAT_BITS_MAX\n"
+ ">>         default 16\n"
+ ">>\n"
+ ">> +config ARM64_INDIRECT_PIO\n"
+ ">> +       bool \"access peripherals with legacy I/O port\"\n"
+ ">> +       help\n"
+ ">> +         Support special accessors for ISA I/O devices. This is needed for\n"
+ ">> +         SoCs that do not support standard read/write for the ISA range.\n"
+ ">> +\n"
+ ">>  config NO_IOPORT_MAP\n"
+ ">>         def_bool y if !PCI\n"
+ ">>\n"
+ ">> diff --git a/arch/arm64/include/asm/extio.h b/arch/arm64/include/asm/extio.h\n"
+ ">> new file mode 100644\n"
+ ">> index 0000000..6ae0787\n"
+ ">> --- /dev/null\n"
+ ">> +++ b/arch/arm64/include/asm/extio.h\n"
+ ">> @@ -0,0 +1,94 @@\n"
+ ">> +/*\n"
+ ">> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved.\n"
+ ">> + * Author: Zhichang Yuan <yuanzhichang@hisilicon.com>\n"
+ ">> + *\n"
+ ">> + * This program is free software; you can redistribute it and/or modify\n"
+ ">> + * it under the terms of the GNU General Public License version 2 as\n"
+ ">> + * published by the Free Software Foundation.\n"
+ ">> + *\n"
+ ">> + * This program is distributed in the hope that it will be useful,\n"
+ ">> + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ ">> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+ ">> + * GNU General Public License for more details.\n"
+ ">> + *\n"
+ ">> + * You should have received a copy of the GNU General Public License\n"
+ ">> + * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
+ ">> + */\n"
+ ">> +\n"
+ ">> +#ifndef __LINUX_EXTIO_H\n"
+ ">> +#define __LINUX_EXTIO_H\n"
+ ">> +\n"
+ ">> +struct extio_ops {\n"
+ ">> +       unsigned long start;/* inclusive, sys io addr */\n"
+ ">> +       unsigned long end;/* inclusive, sys io addr */\n"
+ ">> +\n"
+ ">> +       u64 (*pfin)(void *devobj, unsigned long ptaddr, size_t dlen);\n"
+ ">> +       void (*pfout)(void *devobj, unsigned long ptaddr, u32 outval,\n"
+ ">> +                                       size_t dlen);\n"
+ ">> +       u64 (*pfins)(void *devobj, unsigned long ptaddr, void *inbuf,\n"
+ ">> +                               size_t dlen, unsigned int count);\n"
+ ">> +       void (*pfouts)(void *devobj, unsigned long ptaddr,\n"
+ ">> +                               const void *outbuf, size_t dlen,\n"
+ ">> +                               unsigned int count);\n"
+ ">> +       void *devpara;\n"
+ ">> +};\n"
+ ">> +\n"
+ ">> +extern struct extio_ops *arm64_extio_ops;\n"
+ ">> +\n"
+ ">> +#define DECLARE_EXTIO(bw, type)                                                \\\n"
+ ">> +extern type in##bw(unsigned long addr);                                        \\\n"
+ ">> +extern void out##bw(type value, unsigned long addr);                   \\\n"
+ ">> +extern void ins##bw(unsigned long addr, void *buffer, unsigned int count);\\\n"
+ ">> +extern void outs##bw(unsigned long addr, const void *buffer, unsigned int count);\n"
+ ">> +\n"
+ ">> +#define BUILD_EXTIO(bw, type)                                          \\\n"
+ ">> +type in##bw(unsigned long addr)                                                \\\n"
+ ">> +{                                                                      \\\n"
+ ">> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \\\n"
+ ">> +                       arm64_extio_ops->end < addr)                    \\\n"
+ ">> +               return read##bw(PCI_IOBASE + addr);                     \\\n"
+ ">> +       return arm64_extio_ops->pfin ?                                  \\\n"
+ ">> +               arm64_extio_ops->pfin(arm64_extio_ops->devpara,         \\\n"
+ ">> +                       addr, sizeof(type)) : -1;                       \\\n"
+ ">> +}                                                                      \\\n"
+ ">> +                                                                       \\\n"
+ ">> +void out##bw(type value, unsigned long addr)                           \\\n"
+ ">> +{                                                                      \\\n"
+ ">> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \\\n"
+ ">> +                       arm64_extio_ops->end < addr)                    \\\n"
+ ">> +               write##bw(value, PCI_IOBASE + addr);                    \\\n"
+ ">> +       else                                                            \\\n"
+ ">> +               if (arm64_extio_ops->pfout)                             \\\n"
+ ">> +                       arm64_extio_ops->pfout(arm64_extio_ops->devpara,\\\n"
+ ">> +                               addr, value, sizeof(type));             \\\n"
+ ">> +}                                                                      \\\n"
+ ">> +                                                                       \\\n"
+ ">> +void ins##bw(unsigned long addr, void *buffer, unsigned int count)     \\\n"
+ ">> +{                                                                      \\\n"
+ ">> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \\\n"
+ ">> +                       arm64_extio_ops->end < addr)                    \\\n"
+ ">> +               reads##bw(PCI_IOBASE + addr, buffer, count);            \\\n"
+ ">> +       else                                                            \\\n"
+ ">> +               if (arm64_extio_ops->pfins)                             \\\n"
+ ">> +                       arm64_extio_ops->pfins(arm64_extio_ops->devpara,\\\n"
+ ">> +                               addr, buffer, sizeof(type), count);     \\\n"
+ ">> +}                                                                      \\\n"
+ ">> +                                                                       \\\n"
+ ">> +void outs##bw(unsigned long addr, const void *buffer, unsigned int count)      \\\n"
+ ">> +{                                                                      \\\n"
+ ">> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \\\n"
+ ">> +                       arm64_extio_ops->end < addr)                    \\\n"
+ ">> +               writes##bw(PCI_IOBASE + addr, buffer, count);           \\\n"
+ ">> +       else                                                            \\\n"
+ ">> +               if (arm64_extio_ops->pfouts)                            \\\n"
+ ">> +                       arm64_extio_ops->pfouts(arm64_extio_ops->devpara,\\\n"
+ ">> +                               addr, buffer, sizeof(type), count);     \\\n"
+ ">> +}\n"
+ ">> +\n"
+ ">> +static inline void arm64_set_extops(struct extio_ops *ops)\n"
+ ">> +{\n"
+ ">> +       if (ops)\n"
+ ">> +               WRITE_ONCE(arm64_extio_ops, ops);\n"
+ ">> +}\n"
+ ">> +\n"
+ ">> +#endif /* __LINUX_EXTIO_H*/\n"
+ ">> diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h\n"
+ ">> index 0bba427..136735d 100644\n"
+ ">> --- a/arch/arm64/include/asm/io.h\n"
+ ">> +++ b/arch/arm64/include/asm/io.h\n"
+ ">> @@ -31,6 +31,7 @@\n"
+ ">>  #include <asm/early_ioremap.h>\n"
+ ">>  #include <asm/alternative.h>\n"
+ ">>  #include <asm/cpufeature.h>\n"
+ ">> +#include <asm/extio.h>\n"
+ ">>\n"
+ ">>  #include <xen/xen.h>\n"
+ ">>\n"
+ ">> @@ -149,6 +150,34 @@ static inline u64 __raw_readq(const volatile void __iomem *addr)\n"
+ ">>  #define IO_SPACE_LIMIT         (PCI_IO_SIZE - 1)\n"
+ ">>  #define PCI_IOBASE             ((void __iomem *)PCI_IO_START)\n"
+ ">>\n"
+ ">> +\n"
+ ">> +/*\n"
+ ">> + * redefine the in(s)b/out(s)b for indirect-IO.\n"
+ ">> + */\n"
+ ">> +#ifdef CONFIG_ARM64_INDIRECT_PIO\n"
+ ">> +#define inb inb\n"
+ ">> +#define outb outb\n"
+ ">> +#define insb insb\n"
+ ">> +#define outsb outsb\n"
+ ">> +/* external declaration */\n"
+ ">> +DECLARE_EXTIO(b, u8)\n"
+ ">> +\n"
+ ">> +#define inw inw\n"
+ ">> +#define outw outw\n"
+ ">> +#define insw insw\n"
+ ">> +#define outsw outsw\n"
+ ">> +\n"
+ ">> +DECLARE_EXTIO(w, u16)\n"
+ ">> +\n"
+ ">> +#define inl inl\n"
+ ">> +#define outl outl\n"
+ ">> +#define insl insl\n"
+ ">> +#define outsl outsl\n"
+ ">> +\n"
+ ">> +DECLARE_EXTIO(l, u32)\n"
+ ">> +#endif\n"
+ ">> +\n"
+ ">> +\n"
+ ">>  /*\n"
+ ">>   * String version of I/O memory access operations.\n"
+ ">>   */\n"
+ ">> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile\n"
+ ">> index 7d66bba..60e0482 100644\n"
+ ">> --- a/arch/arm64/kernel/Makefile\n"
+ ">> +++ b/arch/arm64/kernel/Makefile\n"
+ ">> @@ -31,6 +31,7 @@ arm64-obj-$(CONFIG_COMPAT)            += sys32.o kuser32.o signal32.o         \\\n"
+ ">>                                            sys_compat.o entry32.o\n"
+ ">>  arm64-obj-$(CONFIG_FUNCTION_TRACER)    += ftrace.o entry-ftrace.o\n"
+ ">>  arm64-obj-$(CONFIG_MODULES)            += arm64ksyms.o module.o\n"
+ ">> +arm64-obj-$(CONFIG_ARM64_INDIRECT_PIO) += extio.o\n"
+ ">>  arm64-obj-$(CONFIG_ARM64_MODULE_PLTS)  += module-plts.o\n"
+ ">>  arm64-obj-$(CONFIG_PERF_EVENTS)                += perf_regs.o perf_callchain.o\n"
+ ">>  arm64-obj-$(CONFIG_HW_PERF_EVENTS)     += perf_event.o\n"
+ ">> diff --git a/arch/arm64/kernel/extio.c b/arch/arm64/kernel/extio.c\n"
+ ">> new file mode 100644\n"
+ ">> index 0000000..647b3fa\n"
+ ">> --- /dev/null\n"
+ ">> +++ b/arch/arm64/kernel/extio.c\n"
+ ">> @@ -0,0 +1,27 @@\n"
+ ">> +/*\n"
+ ">> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved.\n"
+ ">> + * Author: Zhichang Yuan <yuanzhichang@hisilicon.com>\n"
+ ">> + *\n"
+ ">> + * This program is free software; you can redistribute it and/or modify\n"
+ ">> + * it under the terms of the GNU General Public License version 2 as\n"
+ ">> + * published by the Free Software Foundation.\n"
+ ">> + *\n"
+ ">> + * This program is distributed in the hope that it will be useful,\n"
+ ">> + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ ">> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+ ">> + * GNU General Public License for more details.\n"
+ ">> + *\n"
+ ">> + * You should have received a copy of the GNU General Public License\n"
+ ">> + * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
+ ">> + */\n"
+ ">> +\n"
+ ">> +#include <linux/io.h>\n"
+ ">> +\n"
+ ">> +struct extio_ops *arm64_extio_ops;\n"
+ ">> +\n"
+ ">> +\n"
+ ">> +BUILD_EXTIO(b, u8)\n"
+ ">> +\n"
+ ">> +BUILD_EXTIO(w, u16)\n"
+ ">> +\n"
+ ">> +BUILD_EXTIO(l, u32)\n"
+ ">> --\n"
+ ">> 1.9.1\n"
+ ">>\n"
+ "> \n"
+ "> \n"
+ >
 
-fed89004616937ba8e0d068d584ec9df670c49b178295e735c345268124d4f79
+02e630af100779d33de4c4c7be778619721659d0383576fa937ee735a19ec485

diff --git a/a/1.txt b/N2/1.txt
index ecab391..7d5a80e 100644
--- a/a/1.txt
+++ b/N2/1.txt
@@ -1,228 +1,300 @@
-SGnvvIxNaW5nLAoKCk9uIDIwMTYvMTIvMjIgMTY6MTUsIE1pbmcgTGVpIHdyb3RlOgo+IEhpIEd1
-eXMsCj4gCj4gT24gVHVlLCBOb3YgOCwgMjAxNiBhdCAxMTo0NyBBTSwgemhpY2hhbmcueXVhbgo+
-IDx5dWFuemhpY2hhbmdAaGlzaWxpY29uLmNvbT4gd3JvdGU6Cj4+IEZvciBhcm02NCwgdGhlcmUg
-aXMgbm8gSS9PIHNwYWNlIGFzIG90aGVyIGFyY2hpdGVjdHVyYWwgcGxhdGZvcm1zLCBzdWNoIGFz
-Cj4+IFg4Ni4gTW9zdCBJL08gYWNjZXNzZXMgYXJlIGFjaGlldmVkIGJhc2VkIG9uIE1NSU8uIEJ1
-dCBmb3Igc29tZSBhcm02NCBTb0NzLAo+PiBzdWNoIGFzIEhpcDA2LCB3aGVuIGFjY2Vzc2luZyBz
-b21lIGxlZ2FjeSBJU0EgZGV2aWNlcyBjb25uZWN0ZWQgdG8gTFBDLCB0aG9zZQo+PiBrbm93biBw
-b3J0IGFkZHJlc3NlcyBhcmUgdXNlZCB0byBjb250cm9sIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdl
-dCBkZXZpY2VzLCBmb3IKPj4gZXhhbXBsZSwgMHgyZjggaXMgZm9yIFVBUlQsIDB4ZTQgaXMgZm9y
-IGlwbWktYnQuIEl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZQo+PiBub3JtYWwgTU1JTyBtb2RlIGlu
-IHVzaW5nLgo+Pgo+PiBUbyBkcml2ZSB0aGVzZSBkZXZpY2VzLCB0aGlzIHBhdGNoIGludHJvZHVj
-ZXMgYSBtZXRob2QgbmFtZWQgaW5kaXJlY3QtSU8uCj4+IEluIHRoaXMgbWV0aG9kIHRoZSBpbi9v
-dXQgcGFpciBpbiBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lvLmggd2lsbCBiZQo+PiByZWRlZmlu
-ZWQuIFdoZW4gdXBwZXIgbGF5ZXIgZHJpdmVycyBjYWxsIGluL291dCB3aXRoIHRob3NlIGtub3du
-IGxlZ2FjeSBwb3J0Cj4+IGFkZHJlc3NlcyB0byBhY2Nlc3MgdGhlIHBlcmlwaGVyYWxzLCB0aGUg
-aG9va2luZyBmdW5jdGlvbnMgY29ycnJlc3BvbmRpbmcgdG8KPj4gdGhvc2UgdGFyZ2V0IHBlcmlw
-aGVyYWxzIHdpbGwgYmUgY2FsbGVkLiBUaHJvdWdoIHRoaXMgd2F5LCB0aG9zZSB1cHBlciBsYXll
-cgo+PiBkcml2ZXJzIHdoaWNoIGRlcGVuZCBvbiBpbi9vdXQgY2FuIHJ1biBvbiBIaXAwNiB3aXRo
-b3V0IGFueSBjaGFuZ2VzLgo+Pgo+PiBDYzogQ2F0YWxpbiBNYXJpbmFzIDxjYXRhbGluLm1hcmlu
-YXNAYXJtLmNvbT4KPj4gQ2M6IFdpbGwgRGVhY29uIDx3aWxsLmRlYWNvbkBhcm0uY29tPgo+PiBT
-aWduZWQtb2ZmLWJ5OiB6aGljaGFuZy55dWFuIDx5dWFuemhpY2hhbmdAaGlzaWxpY29uLmNvbT4K
-Pj4gU2lnbmVkLW9mZi1ieTogR2FicmllbGUgUGFvbG9uaSA8Z2FicmllbGUucGFvbG9uaUBodWF3
-ZWkuY29tPgo+PiAtLS0KPj4gIGFyY2gvYXJtNjQvS2NvbmZpZyAgICAgICAgICAgICB8ICA2ICsr
-Kwo+PiAgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9leHRpby5oIHwgOTQgKysrKysrKysrKysrKysr
-KysrKysrKysrKysrKysrKysrKysrKysrKysrCj4+ICBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lv
-LmggICAgfCAyOSArKysrKysrKysrKysrCj4+ICBhcmNoL2FybTY0L2tlcm5lbC9NYWtlZmlsZSAg
-ICAgfCAgMSArCj4+ICBhcmNoL2FybTY0L2tlcm5lbC9leHRpby5jICAgICAgfCAyNyArKysrKysr
-KysrKysKPj4gIDUgZmlsZXMgY2hhbmdlZCwgMTU3IGluc2VydGlvbnMoKykKPiAKPiBXaGVuIEkg
-YXBwbGllZCB0aGVzZSB0aHJlZSBwYXRjaGVzIGFnYWluc3QgY3VycmVudCBsaW51cyB0cmVlIGFu
-ZAo+IGVuYWJsZSBDT05GSUdfSElTSUxJQ09OX0xQQywgdGhlIGZvbGxvd2luZyBidWlsZCBmYWls
-dXJlWzFdIGlzCj4gdHJpZ2dlcmVkIHdoZW4gcnVubmluZyAnbWFrZSBtb2R1bGVzJy4KPiAKClRo
-YW5rcyBmb3IgeW91ciByZXBvcnQhCgpUaGlzIHBhdGNoIGhhcyBjb21waWxhdGlvbiBpc3N1ZSBv
-biBzb21lIGFyY2hpdGVjdHVyZXMsIHNvcnJ5IGZvciB0aGUgaW5jb252ZW5pZW5jZSBjYXVzZWQg
-YnkgdGhpcyEKVGhlIG9uZ29pbmcgdjYgd2lsbCBzb2x2ZSB0aGVzZSBpc3N1ZXMuCkkgd2lsbCB0
-cmFjZSB0aGlzIGZhaWx1cmUgYW5kIHByb3ZpZGUgYSBmaXggaWYgeW91IGNhbiBub3Qgd2FpdCBm
-b3IgdGhlIG5leHQgdmVyc2lvbi4KCkNvdWxkIHlvdSBzZW5kIG1lIHlvdXIgLmNvbmZpZyBpbiBw
-cml2YXRlPyBJIGRvbid0IHdhbnQgdG8gYm90aGVyIGFsbCB0aGUgaGFja2VyIGluIHRoZSBtYWls
-LWxpc3QuCgoKVGhhbmtzLApaaGljaGFuZwoKPiAKPiBUaGFua3MsCj4gTWluZwo+IAo+IFsxXSAn
-bWFrZSBtb2R1bGVzJyBmYWlsdXJlIGxvZwo+IAo+ICAgQnVpbGRpbmcgbW9kdWxlcywgc3RhZ2Ug
-Mi4KPiAgIE1PRFBPU1QgMjI2MCBtb2R1bGVzCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3dhdGNo
-ZG9nL3dkdF9wY2kua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dGIiIFtkcml2ZXJzL3dhdGNo
-ZG9nL3dkdF9wY2kua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dGIiIFtkcml2ZXJzL3dhdGNo
-ZG9nL3Bjd2RfcGNpLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3dhdGNo
-ZG9nL3Bjd2RfcGNpLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJvdXR3IiBbZHJpdmVycy92aWRl
-by92Z2FzdGF0ZS5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0YiIgW2RyaXZlcnMvdmlkZW8v
-dmdhc3RhdGUua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogImluYiIgW2RyaXZlcnMvdmlkZW8vdmdh
-c3RhdGUua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dHciIFtkcml2ZXJzL3ZpZGVvL2ZiZGV2
-L3Z0ODYyM2ZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3ZpZGVvL2Zi
-ZGV2L3Z0ODYyM2ZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJvdXRiIiBbZHJpdmVycy92aWRl
-by9mYmRldi92dDg2MjNmYi5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0dyIgW2RyaXZlcnMv
-dmlkZW8vZmJkZXYvdHJpZGVudGZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2
-ZXJzL3ZpZGVvL2ZiZGV2L3RyaWRlbnRmYi5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0YiIg
-W2RyaXZlcnMvdmlkZW8vZmJkZXYvdHJpZGVudGZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJp
-bmIiIFtkcml2ZXJzL3ZpZGVvL2ZiZGV2L3RkZnhmYi5rb10gdW5kZWZpbmVkIQo+IC4uLi4uCj4g
-RVJST1I6ICJpbmIiIFtkcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5rb10gdW5kZWZpbmVkIQo+IEVS
-Uk9SOiAiaW5iIiBbZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5rb10gdW5kZWZpbmVkIQo+IHNjcmlw
-dHMvTWFrZWZpbGUubW9kcG9zdDo5MTogcmVjaXBlIGZvciB0YXJnZXQgJ19fbW9kcG9zdCcgZmFp
-bGVkCj4gbWFrZVsxXTogKioqIFtfX21vZHBvc3RdIEVycm9yIDEKPiBNYWtlZmlsZToxMTk2OiBy
-ZWNpcGUgZm9yIHRhcmdldCAnbW9kdWxlcycgZmFpbGVkCj4gbWFrZTogKioqIFttb2R1bGVzXSBF
-cnJvciAyCj4gCj4gCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9pbmNsdWRlL2Fz
-bS9leHRpby5oCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8u
-Ywo+Pgo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29u
-ZmlnCj4+IGluZGV4IDk2OWVmODguLmI0NDA3MGIgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQv
-S2NvbmZpZwo+PiArKysgYi9hcmNoL2FybTY0L0tjb25maWcKPj4gQEAgLTE2Myw2ICsxNjMsMTIg
-QEAgY29uZmlnIEFSQ0hfTU1BUF9STkRfQ09NUEFUX0JJVFNfTUlOCj4+ICBjb25maWcgQVJDSF9N
-TUFQX1JORF9DT01QQVRfQklUU19NQVgKPj4gICAgICAgICBkZWZhdWx0IDE2Cj4+Cj4+ICtjb25m
-aWcgQVJNNjRfSU5ESVJFQ1RfUElPCj4+ICsgICAgICAgYm9vbCAiYWNjZXNzIHBlcmlwaGVyYWxz
-IHdpdGggbGVnYWN5IEkvTyBwb3J0Igo+PiArICAgICAgIGhlbHAKPj4gKyAgICAgICAgIFN1cHBv
-cnQgc3BlY2lhbCBhY2Nlc3NvcnMgZm9yIElTQSBJL08gZGV2aWNlcy4gVGhpcyBpcyBuZWVkZWQg
-Zm9yCj4+ICsgICAgICAgICBTb0NzIHRoYXQgZG8gbm90IHN1cHBvcnQgc3RhbmRhcmQgcmVhZC93
-cml0ZSBmb3IgdGhlIElTQSByYW5nZS4KPj4gKwo+PiAgY29uZmlnIE5PX0lPUE9SVF9NQVAKPj4g
-ICAgICAgICBkZWZfYm9vbCB5IGlmICFQQ0kKPj4KPj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQv
-aW5jbHVkZS9hc20vZXh0aW8uaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXh0aW8uaAo+PiBu
-ZXcgZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi42YWUwNzg3Cj4+IC0tLSAvZGV2
-L251bGwKPj4gKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9leHRpby5oCj4+IEBAIC0wLDAg
-KzEsOTQgQEAKPj4gKy8qCj4+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSGlzaWxpY29uIExpbWl0
-ZWQsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCj4+ICsgKiBBdXRob3I6IFpoaWNoYW5nIFl1YW4gPHl1
-YW56aGljaGFuZ0BoaXNpbGljb24uY29tPgo+PiArICoKPj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBm
-cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4+ICsg
-KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZl
-cnNpb24gMiBhcwo+PiArICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
-b24uCj4+ICsgKgo+PiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
-IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
-IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+PiArICogTUVSQ0hBTlRBQklM
-SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+PiArICog
-R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KPj4gKyAqCj4+ICsg
-KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs
-aWMgTGljZW5zZQo+PiArICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8
-aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCj4+ICsgKi8KPj4gKwo+PiArI2lmbmRlZiBf
-X0xJTlVYX0VYVElPX0gKPj4gKyNkZWZpbmUgX19MSU5VWF9FWFRJT19ICj4+ICsKPj4gK3N0cnVj
-dCBleHRpb19vcHMgewo+PiArICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQ7LyogaW5jbHVzaXZl
-LCBzeXMgaW8gYWRkciAqLwo+PiArICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kOy8qIGluY2x1c2l2
-ZSwgc3lzIGlvIGFkZHIgKi8KPj4gKwo+PiArICAgICAgIHU2NCAoKnBmaW4pKHZvaWQgKmRldm9i
-aiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsIHNpemVfdCBkbGVuKTsKPj4gKyAgICAgICB2b2lkICgq
-cGZvdXQpKHZvaWQgKmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsIHUzMiBvdXR2YWwsCj4+
-ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGxlbik7Cj4+
-ICsgICAgICAgdTY0ICgqcGZpbnMpKHZvaWQgKmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIs
-IHZvaWQgKmluYnVmLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBk
-bGVuLCB1bnNpZ25lZCBpbnQgY291bnQpOwo+PiArICAgICAgIHZvaWQgKCpwZm91dHMpKHZvaWQg
-KmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsCj4+ICsgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgY29uc3Qgdm9pZCAqb3V0YnVmLCBzaXplX3QgZGxlbiwKPj4gKyAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQpOwo+PiArICAgICAgIHZvaWQg
-KmRldnBhcmE7Cj4+ICt9Owo+PiArCj4+ICtleHRlcm4gc3RydWN0IGV4dGlvX29wcyAqYXJtNjRf
-ZXh0aW9fb3BzOwo+PiArCj4+ICsjZGVmaW5lIERFQ0xBUkVfRVhUSU8oYncsIHR5cGUpICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArZXh0ZXJuIHR5
-cGUgaW4jI2J3KHVuc2lnbmVkIGxvbmcgYWRkcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgIFwKPj4gK2V4dGVybiB2b2lkIG91dCMjYncodHlwZSB2YWx1ZSwgdW5zaWdu
-ZWQgbG9uZyBhZGRyKTsgICAgICAgICAgICAgICAgICAgXAo+PiArZXh0ZXJuIHZvaWQgaW5zIyNi
-dyh1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KTtc
-Cj4+ICtleHRlcm4gdm9pZCBvdXRzIyNidyh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQg
-KmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KTsKPj4gKwo+PiArI2RlZmluZSBCVUlMRF9FWFRJ
-TyhidywgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+
-ICt0eXBlIGluIyNidyh1bnNpZ25lZCBsb25nIGFkZHIpICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAreyAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+ICsgICAgICAg
-aWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9fb3BzLT5zdGFydCA+IGFkZHIgfHwg
-ICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgYXJtNjRfZXh0aW9fb3BzLT5lbmQg
-PCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAgICAgICAgICAgICAgcmV0dXJuIHJl
-YWQjI2J3KFBDSV9JT0JBU0UgKyBhZGRyKTsgICAgICAgICAgICAgICAgICAgICBcCj4+ICsgICAg
-ICAgcmV0dXJuIGFybTY0X2V4dGlvX29wcy0+cGZpbiA/ICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGFybTY0X2V4dGlvX29wcy0+cGZpbihhcm02
-NF9leHRpb19vcHMtPmRldnBhcmEsICAgICAgICAgXAo+PiArICAgICAgICAgICAgICAgICAgICAg
-ICBhZGRyLCBzaXplb2YodHlwZSkpIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICBcCj4+ICt9
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArdm9pZCBvdXQjI2J3KHR5cGUg
-dmFsdWUsIHVuc2lnbmVkIGxvbmcgYWRkcikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+
-ICt7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICBpZiAoIWFybTY0X2V4dGlvX29wcyB8fCBhcm02
-NF9leHRpb19vcHMtPnN0YXJ0ID4gYWRkciB8fCAgICAgICAgXAo+PiArICAgICAgICAgICAgICAg
-ICAgICAgICBhcm02NF9leHRpb19vcHMtPmVuZCA8IGFkZHIpICAgICAgICAgICAgICAgICAgICBc
-Cj4+ICsgICAgICAgICAgICAgICB3cml0ZSMjYncodmFsdWUsIFBDSV9JT0JBU0UgKyBhZGRyKTsg
-ICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArICAgICAgICAgICAg
-ICAgaWYgKGFybTY0X2V4dGlvX29wcy0+cGZvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICBcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgIGFybTY0X2V4dGlvX29wcy0+cGZvdXQoYXJt
-NjRfZXh0aW9fb3BzLT5kZXZwYXJhLFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICBhZGRyLCB2YWx1ZSwgc2l6ZW9mKHR5cGUpKTsgICAgICAgICAgICAgXAo+PiArfSAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICBcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gK3ZvaWQgaW5zIyNidyh1bnNpZ25lZCBsb25n
-IGFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KSAgICAgXAo+PiAreyAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICBcCj4+ICsgICAgICAgaWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9f
-b3BzLT5zdGFydCA+IGFkZHIgfHwgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg
-YXJtNjRfZXh0aW9fb3BzLT5lbmQgPCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAg
-ICAgICAgICAgICAgcmVhZHMjI2J3KFBDSV9JT0JBU0UgKyBhZGRyLCBidWZmZXIsIGNvdW50KTsg
-ICAgICAgICAgICBcCj4+ICsgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGlmIChh
-cm02NF9leHRpb19vcHMtPnBmaW5zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAr
-ICAgICAgICAgICAgICAgICAgICAgICBhcm02NF9leHRpb19vcHMtPnBmaW5zKGFybTY0X2V4dGlv
-X29wcy0+ZGV2cGFyYSxcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciwg
-YnVmZmVyLCBzaXplb2YodHlwZSksIGNvdW50KTsgICAgIFwKPj4gK30gICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+
-PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICBcCj4+ICt2b2lkIG91dHMjI2J3KHVuc2lnbmVkIGxvbmcgYWRkciwg
-Y29uc3Qgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgY291bnQpICAgICAgXAo+PiAreyAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICBcCj4+ICsgICAgICAgaWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9f
-b3BzLT5zdGFydCA+IGFkZHIgfHwgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg
-YXJtNjRfZXh0aW9fb3BzLT5lbmQgPCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAg
-ICAgICAgICAgICAgd3JpdGVzIyNidyhQQ0lfSU9CQVNFICsgYWRkciwgYnVmZmVyLCBjb3VudCk7
-ICAgICAgICAgICBcCj4+ICsgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGlmIChh
-cm02NF9leHRpb19vcHMtPnBmb3V0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAr
-ICAgICAgICAgICAgICAgICAgICAgICBhcm02NF9leHRpb19vcHMtPnBmb3V0cyhhcm02NF9leHRp
-b19vcHMtPmRldnBhcmEsXAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIs
-IGJ1ZmZlciwgc2l6ZW9mKHR5cGUpLCBjb3VudCk7ICAgICBcCj4+ICt9Cj4+ICsKPj4gK3N0YXRp
-YyBpbmxpbmUgdm9pZCBhcm02NF9zZXRfZXh0b3BzKHN0cnVjdCBleHRpb19vcHMgKm9wcykKPj4g
-K3sKPj4gKyAgICAgICBpZiAob3BzKQo+PiArICAgICAgICAgICAgICAgV1JJVEVfT05DRShhcm02
-NF9leHRpb19vcHMsIG9wcyk7Cj4+ICt9Cj4+ICsKPj4gKyNlbmRpZiAvKiBfX0xJTlVYX0VYVElP
-X0gqLwo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9h
-cm02NC9pbmNsdWRlL2FzbS9pby5oCj4+IGluZGV4IDBiYmE0MjcuLjEzNjczNWQgMTAwNjQ0Cj4+
-IC0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW8uaAo+PiArKysgYi9hcmNoL2FybTY0L2lu
-Y2x1ZGUvYXNtL2lvLmgKPj4gQEAgLTMxLDYgKzMxLDcgQEAKPj4gICNpbmNsdWRlIDxhc20vZWFy
-bHlfaW9yZW1hcC5oPgo+PiAgI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS5oPgo+PiAgI2luY2x1
-ZGUgPGFzbS9jcHVmZWF0dXJlLmg+Cj4+ICsjaW5jbHVkZSA8YXNtL2V4dGlvLmg+Cj4+Cj4+ICAj
-aW5jbHVkZSA8eGVuL3hlbi5oPgo+Pgo+PiBAQCAtMTQ5LDYgKzE1MCwzNCBAQCBzdGF0aWMgaW5s
-aW5lIHU2NCBfX3Jhd19yZWFkcShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCj4+
-ICAjZGVmaW5lIElPX1NQQUNFX0xJTUlUICAgICAgICAgKFBDSV9JT19TSVpFIC0gMSkKPj4gICNk
-ZWZpbmUgUENJX0lPQkFTRSAgICAgICAgICAgICAoKHZvaWQgX19pb21lbSAqKVBDSV9JT19TVEFS
-VCkKPj4KPj4gKwo+PiArLyoKPj4gKyAqIHJlZGVmaW5lIHRoZSBpbihzKWIvb3V0KHMpYiBmb3Ig
-aW5kaXJlY3QtSU8uCj4+ICsgKi8KPj4gKyNpZmRlZiBDT05GSUdfQVJNNjRfSU5ESVJFQ1RfUElP
-Cj4+ICsjZGVmaW5lIGluYiBpbmIKPj4gKyNkZWZpbmUgb3V0YiBvdXRiCj4+ICsjZGVmaW5lIGlu
-c2IgaW5zYgo+PiArI2RlZmluZSBvdXRzYiBvdXRzYgo+PiArLyogZXh0ZXJuYWwgZGVjbGFyYXRp
-b24gKi8KPj4gK0RFQ0xBUkVfRVhUSU8oYiwgdTgpCj4+ICsKPj4gKyNkZWZpbmUgaW53IGludwo+
-PiArI2RlZmluZSBvdXR3IG91dHcKPj4gKyNkZWZpbmUgaW5zdyBpbnN3Cj4+ICsjZGVmaW5lIG91
-dHN3IG91dHN3Cj4+ICsKPj4gK0RFQ0xBUkVfRVhUSU8odywgdTE2KQo+PiArCj4+ICsjZGVmaW5l
-IGlubCBpbmwKPj4gKyNkZWZpbmUgb3V0bCBvdXRsCj4+ICsjZGVmaW5lIGluc2wgaW5zbAo+PiAr
-I2RlZmluZSBvdXRzbCBvdXRzbAo+PiArCj4+ICtERUNMQVJFX0VYVElPKGwsIHUzMikKPj4gKyNl
-bmRpZgo+PiArCj4+ICsKPj4gIC8qCj4+ICAgKiBTdHJpbmcgdmVyc2lvbiBvZiBJL08gbWVtb3J5
-IGFjY2VzcyBvcGVyYXRpb25zLgo+PiAgICovCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tl
-cm5lbC9NYWtlZmlsZSBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+IGluZGV4IDdkNjZi
-YmEuLjYwZTA0ODIgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+
-ICsrKyBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+IEBAIC0zMSw2ICszMSw3IEBAIGFy
-bTY0LW9iai0kKENPTkZJR19DT01QQVQpICAgICAgICAgICAgKz0gc3lzMzIubyBrdXNlcjMyLm8g
-c2lnbmFsMzIubyAgICAgICAgIFwKPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgIHN5c19jb21wYXQubyBlbnRyeTMyLm8KPj4gIGFybTY0LW9iai0kKENPTkZJR19G
-VU5DVElPTl9UUkFDRVIpICAgICs9IGZ0cmFjZS5vIGVudHJ5LWZ0cmFjZS5vCj4+ICBhcm02NC1v
-YmotJChDT05GSUdfTU9EVUxFUykgICAgICAgICAgICArPSBhcm02NGtzeW1zLm8gbW9kdWxlLm8K
-Pj4gK2FybTY0LW9iai0kKENPTkZJR19BUk02NF9JTkRJUkVDVF9QSU8pICs9IGV4dGlvLm8KPj4g
-IGFybTY0LW9iai0kKENPTkZJR19BUk02NF9NT0RVTEVfUExUUykgICs9IG1vZHVsZS1wbHRzLm8K
-Pj4gIGFybTY0LW9iai0kKENPTkZJR19QRVJGX0VWRU5UUykgICAgICAgICAgICAgICAgKz0gcGVy
-Zl9yZWdzLm8gcGVyZl9jYWxsY2hhaW4ubwo+PiAgYXJtNjQtb2JqLSQoQ09ORklHX0hXX1BFUkZf
-RVZFTlRTKSAgICAgKz0gcGVyZl9ldmVudC5vCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tl
-cm5lbC9leHRpby5jIGIvYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8uYwo+PiBuZXcgZmlsZSBtb2Rl
-IDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi42NDdiM2ZhCj4+IC0tLSAvZGV2L251bGwKPj4gKysr
-IGIvYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8uYwo+PiBAQCAtMCwwICsxLDI3IEBACj4+ICsvKgo+
-PiArICogQ29weXJpZ2h0IChDKSAyMDE2IEhpc2lsaWNvbiBMaW1pdGVkLCBBbGwgUmlnaHRzIFJl
-c2VydmVkLgo+PiArICogQXV0aG9yOiBaaGljaGFuZyBZdWFuIDx5dWFuemhpY2hhbmdAaGlzaWxp
-Y29uLmNvbT4KPj4gKyAqCj4+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91
-IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+PiArICogaXQgdW5kZXIgdGhlIHRl
-cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKPj4gKyAq
-IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+PiArICoKPj4gKyAq
-IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
-dXNlZnVsLAo+PiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
-IGltcGxpZWQgd2FycmFudHkgb2YKPj4gKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
-UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKPj4gKyAqIEdOVSBHZW5lcmFsIFB1Ymxp
-YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4+ICsgKgo+PiArICogWW91IHNob3VsZCBoYXZl
-IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKPj4gKyAq
-IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9y
-Zy9saWNlbnNlcy8+Lgo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRlIDxsaW51eC9pby5oPgo+PiAr
-Cj4+ICtzdHJ1Y3QgZXh0aW9fb3BzICphcm02NF9leHRpb19vcHM7Cj4+ICsKPj4gKwo+PiArQlVJ
-TERfRVhUSU8oYiwgdTgpCj4+ICsKPj4gK0JVSUxEX0VYVElPKHcsIHUxNikKPj4gKwo+PiArQlVJ
-TERfRVhUSU8obCwgdTMyKQo+PiAtLQo+PiAxLjkuMQo+Pgo+IAo+IAo+IAoKCl9fX19fX19fX19f
-X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFp
-bGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlz
-dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK
+Hi?Ming,
+
+
+On 2016/12/22 16:15, Ming Lei wrote:
+> Hi Guys,
+> 
+> On Tue, Nov 8, 2016 at 11:47 AM, zhichang.yuan
+> <yuanzhichang@hisilicon.com> wrote:
+>> For arm64, there is no I/O space as other architectural platforms, such as
+>> X86. Most I/O accesses are achieved based on MMIO. But for some arm64 SoCs,
+>> such as Hip06, when accessing some legacy ISA devices connected to LPC, those
+>> known port addresses are used to control the corresponding target devices, for
+>> example, 0x2f8 is for UART, 0xe4 is for ipmi-bt. It is different from the
+>> normal MMIO mode in using.
+>>
+>> To drive these devices, this patch introduces a method named indirect-IO.
+>> In this method the in/out pair in arch/arm64/include/asm/io.h will be
+>> redefined. When upper layer drivers call in/out with those known legacy port
+>> addresses to access the peripherals, the hooking functions corrresponding to
+>> those target peripherals will be called. Through this way, those upper layer
+>> drivers which depend on in/out can run on Hip06 without any changes.
+>>
+>> Cc: Catalin Marinas <catalin.marinas@arm.com>
+>> Cc: Will Deacon <will.deacon@arm.com>
+>> Signed-off-by: zhichang.yuan <yuanzhichang@hisilicon.com>
+>> Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>
+>> ---
+>>  arch/arm64/Kconfig             |  6 +++
+>>  arch/arm64/include/asm/extio.h | 94 ++++++++++++++++++++++++++++++++++++++++++
+>>  arch/arm64/include/asm/io.h    | 29 +++++++++++++
+>>  arch/arm64/kernel/Makefile     |  1 +
+>>  arch/arm64/kernel/extio.c      | 27 ++++++++++++
+>>  5 files changed, 157 insertions(+)
+> 
+> When I applied these three patches against current linus tree and
+> enable CONFIG_HISILICON_LPC, the following build failure[1] is
+> triggered when running 'make modules'.
+> 
+
+Thanks for your report!
+
+This patch has compilation issue on some architectures, sorry for the inconvenience caused by this!
+The ongoing v6 will solve these issues.
+I will trace this failure and provide a fix if you can not wait for the next version.
+
+Could you send me your .config in private? I don't want to bother all the hacker in the mail-list.
+
+
+Thanks,
+Zhichang
+
+> 
+> Thanks,
+> Ming
+> 
+> [1] 'make modules' failure log
+> 
+>   Building modules, stage 2.
+>   MODPOST 2260 modules
+> ERROR: "inb" [drivers/watchdog/wdt_pci.ko] undefined!
+> ERROR: "outb" [drivers/watchdog/wdt_pci.ko] undefined!
+> ERROR: "outb" [drivers/watchdog/pcwd_pci.ko] undefined!
+> ERROR: "inb" [drivers/watchdog/pcwd_pci.ko] undefined!
+> ERROR: "outw" [drivers/video/vgastate.ko] undefined!
+> ERROR: "outb" [drivers/video/vgastate.ko] undefined!
+> ERROR: "inb" [drivers/video/vgastate.ko] undefined!
+> ERROR: "outw" [drivers/video/fbdev/vt8623fb.ko] undefined!
+> ERROR: "inb" [drivers/video/fbdev/vt8623fb.ko] undefined!
+> ERROR: "outb" [drivers/video/fbdev/vt8623fb.ko] undefined!
+> ERROR: "outw" [drivers/video/fbdev/tridentfb.ko] undefined!
+> ERROR: "inb" [drivers/video/fbdev/tridentfb.ko] undefined!
+> ERROR: "outb" [drivers/video/fbdev/tridentfb.ko] undefined!
+> ERROR: "inb" [drivers/video/fbdev/tdfxfb.ko] undefined!
+> .....
+> ERROR: "inb" [drivers/ata/pata_cmd64x.ko] undefined!
+> ERROR: "inb" [drivers/ata/pata_artop.ko] undefined!
+> scripts/Makefile.modpost:91: recipe for target '__modpost' failed
+> make[1]: *** [__modpost] Error 1
+> Makefile:1196: recipe for target 'modules' failed
+> make: *** [modules] Error 2
+> 
+> 
+>>  create mode 100644 arch/arm64/include/asm/extio.h
+>>  create mode 100644 arch/arm64/kernel/extio.c
+>>
+>> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
+>> index 969ef88..b44070b 100644
+>> --- a/arch/arm64/Kconfig
+>> +++ b/arch/arm64/Kconfig
+>> @@ -163,6 +163,12 @@ config ARCH_MMAP_RND_COMPAT_BITS_MIN
+>>  config ARCH_MMAP_RND_COMPAT_BITS_MAX
+>>         default 16
+>>
+>> +config ARM64_INDIRECT_PIO
+>> +       bool "access peripherals with legacy I/O port"
+>> +       help
+>> +         Support special accessors for ISA I/O devices. This is needed for
+>> +         SoCs that do not support standard read/write for the ISA range.
+>> +
+>>  config NO_IOPORT_MAP
+>>         def_bool y if !PCI
+>>
+>> diff --git a/arch/arm64/include/asm/extio.h b/arch/arm64/include/asm/extio.h
+>> new file mode 100644
+>> index 0000000..6ae0787
+>> --- /dev/null
+>> +++ b/arch/arm64/include/asm/extio.h
+>> @@ -0,0 +1,94 @@
+>> +/*
+>> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved.
+>> + * Author: Zhichang Yuan <yuanzhichang@hisilicon.com>
+>> + *
+>> + * This program is free software; you can redistribute it and/or modify
+>> + * it under the terms of the GNU General Public License version 2 as
+>> + * published by the Free Software Foundation.
+>> + *
+>> + * 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.
+>> + *
+>> + * You should have received a copy of the GNU General Public License
+>> + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+>> + */
+>> +
+>> +#ifndef __LINUX_EXTIO_H
+>> +#define __LINUX_EXTIO_H
+>> +
+>> +struct extio_ops {
+>> +       unsigned long start;/* inclusive, sys io addr */
+>> +       unsigned long end;/* inclusive, sys io addr */
+>> +
+>> +       u64 (*pfin)(void *devobj, unsigned long ptaddr, size_t dlen);
+>> +       void (*pfout)(void *devobj, unsigned long ptaddr, u32 outval,
+>> +                                       size_t dlen);
+>> +       u64 (*pfins)(void *devobj, unsigned long ptaddr, void *inbuf,
+>> +                               size_t dlen, unsigned int count);
+>> +       void (*pfouts)(void *devobj, unsigned long ptaddr,
+>> +                               const void *outbuf, size_t dlen,
+>> +                               unsigned int count);
+>> +       void *devpara;
+>> +};
+>> +
+>> +extern struct extio_ops *arm64_extio_ops;
+>> +
+>> +#define DECLARE_EXTIO(bw, type)                                                \
+>> +extern type in##bw(unsigned long addr);                                        \
+>> +extern void out##bw(type value, unsigned long addr);                   \
+>> +extern void ins##bw(unsigned long addr, void *buffer, unsigned int count);\
+>> +extern void outs##bw(unsigned long addr, const void *buffer, unsigned int count);
+>> +
+>> +#define BUILD_EXTIO(bw, type)                                          \
+>> +type in##bw(unsigned long addr)                                                \
+>> +{                                                                      \
+>> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \
+>> +                       arm64_extio_ops->end < addr)                    \
+>> +               return read##bw(PCI_IOBASE + addr);                     \
+>> +       return arm64_extio_ops->pfin ?                                  \
+>> +               arm64_extio_ops->pfin(arm64_extio_ops->devpara,         \
+>> +                       addr, sizeof(type)) : -1;                       \
+>> +}                                                                      \
+>> +                                                                       \
+>> +void out##bw(type value, unsigned long addr)                           \
+>> +{                                                                      \
+>> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \
+>> +                       arm64_extio_ops->end < addr)                    \
+>> +               write##bw(value, PCI_IOBASE + addr);                    \
+>> +       else                                                            \
+>> +               if (arm64_extio_ops->pfout)                             \
+>> +                       arm64_extio_ops->pfout(arm64_extio_ops->devpara,\
+>> +                               addr, value, sizeof(type));             \
+>> +}                                                                      \
+>> +                                                                       \
+>> +void ins##bw(unsigned long addr, void *buffer, unsigned int count)     \
+>> +{                                                                      \
+>> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \
+>> +                       arm64_extio_ops->end < addr)                    \
+>> +               reads##bw(PCI_IOBASE + addr, buffer, count);            \
+>> +       else                                                            \
+>> +               if (arm64_extio_ops->pfins)                             \
+>> +                       arm64_extio_ops->pfins(arm64_extio_ops->devpara,\
+>> +                               addr, buffer, sizeof(type), count);     \
+>> +}                                                                      \
+>> +                                                                       \
+>> +void outs##bw(unsigned long addr, const void *buffer, unsigned int count)      \
+>> +{                                                                      \
+>> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \
+>> +                       arm64_extio_ops->end < addr)                    \
+>> +               writes##bw(PCI_IOBASE + addr, buffer, count);           \
+>> +       else                                                            \
+>> +               if (arm64_extio_ops->pfouts)                            \
+>> +                       arm64_extio_ops->pfouts(arm64_extio_ops->devpara,\
+>> +                               addr, buffer, sizeof(type), count);     \
+>> +}
+>> +
+>> +static inline void arm64_set_extops(struct extio_ops *ops)
+>> +{
+>> +       if (ops)
+>> +               WRITE_ONCE(arm64_extio_ops, ops);
+>> +}
+>> +
+>> +#endif /* __LINUX_EXTIO_H*/
+>> diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h
+>> index 0bba427..136735d 100644
+>> --- a/arch/arm64/include/asm/io.h
+>> +++ b/arch/arm64/include/asm/io.h
+>> @@ -31,6 +31,7 @@
+>>  #include <asm/early_ioremap.h>
+>>  #include <asm/alternative.h>
+>>  #include <asm/cpufeature.h>
+>> +#include <asm/extio.h>
+>>
+>>  #include <xen/xen.h>
+>>
+>> @@ -149,6 +150,34 @@ static inline u64 __raw_readq(const volatile void __iomem *addr)
+>>  #define IO_SPACE_LIMIT         (PCI_IO_SIZE - 1)
+>>  #define PCI_IOBASE             ((void __iomem *)PCI_IO_START)
+>>
+>> +
+>> +/*
+>> + * redefine the in(s)b/out(s)b for indirect-IO.
+>> + */
+>> +#ifdef CONFIG_ARM64_INDIRECT_PIO
+>> +#define inb inb
+>> +#define outb outb
+>> +#define insb insb
+>> +#define outsb outsb
+>> +/* external declaration */
+>> +DECLARE_EXTIO(b, u8)
+>> +
+>> +#define inw inw
+>> +#define outw outw
+>> +#define insw insw
+>> +#define outsw outsw
+>> +
+>> +DECLARE_EXTIO(w, u16)
+>> +
+>> +#define inl inl
+>> +#define outl outl
+>> +#define insl insl
+>> +#define outsl outsl
+>> +
+>> +DECLARE_EXTIO(l, u32)
+>> +#endif
+>> +
+>> +
+>>  /*
+>>   * String version of I/O memory access operations.
+>>   */
+>> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
+>> index 7d66bba..60e0482 100644
+>> --- a/arch/arm64/kernel/Makefile
+>> +++ b/arch/arm64/kernel/Makefile
+>> @@ -31,6 +31,7 @@ arm64-obj-$(CONFIG_COMPAT)            += sys32.o kuser32.o signal32.o         \
+>>                                            sys_compat.o entry32.o
+>>  arm64-obj-$(CONFIG_FUNCTION_TRACER)    += ftrace.o entry-ftrace.o
+>>  arm64-obj-$(CONFIG_MODULES)            += arm64ksyms.o module.o
+>> +arm64-obj-$(CONFIG_ARM64_INDIRECT_PIO) += extio.o
+>>  arm64-obj-$(CONFIG_ARM64_MODULE_PLTS)  += module-plts.o
+>>  arm64-obj-$(CONFIG_PERF_EVENTS)                += perf_regs.o perf_callchain.o
+>>  arm64-obj-$(CONFIG_HW_PERF_EVENTS)     += perf_event.o
+>> diff --git a/arch/arm64/kernel/extio.c b/arch/arm64/kernel/extio.c
+>> new file mode 100644
+>> index 0000000..647b3fa
+>> --- /dev/null
+>> +++ b/arch/arm64/kernel/extio.c
+>> @@ -0,0 +1,27 @@
+>> +/*
+>> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved.
+>> + * Author: Zhichang Yuan <yuanzhichang@hisilicon.com>
+>> + *
+>> + * This program is free software; you can redistribute it and/or modify
+>> + * it under the terms of the GNU General Public License version 2 as
+>> + * published by the Free Software Foundation.
+>> + *
+>> + * 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.
+>> + *
+>> + * You should have received a copy of the GNU General Public License
+>> + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+>> + */
+>> +
+>> +#include <linux/io.h>
+>> +
+>> +struct extio_ops *arm64_extio_ops;
+>> +
+>> +
+>> +BUILD_EXTIO(b, u8)
+>> +
+>> +BUILD_EXTIO(w, u16)
+>> +
+>> +BUILD_EXTIO(l, u32)
+>> --
+>> 1.9.1
+>>
+> 
+> 
+>
diff --git a/a/content_digest b/N2/content_digest
index d3eaabc..e9ebb8b 100644
--- a/a/content_digest
+++ b/N2/content_digest
@@ -1,262 +1,311 @@
  "ref\01478576829-112707-1-git-send-email-yuanzhichang@hisilicon.com\0"
  "ref\01478576829-112707-2-git-send-email-yuanzhichang@hisilicon.com\0"
  "ref\0CACVXFVNS9n9_ty8y3CyqfRaLitqDKdk1mMOrQHM-enOgJtUBeQ@mail.gmail.com\0"
- "From\0zhichang.yuan <yuanzhichang@hisilicon.com>\0"
- "Subject\0Re: [PATCH V5 1/3] ARM64 LPC: Indirect ISA port IO introduced\0"
+ "From\0yuanzhichang@hisilicon.com (zhichang.yuan)\0"
+ "Subject\0[PATCH V5 1/3] ARM64 LPC: Indirect ISA port IO introduced\0"
  "Date\0Fri, 23 Dec 2016 09:43:55 +0800\0"
- "To\0Ming Lei <tom.leiming@gmail.com>\0"
- "Cc\0Mark Rutland <mark.rutland@arm.com>"
-  gabriele.paoloni@huawei.com
-  Benjamin Herrenschmidt <benh@kernel.crashing.org>
-  Will Deacon <will.deacon@arm.com>
-  linuxarm@huawei.com
-  Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
-  Arnd Bergmann <arnd@arndb.de>
-  xuwei5@hisilicon.com
-  linux-serial@vger.kernel.org
-  Catalin Marinas <catalin.marinas@arm.com>
-  devicetree@vger.kernel.org <devicetree@vger.kernel.org>
-  minyard@acm.org
-  Liviu Dudau <liviu.dudau@arm.com>
-  john.garry@huawei.com
-  zourongrong@gmail.com
-  Rob Herring <robh+dt@kernel.org>
-  Bjorn Helgaas <bhelgaas@google.com>
-  kantyzc@163.com
-  zhichang.yuan02@gmail.com
-  linux-arm-kernel <linux-arm-kernel@lists.infradead.org>
-  linux-pci@vger.kernel.org <linux-pci@vger.kernel.org>
-  Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
- " Olof Johansson <olof@lixom.net>\0"
+ "To\0linux-arm-kernel@lists.infradead.org\0"
  "\00:1\0"
  "b\0"
- "SGnvvIxNaW5nLAoKCk9uIDIwMTYvMTIvMjIgMTY6MTUsIE1pbmcgTGVpIHdyb3RlOgo+IEhpIEd1\n"
- "eXMsCj4gCj4gT24gVHVlLCBOb3YgOCwgMjAxNiBhdCAxMTo0NyBBTSwgemhpY2hhbmcueXVhbgo+\n"
- "IDx5dWFuemhpY2hhbmdAaGlzaWxpY29uLmNvbT4gd3JvdGU6Cj4+IEZvciBhcm02NCwgdGhlcmUg\n"
- "aXMgbm8gSS9PIHNwYWNlIGFzIG90aGVyIGFyY2hpdGVjdHVyYWwgcGxhdGZvcm1zLCBzdWNoIGFz\n"
- "Cj4+IFg4Ni4gTW9zdCBJL08gYWNjZXNzZXMgYXJlIGFjaGlldmVkIGJhc2VkIG9uIE1NSU8uIEJ1\n"
- "dCBmb3Igc29tZSBhcm02NCBTb0NzLAo+PiBzdWNoIGFzIEhpcDA2LCB3aGVuIGFjY2Vzc2luZyBz\n"
- "b21lIGxlZ2FjeSBJU0EgZGV2aWNlcyBjb25uZWN0ZWQgdG8gTFBDLCB0aG9zZQo+PiBrbm93biBw\n"
- "b3J0IGFkZHJlc3NlcyBhcmUgdXNlZCB0byBjb250cm9sIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdl\n"
- "dCBkZXZpY2VzLCBmb3IKPj4gZXhhbXBsZSwgMHgyZjggaXMgZm9yIFVBUlQsIDB4ZTQgaXMgZm9y\n"
- "IGlwbWktYnQuIEl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZQo+PiBub3JtYWwgTU1JTyBtb2RlIGlu\n"
- "IHVzaW5nLgo+Pgo+PiBUbyBkcml2ZSB0aGVzZSBkZXZpY2VzLCB0aGlzIHBhdGNoIGludHJvZHVj\n"
- "ZXMgYSBtZXRob2QgbmFtZWQgaW5kaXJlY3QtSU8uCj4+IEluIHRoaXMgbWV0aG9kIHRoZSBpbi9v\n"
- "dXQgcGFpciBpbiBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lvLmggd2lsbCBiZQo+PiByZWRlZmlu\n"
- "ZWQuIFdoZW4gdXBwZXIgbGF5ZXIgZHJpdmVycyBjYWxsIGluL291dCB3aXRoIHRob3NlIGtub3du\n"
- "IGxlZ2FjeSBwb3J0Cj4+IGFkZHJlc3NlcyB0byBhY2Nlc3MgdGhlIHBlcmlwaGVyYWxzLCB0aGUg\n"
- "aG9va2luZyBmdW5jdGlvbnMgY29ycnJlc3BvbmRpbmcgdG8KPj4gdGhvc2UgdGFyZ2V0IHBlcmlw\n"
- "aGVyYWxzIHdpbGwgYmUgY2FsbGVkLiBUaHJvdWdoIHRoaXMgd2F5LCB0aG9zZSB1cHBlciBsYXll\n"
- "cgo+PiBkcml2ZXJzIHdoaWNoIGRlcGVuZCBvbiBpbi9vdXQgY2FuIHJ1biBvbiBIaXAwNiB3aXRo\n"
- "b3V0IGFueSBjaGFuZ2VzLgo+Pgo+PiBDYzogQ2F0YWxpbiBNYXJpbmFzIDxjYXRhbGluLm1hcmlu\n"
- "YXNAYXJtLmNvbT4KPj4gQ2M6IFdpbGwgRGVhY29uIDx3aWxsLmRlYWNvbkBhcm0uY29tPgo+PiBT\n"
- "aWduZWQtb2ZmLWJ5OiB6aGljaGFuZy55dWFuIDx5dWFuemhpY2hhbmdAaGlzaWxpY29uLmNvbT4K\n"
- "Pj4gU2lnbmVkLW9mZi1ieTogR2FicmllbGUgUGFvbG9uaSA8Z2FicmllbGUucGFvbG9uaUBodWF3\n"
- "ZWkuY29tPgo+PiAtLS0KPj4gIGFyY2gvYXJtNjQvS2NvbmZpZyAgICAgICAgICAgICB8ICA2ICsr\n"
- "Kwo+PiAgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9leHRpby5oIHwgOTQgKysrKysrKysrKysrKysr\n"
- "KysrKysrKysrKysrKysrKysrKysrKysrKysrCj4+ICBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lv\n"
- "LmggICAgfCAyOSArKysrKysrKysrKysrCj4+ICBhcmNoL2FybTY0L2tlcm5lbC9NYWtlZmlsZSAg\n"
- "ICAgfCAgMSArCj4+ICBhcmNoL2FybTY0L2tlcm5lbC9leHRpby5jICAgICAgfCAyNyArKysrKysr\n"
- "KysrKysKPj4gIDUgZmlsZXMgY2hhbmdlZCwgMTU3IGluc2VydGlvbnMoKykKPiAKPiBXaGVuIEkg\n"
- "YXBwbGllZCB0aGVzZSB0aHJlZSBwYXRjaGVzIGFnYWluc3QgY3VycmVudCBsaW51cyB0cmVlIGFu\n"
- "ZAo+IGVuYWJsZSBDT05GSUdfSElTSUxJQ09OX0xQQywgdGhlIGZvbGxvd2luZyBidWlsZCBmYWls\n"
- "dXJlWzFdIGlzCj4gdHJpZ2dlcmVkIHdoZW4gcnVubmluZyAnbWFrZSBtb2R1bGVzJy4KPiAKClRo\n"
- "YW5rcyBmb3IgeW91ciByZXBvcnQhCgpUaGlzIHBhdGNoIGhhcyBjb21waWxhdGlvbiBpc3N1ZSBv\n"
- "biBzb21lIGFyY2hpdGVjdHVyZXMsIHNvcnJ5IGZvciB0aGUgaW5jb252ZW5pZW5jZSBjYXVzZWQg\n"
- "YnkgdGhpcyEKVGhlIG9uZ29pbmcgdjYgd2lsbCBzb2x2ZSB0aGVzZSBpc3N1ZXMuCkkgd2lsbCB0\n"
- "cmFjZSB0aGlzIGZhaWx1cmUgYW5kIHByb3ZpZGUgYSBmaXggaWYgeW91IGNhbiBub3Qgd2FpdCBm\n"
- "b3IgdGhlIG5leHQgdmVyc2lvbi4KCkNvdWxkIHlvdSBzZW5kIG1lIHlvdXIgLmNvbmZpZyBpbiBw\n"
- "cml2YXRlPyBJIGRvbid0IHdhbnQgdG8gYm90aGVyIGFsbCB0aGUgaGFja2VyIGluIHRoZSBtYWls\n"
- "LWxpc3QuCgoKVGhhbmtzLApaaGljaGFuZwoKPiAKPiBUaGFua3MsCj4gTWluZwo+IAo+IFsxXSAn\n"
- "bWFrZSBtb2R1bGVzJyBmYWlsdXJlIGxvZwo+IAo+ICAgQnVpbGRpbmcgbW9kdWxlcywgc3RhZ2Ug\n"
- "Mi4KPiAgIE1PRFBPU1QgMjI2MCBtb2R1bGVzCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3dhdGNo\n"
- "ZG9nL3dkdF9wY2kua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dGIiIFtkcml2ZXJzL3dhdGNo\n"
- "ZG9nL3dkdF9wY2kua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dGIiIFtkcml2ZXJzL3dhdGNo\n"
- "ZG9nL3Bjd2RfcGNpLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3dhdGNo\n"
- "ZG9nL3Bjd2RfcGNpLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJvdXR3IiBbZHJpdmVycy92aWRl\n"
- "by92Z2FzdGF0ZS5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0YiIgW2RyaXZlcnMvdmlkZW8v\n"
- "dmdhc3RhdGUua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogImluYiIgW2RyaXZlcnMvdmlkZW8vdmdh\n"
- "c3RhdGUua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dHciIFtkcml2ZXJzL3ZpZGVvL2ZiZGV2\n"
- "L3Z0ODYyM2ZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3ZpZGVvL2Zi\n"
- "ZGV2L3Z0ODYyM2ZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJvdXRiIiBbZHJpdmVycy92aWRl\n"
- "by9mYmRldi92dDg2MjNmYi5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0dyIgW2RyaXZlcnMv\n"
- "dmlkZW8vZmJkZXYvdHJpZGVudGZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2\n"
- "ZXJzL3ZpZGVvL2ZiZGV2L3RyaWRlbnRmYi5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0YiIg\n"
- "W2RyaXZlcnMvdmlkZW8vZmJkZXYvdHJpZGVudGZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJp\n"
- "bmIiIFtkcml2ZXJzL3ZpZGVvL2ZiZGV2L3RkZnhmYi5rb10gdW5kZWZpbmVkIQo+IC4uLi4uCj4g\n"
- "RVJST1I6ICJpbmIiIFtkcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5rb10gdW5kZWZpbmVkIQo+IEVS\n"
- "Uk9SOiAiaW5iIiBbZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5rb10gdW5kZWZpbmVkIQo+IHNjcmlw\n"
- "dHMvTWFrZWZpbGUubW9kcG9zdDo5MTogcmVjaXBlIGZvciB0YXJnZXQgJ19fbW9kcG9zdCcgZmFp\n"
- "bGVkCj4gbWFrZVsxXTogKioqIFtfX21vZHBvc3RdIEVycm9yIDEKPiBNYWtlZmlsZToxMTk2OiBy\n"
- "ZWNpcGUgZm9yIHRhcmdldCAnbW9kdWxlcycgZmFpbGVkCj4gbWFrZTogKioqIFttb2R1bGVzXSBF\n"
- "cnJvciAyCj4gCj4gCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9pbmNsdWRlL2Fz\n"
- "bS9leHRpby5oCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8u\n"
- "Ywo+Pgo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29u\n"
- "ZmlnCj4+IGluZGV4IDk2OWVmODguLmI0NDA3MGIgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQv\n"
- "S2NvbmZpZwo+PiArKysgYi9hcmNoL2FybTY0L0tjb25maWcKPj4gQEAgLTE2Myw2ICsxNjMsMTIg\n"
- "QEAgY29uZmlnIEFSQ0hfTU1BUF9STkRfQ09NUEFUX0JJVFNfTUlOCj4+ICBjb25maWcgQVJDSF9N\n"
- "TUFQX1JORF9DT01QQVRfQklUU19NQVgKPj4gICAgICAgICBkZWZhdWx0IDE2Cj4+Cj4+ICtjb25m\n"
- "aWcgQVJNNjRfSU5ESVJFQ1RfUElPCj4+ICsgICAgICAgYm9vbCAiYWNjZXNzIHBlcmlwaGVyYWxz\n"
- "IHdpdGggbGVnYWN5IEkvTyBwb3J0Igo+PiArICAgICAgIGhlbHAKPj4gKyAgICAgICAgIFN1cHBv\n"
- "cnQgc3BlY2lhbCBhY2Nlc3NvcnMgZm9yIElTQSBJL08gZGV2aWNlcy4gVGhpcyBpcyBuZWVkZWQg\n"
- "Zm9yCj4+ICsgICAgICAgICBTb0NzIHRoYXQgZG8gbm90IHN1cHBvcnQgc3RhbmRhcmQgcmVhZC93\n"
- "cml0ZSBmb3IgdGhlIElTQSByYW5nZS4KPj4gKwo+PiAgY29uZmlnIE5PX0lPUE9SVF9NQVAKPj4g\n"
- "ICAgICAgICBkZWZfYm9vbCB5IGlmICFQQ0kKPj4KPj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQv\n"
- "aW5jbHVkZS9hc20vZXh0aW8uaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXh0aW8uaAo+PiBu\n"
- "ZXcgZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi42YWUwNzg3Cj4+IC0tLSAvZGV2\n"
- "L251bGwKPj4gKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9leHRpby5oCj4+IEBAIC0wLDAg\n"
- "KzEsOTQgQEAKPj4gKy8qCj4+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSGlzaWxpY29uIExpbWl0\n"
- "ZWQsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCj4+ICsgKiBBdXRob3I6IFpoaWNoYW5nIFl1YW4gPHl1\n"
- "YW56aGljaGFuZ0BoaXNpbGljb24uY29tPgo+PiArICoKPj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBm\n"
- "cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4+ICsg\n"
- "KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZl\n"
- "cnNpb24gMiBhcwo+PiArICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp\n"
- "b24uCj4+ICsgKgo+PiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl\n"
- "IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7\n"
- "IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+PiArICogTUVSQ0hBTlRBQklM\n"
- "SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+PiArICog\n"
- "R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KPj4gKyAqCj4+ICsg\n"
- "KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs\n"
- "aWMgTGljZW5zZQo+PiArICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8\n"
- "aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCj4+ICsgKi8KPj4gKwo+PiArI2lmbmRlZiBf\n"
- "X0xJTlVYX0VYVElPX0gKPj4gKyNkZWZpbmUgX19MSU5VWF9FWFRJT19ICj4+ICsKPj4gK3N0cnVj\n"
- "dCBleHRpb19vcHMgewo+PiArICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQ7LyogaW5jbHVzaXZl\n"
- "LCBzeXMgaW8gYWRkciAqLwo+PiArICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kOy8qIGluY2x1c2l2\n"
- "ZSwgc3lzIGlvIGFkZHIgKi8KPj4gKwo+PiArICAgICAgIHU2NCAoKnBmaW4pKHZvaWQgKmRldm9i\n"
- "aiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsIHNpemVfdCBkbGVuKTsKPj4gKyAgICAgICB2b2lkICgq\n"
- "cGZvdXQpKHZvaWQgKmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsIHUzMiBvdXR2YWwsCj4+\n"
- "ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGxlbik7Cj4+\n"
- "ICsgICAgICAgdTY0ICgqcGZpbnMpKHZvaWQgKmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIs\n"
- "IHZvaWQgKmluYnVmLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBk\n"
- "bGVuLCB1bnNpZ25lZCBpbnQgY291bnQpOwo+PiArICAgICAgIHZvaWQgKCpwZm91dHMpKHZvaWQg\n"
- "KmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsCj4+ICsgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgY29uc3Qgdm9pZCAqb3V0YnVmLCBzaXplX3QgZGxlbiwKPj4gKyAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQpOwo+PiArICAgICAgIHZvaWQg\n"
- "KmRldnBhcmE7Cj4+ICt9Owo+PiArCj4+ICtleHRlcm4gc3RydWN0IGV4dGlvX29wcyAqYXJtNjRf\n"
- "ZXh0aW9fb3BzOwo+PiArCj4+ICsjZGVmaW5lIERFQ0xBUkVfRVhUSU8oYncsIHR5cGUpICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArZXh0ZXJuIHR5\n"
- "cGUgaW4jI2J3KHVuc2lnbmVkIGxvbmcgYWRkcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgIFwKPj4gK2V4dGVybiB2b2lkIG91dCMjYncodHlwZSB2YWx1ZSwgdW5zaWdu\n"
- "ZWQgbG9uZyBhZGRyKTsgICAgICAgICAgICAgICAgICAgXAo+PiArZXh0ZXJuIHZvaWQgaW5zIyNi\n"
- "dyh1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KTtc\n"
- "Cj4+ICtleHRlcm4gdm9pZCBvdXRzIyNidyh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQg\n"
- "KmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KTsKPj4gKwo+PiArI2RlZmluZSBCVUlMRF9FWFRJ\n"
- "TyhidywgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+\n"
- "ICt0eXBlIGluIyNidyh1bnNpZ25lZCBsb25nIGFkZHIpICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAreyAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+ICsgICAgICAg\n"
- "aWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9fb3BzLT5zdGFydCA+IGFkZHIgfHwg\n"
- "ICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgYXJtNjRfZXh0aW9fb3BzLT5lbmQg\n"
- "PCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAgICAgICAgICAgICAgcmV0dXJuIHJl\n"
- "YWQjI2J3KFBDSV9JT0JBU0UgKyBhZGRyKTsgICAgICAgICAgICAgICAgICAgICBcCj4+ICsgICAg\n"
- "ICAgcmV0dXJuIGFybTY0X2V4dGlvX29wcy0+cGZpbiA/ICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGFybTY0X2V4dGlvX29wcy0+cGZpbihhcm02\n"
- "NF9leHRpb19vcHMtPmRldnBhcmEsICAgICAgICAgXAo+PiArICAgICAgICAgICAgICAgICAgICAg\n"
- "ICBhZGRyLCBzaXplb2YodHlwZSkpIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICBcCj4+ICt9\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArdm9pZCBvdXQjI2J3KHR5cGUg\n"
- "dmFsdWUsIHVuc2lnbmVkIGxvbmcgYWRkcikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+\n"
- "ICt7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICBpZiAoIWFybTY0X2V4dGlvX29wcyB8fCBhcm02\n"
- "NF9leHRpb19vcHMtPnN0YXJ0ID4gYWRkciB8fCAgICAgICAgXAo+PiArICAgICAgICAgICAgICAg\n"
- "ICAgICAgICBhcm02NF9leHRpb19vcHMtPmVuZCA8IGFkZHIpICAgICAgICAgICAgICAgICAgICBc\n"
- "Cj4+ICsgICAgICAgICAgICAgICB3cml0ZSMjYncodmFsdWUsIFBDSV9JT0JBU0UgKyBhZGRyKTsg\n"
- "ICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArICAgICAgICAgICAg\n"
- "ICAgaWYgKGFybTY0X2V4dGlvX29wcy0+cGZvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICBcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgIGFybTY0X2V4dGlvX29wcy0+cGZvdXQoYXJt\n"
- "NjRfZXh0aW9fb3BzLT5kZXZwYXJhLFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICBhZGRyLCB2YWx1ZSwgc2l6ZW9mKHR5cGUpKTsgICAgICAgICAgICAgXAo+PiArfSAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICBcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gK3ZvaWQgaW5zIyNidyh1bnNpZ25lZCBsb25n\n"
- "IGFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KSAgICAgXAo+PiAreyAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICBcCj4+ICsgICAgICAgaWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9f\n"
- "b3BzLT5zdGFydCA+IGFkZHIgfHwgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg\n"
- "YXJtNjRfZXh0aW9fb3BzLT5lbmQgPCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAg\n"
- "ICAgICAgICAgICAgcmVhZHMjI2J3KFBDSV9JT0JBU0UgKyBhZGRyLCBidWZmZXIsIGNvdW50KTsg\n"
- "ICAgICAgICAgICBcCj4+ICsgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGlmIChh\n"
- "cm02NF9leHRpb19vcHMtPnBmaW5zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAr\n"
- "ICAgICAgICAgICAgICAgICAgICAgICBhcm02NF9leHRpb19vcHMtPnBmaW5zKGFybTY0X2V4dGlv\n"
- "X29wcy0+ZGV2cGFyYSxcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciwg\n"
- "YnVmZmVyLCBzaXplb2YodHlwZSksIGNvdW50KTsgICAgIFwKPj4gK30gICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+\n"
- "PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICBcCj4+ICt2b2lkIG91dHMjI2J3KHVuc2lnbmVkIGxvbmcgYWRkciwg\n"
- "Y29uc3Qgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgY291bnQpICAgICAgXAo+PiAreyAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICBcCj4+ICsgICAgICAgaWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9f\n"
- "b3BzLT5zdGFydCA+IGFkZHIgfHwgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg\n"
- "YXJtNjRfZXh0aW9fb3BzLT5lbmQgPCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAg\n"
- "ICAgICAgICAgICAgd3JpdGVzIyNidyhQQ0lfSU9CQVNFICsgYWRkciwgYnVmZmVyLCBjb3VudCk7\n"
- "ICAgICAgICAgICBcCj4+ICsgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGlmIChh\n"
- "cm02NF9leHRpb19vcHMtPnBmb3V0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAr\n"
- "ICAgICAgICAgICAgICAgICAgICAgICBhcm02NF9leHRpb19vcHMtPnBmb3V0cyhhcm02NF9leHRp\n"
- "b19vcHMtPmRldnBhcmEsXAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIs\n"
- "IGJ1ZmZlciwgc2l6ZW9mKHR5cGUpLCBjb3VudCk7ICAgICBcCj4+ICt9Cj4+ICsKPj4gK3N0YXRp\n"
- "YyBpbmxpbmUgdm9pZCBhcm02NF9zZXRfZXh0b3BzKHN0cnVjdCBleHRpb19vcHMgKm9wcykKPj4g\n"
- "K3sKPj4gKyAgICAgICBpZiAob3BzKQo+PiArICAgICAgICAgICAgICAgV1JJVEVfT05DRShhcm02\n"
- "NF9leHRpb19vcHMsIG9wcyk7Cj4+ICt9Cj4+ICsKPj4gKyNlbmRpZiAvKiBfX0xJTlVYX0VYVElP\n"
- "X0gqLwo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9h\n"
- "cm02NC9pbmNsdWRlL2FzbS9pby5oCj4+IGluZGV4IDBiYmE0MjcuLjEzNjczNWQgMTAwNjQ0Cj4+\n"
- "IC0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW8uaAo+PiArKysgYi9hcmNoL2FybTY0L2lu\n"
- "Y2x1ZGUvYXNtL2lvLmgKPj4gQEAgLTMxLDYgKzMxLDcgQEAKPj4gICNpbmNsdWRlIDxhc20vZWFy\n"
- "bHlfaW9yZW1hcC5oPgo+PiAgI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS5oPgo+PiAgI2luY2x1\n"
- "ZGUgPGFzbS9jcHVmZWF0dXJlLmg+Cj4+ICsjaW5jbHVkZSA8YXNtL2V4dGlvLmg+Cj4+Cj4+ICAj\n"
- "aW5jbHVkZSA8eGVuL3hlbi5oPgo+Pgo+PiBAQCAtMTQ5LDYgKzE1MCwzNCBAQCBzdGF0aWMgaW5s\n"
- "aW5lIHU2NCBfX3Jhd19yZWFkcShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCj4+\n"
- "ICAjZGVmaW5lIElPX1NQQUNFX0xJTUlUICAgICAgICAgKFBDSV9JT19TSVpFIC0gMSkKPj4gICNk\n"
- "ZWZpbmUgUENJX0lPQkFTRSAgICAgICAgICAgICAoKHZvaWQgX19pb21lbSAqKVBDSV9JT19TVEFS\n"
- "VCkKPj4KPj4gKwo+PiArLyoKPj4gKyAqIHJlZGVmaW5lIHRoZSBpbihzKWIvb3V0KHMpYiBmb3Ig\n"
- "aW5kaXJlY3QtSU8uCj4+ICsgKi8KPj4gKyNpZmRlZiBDT05GSUdfQVJNNjRfSU5ESVJFQ1RfUElP\n"
- "Cj4+ICsjZGVmaW5lIGluYiBpbmIKPj4gKyNkZWZpbmUgb3V0YiBvdXRiCj4+ICsjZGVmaW5lIGlu\n"
- "c2IgaW5zYgo+PiArI2RlZmluZSBvdXRzYiBvdXRzYgo+PiArLyogZXh0ZXJuYWwgZGVjbGFyYXRp\n"
- "b24gKi8KPj4gK0RFQ0xBUkVfRVhUSU8oYiwgdTgpCj4+ICsKPj4gKyNkZWZpbmUgaW53IGludwo+\n"
- "PiArI2RlZmluZSBvdXR3IG91dHcKPj4gKyNkZWZpbmUgaW5zdyBpbnN3Cj4+ICsjZGVmaW5lIG91\n"
- "dHN3IG91dHN3Cj4+ICsKPj4gK0RFQ0xBUkVfRVhUSU8odywgdTE2KQo+PiArCj4+ICsjZGVmaW5l\n"
- "IGlubCBpbmwKPj4gKyNkZWZpbmUgb3V0bCBvdXRsCj4+ICsjZGVmaW5lIGluc2wgaW5zbAo+PiAr\n"
- "I2RlZmluZSBvdXRzbCBvdXRzbAo+PiArCj4+ICtERUNMQVJFX0VYVElPKGwsIHUzMikKPj4gKyNl\n"
- "bmRpZgo+PiArCj4+ICsKPj4gIC8qCj4+ICAgKiBTdHJpbmcgdmVyc2lvbiBvZiBJL08gbWVtb3J5\n"
- "IGFjY2VzcyBvcGVyYXRpb25zLgo+PiAgICovCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tl\n"
- "cm5lbC9NYWtlZmlsZSBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+IGluZGV4IDdkNjZi\n"
- "YmEuLjYwZTA0ODIgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+\n"
- "ICsrKyBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+IEBAIC0zMSw2ICszMSw3IEBAIGFy\n"
- "bTY0LW9iai0kKENPTkZJR19DT01QQVQpICAgICAgICAgICAgKz0gc3lzMzIubyBrdXNlcjMyLm8g\n"
- "c2lnbmFsMzIubyAgICAgICAgIFwKPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgIHN5c19jb21wYXQubyBlbnRyeTMyLm8KPj4gIGFybTY0LW9iai0kKENPTkZJR19G\n"
- "VU5DVElPTl9UUkFDRVIpICAgICs9IGZ0cmFjZS5vIGVudHJ5LWZ0cmFjZS5vCj4+ICBhcm02NC1v\n"
- "YmotJChDT05GSUdfTU9EVUxFUykgICAgICAgICAgICArPSBhcm02NGtzeW1zLm8gbW9kdWxlLm8K\n"
- "Pj4gK2FybTY0LW9iai0kKENPTkZJR19BUk02NF9JTkRJUkVDVF9QSU8pICs9IGV4dGlvLm8KPj4g\n"
- "IGFybTY0LW9iai0kKENPTkZJR19BUk02NF9NT0RVTEVfUExUUykgICs9IG1vZHVsZS1wbHRzLm8K\n"
- "Pj4gIGFybTY0LW9iai0kKENPTkZJR19QRVJGX0VWRU5UUykgICAgICAgICAgICAgICAgKz0gcGVy\n"
- "Zl9yZWdzLm8gcGVyZl9jYWxsY2hhaW4ubwo+PiAgYXJtNjQtb2JqLSQoQ09ORklHX0hXX1BFUkZf\n"
- "RVZFTlRTKSAgICAgKz0gcGVyZl9ldmVudC5vCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tl\n"
- "cm5lbC9leHRpby5jIGIvYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8uYwo+PiBuZXcgZmlsZSBtb2Rl\n"
- "IDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi42NDdiM2ZhCj4+IC0tLSAvZGV2L251bGwKPj4gKysr\n"
- "IGIvYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8uYwo+PiBAQCAtMCwwICsxLDI3IEBACj4+ICsvKgo+\n"
- "PiArICogQ29weXJpZ2h0IChDKSAyMDE2IEhpc2lsaWNvbiBMaW1pdGVkLCBBbGwgUmlnaHRzIFJl\n"
- "c2VydmVkLgo+PiArICogQXV0aG9yOiBaaGljaGFuZyBZdWFuIDx5dWFuemhpY2hhbmdAaGlzaWxp\n"
- "Y29uLmNvbT4KPj4gKyAqCj4+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91\n"
- "IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+PiArICogaXQgdW5kZXIgdGhlIHRl\n"
- "cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKPj4gKyAq\n"
- "IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+PiArICoKPj4gKyAq\n"
- "IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg\n"
- "dXNlZnVsLAo+PiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl\n"
- "IGltcGxpZWQgd2FycmFudHkgb2YKPj4gKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP\n"
- "UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKPj4gKyAqIEdOVSBHZW5lcmFsIFB1Ymxp\n"
- "YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4+ICsgKgo+PiArICogWW91IHNob3VsZCBoYXZl\n"
- "IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKPj4gKyAq\n"
- "IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9y\n"
- "Zy9saWNlbnNlcy8+Lgo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRlIDxsaW51eC9pby5oPgo+PiAr\n"
- "Cj4+ICtzdHJ1Y3QgZXh0aW9fb3BzICphcm02NF9leHRpb19vcHM7Cj4+ICsKPj4gKwo+PiArQlVJ\n"
- "TERfRVhUSU8oYiwgdTgpCj4+ICsKPj4gK0JVSUxEX0VYVElPKHcsIHUxNikKPj4gKwo+PiArQlVJ\n"
- "TERfRVhUSU8obCwgdTMyKQo+PiAtLQo+PiAxLjkuMQo+Pgo+IAo+IAo+IAoKCl9fX19fX19fX19f\n"
- "X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFp\n"
- "bGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlz\n"
- dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK
+ "Hi?Ming,\n"
+ "\n"
+ "\n"
+ "On 2016/12/22 16:15, Ming Lei wrote:\n"
+ "> Hi Guys,\n"
+ "> \n"
+ "> On Tue, Nov 8, 2016 at 11:47 AM, zhichang.yuan\n"
+ "> <yuanzhichang@hisilicon.com> wrote:\n"
+ ">> For arm64, there is no I/O space as other architectural platforms, such as\n"
+ ">> X86. Most I/O accesses are achieved based on MMIO. But for some arm64 SoCs,\n"
+ ">> such as Hip06, when accessing some legacy ISA devices connected to LPC, those\n"
+ ">> known port addresses are used to control the corresponding target devices, for\n"
+ ">> example, 0x2f8 is for UART, 0xe4 is for ipmi-bt. It is different from the\n"
+ ">> normal MMIO mode in using.\n"
+ ">>\n"
+ ">> To drive these devices, this patch introduces a method named indirect-IO.\n"
+ ">> In this method the in/out pair in arch/arm64/include/asm/io.h will be\n"
+ ">> redefined. When upper layer drivers call in/out with those known legacy port\n"
+ ">> addresses to access the peripherals, the hooking functions corrresponding to\n"
+ ">> those target peripherals will be called. Through this way, those upper layer\n"
+ ">> drivers which depend on in/out can run on Hip06 without any changes.\n"
+ ">>\n"
+ ">> Cc: Catalin Marinas <catalin.marinas@arm.com>\n"
+ ">> Cc: Will Deacon <will.deacon@arm.com>\n"
+ ">> Signed-off-by: zhichang.yuan <yuanzhichang@hisilicon.com>\n"
+ ">> Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>\n"
+ ">> ---\n"
+ ">>  arch/arm64/Kconfig             |  6 +++\n"
+ ">>  arch/arm64/include/asm/extio.h | 94 ++++++++++++++++++++++++++++++++++++++++++\n"
+ ">>  arch/arm64/include/asm/io.h    | 29 +++++++++++++\n"
+ ">>  arch/arm64/kernel/Makefile     |  1 +\n"
+ ">>  arch/arm64/kernel/extio.c      | 27 ++++++++++++\n"
+ ">>  5 files changed, 157 insertions(+)\n"
+ "> \n"
+ "> When I applied these three patches against current linus tree and\n"
+ "> enable CONFIG_HISILICON_LPC, the following build failure[1] is\n"
+ "> triggered when running 'make modules'.\n"
+ "> \n"
+ "\n"
+ "Thanks for your report!\n"
+ "\n"
+ "This patch has compilation issue on some architectures, sorry for the inconvenience caused by this!\n"
+ "The ongoing v6 will solve these issues.\n"
+ "I will trace this failure and provide a fix if you can not wait for the next version.\n"
+ "\n"
+ "Could you send me your .config in private? I don't want to bother all the hacker in the mail-list.\n"
+ "\n"
+ "\n"
+ "Thanks,\n"
+ "Zhichang\n"
+ "\n"
+ "> \n"
+ "> Thanks,\n"
+ "> Ming\n"
+ "> \n"
+ "> [1] 'make modules' failure log\n"
+ "> \n"
+ ">   Building modules, stage 2.\n"
+ ">   MODPOST 2260 modules\n"
+ "> ERROR: \"inb\" [drivers/watchdog/wdt_pci.ko] undefined!\n"
+ "> ERROR: \"outb\" [drivers/watchdog/wdt_pci.ko] undefined!\n"
+ "> ERROR: \"outb\" [drivers/watchdog/pcwd_pci.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/watchdog/pcwd_pci.ko] undefined!\n"
+ "> ERROR: \"outw\" [drivers/video/vgastate.ko] undefined!\n"
+ "> ERROR: \"outb\" [drivers/video/vgastate.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/video/vgastate.ko] undefined!\n"
+ "> ERROR: \"outw\" [drivers/video/fbdev/vt8623fb.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/video/fbdev/vt8623fb.ko] undefined!\n"
+ "> ERROR: \"outb\" [drivers/video/fbdev/vt8623fb.ko] undefined!\n"
+ "> ERROR: \"outw\" [drivers/video/fbdev/tridentfb.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/video/fbdev/tridentfb.ko] undefined!\n"
+ "> ERROR: \"outb\" [drivers/video/fbdev/tridentfb.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/video/fbdev/tdfxfb.ko] undefined!\n"
+ "> .....\n"
+ "> ERROR: \"inb\" [drivers/ata/pata_cmd64x.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/ata/pata_artop.ko] undefined!\n"
+ "> scripts/Makefile.modpost:91: recipe for target '__modpost' failed\n"
+ "> make[1]: *** [__modpost] Error 1\n"
+ "> Makefile:1196: recipe for target 'modules' failed\n"
+ "> make: *** [modules] Error 2\n"
+ "> \n"
+ "> \n"
+ ">>  create mode 100644 arch/arm64/include/asm/extio.h\n"
+ ">>  create mode 100644 arch/arm64/kernel/extio.c\n"
+ ">>\n"
+ ">> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig\n"
+ ">> index 969ef88..b44070b 100644\n"
+ ">> --- a/arch/arm64/Kconfig\n"
+ ">> +++ b/arch/arm64/Kconfig\n"
+ ">> @@ -163,6 +163,12 @@ config ARCH_MMAP_RND_COMPAT_BITS_MIN\n"
+ ">>  config ARCH_MMAP_RND_COMPAT_BITS_MAX\n"
+ ">>         default 16\n"
+ ">>\n"
+ ">> +config ARM64_INDIRECT_PIO\n"
+ ">> +       bool \"access peripherals with legacy I/O port\"\n"
+ ">> +       help\n"
+ ">> +         Support special accessors for ISA I/O devices. This is needed for\n"
+ ">> +         SoCs that do not support standard read/write for the ISA range.\n"
+ ">> +\n"
+ ">>  config NO_IOPORT_MAP\n"
+ ">>         def_bool y if !PCI\n"
+ ">>\n"
+ ">> diff --git a/arch/arm64/include/asm/extio.h b/arch/arm64/include/asm/extio.h\n"
+ ">> new file mode 100644\n"
+ ">> index 0000000..6ae0787\n"
+ ">> --- /dev/null\n"
+ ">> +++ b/arch/arm64/include/asm/extio.h\n"
+ ">> @@ -0,0 +1,94 @@\n"
+ ">> +/*\n"
+ ">> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved.\n"
+ ">> + * Author: Zhichang Yuan <yuanzhichang@hisilicon.com>\n"
+ ">> + *\n"
+ ">> + * This program is free software; you can redistribute it and/or modify\n"
+ ">> + * it under the terms of the GNU General Public License version 2 as\n"
+ ">> + * published by the Free Software Foundation.\n"
+ ">> + *\n"
+ ">> + * This program is distributed in the hope that it will be useful,\n"
+ ">> + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ ">> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+ ">> + * GNU General Public License for more details.\n"
+ ">> + *\n"
+ ">> + * You should have received a copy of the GNU General Public License\n"
+ ">> + * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
+ ">> + */\n"
+ ">> +\n"
+ ">> +#ifndef __LINUX_EXTIO_H\n"
+ ">> +#define __LINUX_EXTIO_H\n"
+ ">> +\n"
+ ">> +struct extio_ops {\n"
+ ">> +       unsigned long start;/* inclusive, sys io addr */\n"
+ ">> +       unsigned long end;/* inclusive, sys io addr */\n"
+ ">> +\n"
+ ">> +       u64 (*pfin)(void *devobj, unsigned long ptaddr, size_t dlen);\n"
+ ">> +       void (*pfout)(void *devobj, unsigned long ptaddr, u32 outval,\n"
+ ">> +                                       size_t dlen);\n"
+ ">> +       u64 (*pfins)(void *devobj, unsigned long ptaddr, void *inbuf,\n"
+ ">> +                               size_t dlen, unsigned int count);\n"
+ ">> +       void (*pfouts)(void *devobj, unsigned long ptaddr,\n"
+ ">> +                               const void *outbuf, size_t dlen,\n"
+ ">> +                               unsigned int count);\n"
+ ">> +       void *devpara;\n"
+ ">> +};\n"
+ ">> +\n"
+ ">> +extern struct extio_ops *arm64_extio_ops;\n"
+ ">> +\n"
+ ">> +#define DECLARE_EXTIO(bw, type)                                                \\\n"
+ ">> +extern type in##bw(unsigned long addr);                                        \\\n"
+ ">> +extern void out##bw(type value, unsigned long addr);                   \\\n"
+ ">> +extern void ins##bw(unsigned long addr, void *buffer, unsigned int count);\\\n"
+ ">> +extern void outs##bw(unsigned long addr, const void *buffer, unsigned int count);\n"
+ ">> +\n"
+ ">> +#define BUILD_EXTIO(bw, type)                                          \\\n"
+ ">> +type in##bw(unsigned long addr)                                                \\\n"
+ ">> +{                                                                      \\\n"
+ ">> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \\\n"
+ ">> +                       arm64_extio_ops->end < addr)                    \\\n"
+ ">> +               return read##bw(PCI_IOBASE + addr);                     \\\n"
+ ">> +       return arm64_extio_ops->pfin ?                                  \\\n"
+ ">> +               arm64_extio_ops->pfin(arm64_extio_ops->devpara,         \\\n"
+ ">> +                       addr, sizeof(type)) : -1;                       \\\n"
+ ">> +}                                                                      \\\n"
+ ">> +                                                                       \\\n"
+ ">> +void out##bw(type value, unsigned long addr)                           \\\n"
+ ">> +{                                                                      \\\n"
+ ">> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \\\n"
+ ">> +                       arm64_extio_ops->end < addr)                    \\\n"
+ ">> +               write##bw(value, PCI_IOBASE + addr);                    \\\n"
+ ">> +       else                                                            \\\n"
+ ">> +               if (arm64_extio_ops->pfout)                             \\\n"
+ ">> +                       arm64_extio_ops->pfout(arm64_extio_ops->devpara,\\\n"
+ ">> +                               addr, value, sizeof(type));             \\\n"
+ ">> +}                                                                      \\\n"
+ ">> +                                                                       \\\n"
+ ">> +void ins##bw(unsigned long addr, void *buffer, unsigned int count)     \\\n"
+ ">> +{                                                                      \\\n"
+ ">> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \\\n"
+ ">> +                       arm64_extio_ops->end < addr)                    \\\n"
+ ">> +               reads##bw(PCI_IOBASE + addr, buffer, count);            \\\n"
+ ">> +       else                                                            \\\n"
+ ">> +               if (arm64_extio_ops->pfins)                             \\\n"
+ ">> +                       arm64_extio_ops->pfins(arm64_extio_ops->devpara,\\\n"
+ ">> +                               addr, buffer, sizeof(type), count);     \\\n"
+ ">> +}                                                                      \\\n"
+ ">> +                                                                       \\\n"
+ ">> +void outs##bw(unsigned long addr, const void *buffer, unsigned int count)      \\\n"
+ ">> +{                                                                      \\\n"
+ ">> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \\\n"
+ ">> +                       arm64_extio_ops->end < addr)                    \\\n"
+ ">> +               writes##bw(PCI_IOBASE + addr, buffer, count);           \\\n"
+ ">> +       else                                                            \\\n"
+ ">> +               if (arm64_extio_ops->pfouts)                            \\\n"
+ ">> +                       arm64_extio_ops->pfouts(arm64_extio_ops->devpara,\\\n"
+ ">> +                               addr, buffer, sizeof(type), count);     \\\n"
+ ">> +}\n"
+ ">> +\n"
+ ">> +static inline void arm64_set_extops(struct extio_ops *ops)\n"
+ ">> +{\n"
+ ">> +       if (ops)\n"
+ ">> +               WRITE_ONCE(arm64_extio_ops, ops);\n"
+ ">> +}\n"
+ ">> +\n"
+ ">> +#endif /* __LINUX_EXTIO_H*/\n"
+ ">> diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h\n"
+ ">> index 0bba427..136735d 100644\n"
+ ">> --- a/arch/arm64/include/asm/io.h\n"
+ ">> +++ b/arch/arm64/include/asm/io.h\n"
+ ">> @@ -31,6 +31,7 @@\n"
+ ">>  #include <asm/early_ioremap.h>\n"
+ ">>  #include <asm/alternative.h>\n"
+ ">>  #include <asm/cpufeature.h>\n"
+ ">> +#include <asm/extio.h>\n"
+ ">>\n"
+ ">>  #include <xen/xen.h>\n"
+ ">>\n"
+ ">> @@ -149,6 +150,34 @@ static inline u64 __raw_readq(const volatile void __iomem *addr)\n"
+ ">>  #define IO_SPACE_LIMIT         (PCI_IO_SIZE - 1)\n"
+ ">>  #define PCI_IOBASE             ((void __iomem *)PCI_IO_START)\n"
+ ">>\n"
+ ">> +\n"
+ ">> +/*\n"
+ ">> + * redefine the in(s)b/out(s)b for indirect-IO.\n"
+ ">> + */\n"
+ ">> +#ifdef CONFIG_ARM64_INDIRECT_PIO\n"
+ ">> +#define inb inb\n"
+ ">> +#define outb outb\n"
+ ">> +#define insb insb\n"
+ ">> +#define outsb outsb\n"
+ ">> +/* external declaration */\n"
+ ">> +DECLARE_EXTIO(b, u8)\n"
+ ">> +\n"
+ ">> +#define inw inw\n"
+ ">> +#define outw outw\n"
+ ">> +#define insw insw\n"
+ ">> +#define outsw outsw\n"
+ ">> +\n"
+ ">> +DECLARE_EXTIO(w, u16)\n"
+ ">> +\n"
+ ">> +#define inl inl\n"
+ ">> +#define outl outl\n"
+ ">> +#define insl insl\n"
+ ">> +#define outsl outsl\n"
+ ">> +\n"
+ ">> +DECLARE_EXTIO(l, u32)\n"
+ ">> +#endif\n"
+ ">> +\n"
+ ">> +\n"
+ ">>  /*\n"
+ ">>   * String version of I/O memory access operations.\n"
+ ">>   */\n"
+ ">> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile\n"
+ ">> index 7d66bba..60e0482 100644\n"
+ ">> --- a/arch/arm64/kernel/Makefile\n"
+ ">> +++ b/arch/arm64/kernel/Makefile\n"
+ ">> @@ -31,6 +31,7 @@ arm64-obj-$(CONFIG_COMPAT)            += sys32.o kuser32.o signal32.o         \\\n"
+ ">>                                            sys_compat.o entry32.o\n"
+ ">>  arm64-obj-$(CONFIG_FUNCTION_TRACER)    += ftrace.o entry-ftrace.o\n"
+ ">>  arm64-obj-$(CONFIG_MODULES)            += arm64ksyms.o module.o\n"
+ ">> +arm64-obj-$(CONFIG_ARM64_INDIRECT_PIO) += extio.o\n"
+ ">>  arm64-obj-$(CONFIG_ARM64_MODULE_PLTS)  += module-plts.o\n"
+ ">>  arm64-obj-$(CONFIG_PERF_EVENTS)                += perf_regs.o perf_callchain.o\n"
+ ">>  arm64-obj-$(CONFIG_HW_PERF_EVENTS)     += perf_event.o\n"
+ ">> diff --git a/arch/arm64/kernel/extio.c b/arch/arm64/kernel/extio.c\n"
+ ">> new file mode 100644\n"
+ ">> index 0000000..647b3fa\n"
+ ">> --- /dev/null\n"
+ ">> +++ b/arch/arm64/kernel/extio.c\n"
+ ">> @@ -0,0 +1,27 @@\n"
+ ">> +/*\n"
+ ">> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved.\n"
+ ">> + * Author: Zhichang Yuan <yuanzhichang@hisilicon.com>\n"
+ ">> + *\n"
+ ">> + * This program is free software; you can redistribute it and/or modify\n"
+ ">> + * it under the terms of the GNU General Public License version 2 as\n"
+ ">> + * published by the Free Software Foundation.\n"
+ ">> + *\n"
+ ">> + * This program is distributed in the hope that it will be useful,\n"
+ ">> + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ ">> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+ ">> + * GNU General Public License for more details.\n"
+ ">> + *\n"
+ ">> + * You should have received a copy of the GNU General Public License\n"
+ ">> + * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
+ ">> + */\n"
+ ">> +\n"
+ ">> +#include <linux/io.h>\n"
+ ">> +\n"
+ ">> +struct extio_ops *arm64_extio_ops;\n"
+ ">> +\n"
+ ">> +\n"
+ ">> +BUILD_EXTIO(b, u8)\n"
+ ">> +\n"
+ ">> +BUILD_EXTIO(w, u16)\n"
+ ">> +\n"
+ ">> +BUILD_EXTIO(l, u32)\n"
+ ">> --\n"
+ ">> 1.9.1\n"
+ ">>\n"
+ "> \n"
+ "> \n"
+ >
 
-fed89004616937ba8e0d068d584ec9df670c49b178295e735c345268124d4f79
+2af14dcbd5f105f40a6c7caac20fb63d7b38b0332055695a8f7dd06830568c89

diff --git a/a/1.txt b/N3/1.txt
index ecab391..6952097 100644
--- a/a/1.txt
+++ b/N3/1.txt
@@ -1,228 +1,300 @@
-SGnvvIxNaW5nLAoKCk9uIDIwMTYvMTIvMjIgMTY6MTUsIE1pbmcgTGVpIHdyb3RlOgo+IEhpIEd1
-eXMsCj4gCj4gT24gVHVlLCBOb3YgOCwgMjAxNiBhdCAxMTo0NyBBTSwgemhpY2hhbmcueXVhbgo+
-IDx5dWFuemhpY2hhbmdAaGlzaWxpY29uLmNvbT4gd3JvdGU6Cj4+IEZvciBhcm02NCwgdGhlcmUg
-aXMgbm8gSS9PIHNwYWNlIGFzIG90aGVyIGFyY2hpdGVjdHVyYWwgcGxhdGZvcm1zLCBzdWNoIGFz
-Cj4+IFg4Ni4gTW9zdCBJL08gYWNjZXNzZXMgYXJlIGFjaGlldmVkIGJhc2VkIG9uIE1NSU8uIEJ1
-dCBmb3Igc29tZSBhcm02NCBTb0NzLAo+PiBzdWNoIGFzIEhpcDA2LCB3aGVuIGFjY2Vzc2luZyBz
-b21lIGxlZ2FjeSBJU0EgZGV2aWNlcyBjb25uZWN0ZWQgdG8gTFBDLCB0aG9zZQo+PiBrbm93biBw
-b3J0IGFkZHJlc3NlcyBhcmUgdXNlZCB0byBjb250cm9sIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdl
-dCBkZXZpY2VzLCBmb3IKPj4gZXhhbXBsZSwgMHgyZjggaXMgZm9yIFVBUlQsIDB4ZTQgaXMgZm9y
-IGlwbWktYnQuIEl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZQo+PiBub3JtYWwgTU1JTyBtb2RlIGlu
-IHVzaW5nLgo+Pgo+PiBUbyBkcml2ZSB0aGVzZSBkZXZpY2VzLCB0aGlzIHBhdGNoIGludHJvZHVj
-ZXMgYSBtZXRob2QgbmFtZWQgaW5kaXJlY3QtSU8uCj4+IEluIHRoaXMgbWV0aG9kIHRoZSBpbi9v
-dXQgcGFpciBpbiBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lvLmggd2lsbCBiZQo+PiByZWRlZmlu
-ZWQuIFdoZW4gdXBwZXIgbGF5ZXIgZHJpdmVycyBjYWxsIGluL291dCB3aXRoIHRob3NlIGtub3du
-IGxlZ2FjeSBwb3J0Cj4+IGFkZHJlc3NlcyB0byBhY2Nlc3MgdGhlIHBlcmlwaGVyYWxzLCB0aGUg
-aG9va2luZyBmdW5jdGlvbnMgY29ycnJlc3BvbmRpbmcgdG8KPj4gdGhvc2UgdGFyZ2V0IHBlcmlw
-aGVyYWxzIHdpbGwgYmUgY2FsbGVkLiBUaHJvdWdoIHRoaXMgd2F5LCB0aG9zZSB1cHBlciBsYXll
-cgo+PiBkcml2ZXJzIHdoaWNoIGRlcGVuZCBvbiBpbi9vdXQgY2FuIHJ1biBvbiBIaXAwNiB3aXRo
-b3V0IGFueSBjaGFuZ2VzLgo+Pgo+PiBDYzogQ2F0YWxpbiBNYXJpbmFzIDxjYXRhbGluLm1hcmlu
-YXNAYXJtLmNvbT4KPj4gQ2M6IFdpbGwgRGVhY29uIDx3aWxsLmRlYWNvbkBhcm0uY29tPgo+PiBT
-aWduZWQtb2ZmLWJ5OiB6aGljaGFuZy55dWFuIDx5dWFuemhpY2hhbmdAaGlzaWxpY29uLmNvbT4K
-Pj4gU2lnbmVkLW9mZi1ieTogR2FicmllbGUgUGFvbG9uaSA8Z2FicmllbGUucGFvbG9uaUBodWF3
-ZWkuY29tPgo+PiAtLS0KPj4gIGFyY2gvYXJtNjQvS2NvbmZpZyAgICAgICAgICAgICB8ICA2ICsr
-Kwo+PiAgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9leHRpby5oIHwgOTQgKysrKysrKysrKysrKysr
-KysrKysrKysrKysrKysrKysrKysrKysrKysrCj4+ICBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lv
-LmggICAgfCAyOSArKysrKysrKysrKysrCj4+ICBhcmNoL2FybTY0L2tlcm5lbC9NYWtlZmlsZSAg
-ICAgfCAgMSArCj4+ICBhcmNoL2FybTY0L2tlcm5lbC9leHRpby5jICAgICAgfCAyNyArKysrKysr
-KysrKysKPj4gIDUgZmlsZXMgY2hhbmdlZCwgMTU3IGluc2VydGlvbnMoKykKPiAKPiBXaGVuIEkg
-YXBwbGllZCB0aGVzZSB0aHJlZSBwYXRjaGVzIGFnYWluc3QgY3VycmVudCBsaW51cyB0cmVlIGFu
-ZAo+IGVuYWJsZSBDT05GSUdfSElTSUxJQ09OX0xQQywgdGhlIGZvbGxvd2luZyBidWlsZCBmYWls
-dXJlWzFdIGlzCj4gdHJpZ2dlcmVkIHdoZW4gcnVubmluZyAnbWFrZSBtb2R1bGVzJy4KPiAKClRo
-YW5rcyBmb3IgeW91ciByZXBvcnQhCgpUaGlzIHBhdGNoIGhhcyBjb21waWxhdGlvbiBpc3N1ZSBv
-biBzb21lIGFyY2hpdGVjdHVyZXMsIHNvcnJ5IGZvciB0aGUgaW5jb252ZW5pZW5jZSBjYXVzZWQg
-YnkgdGhpcyEKVGhlIG9uZ29pbmcgdjYgd2lsbCBzb2x2ZSB0aGVzZSBpc3N1ZXMuCkkgd2lsbCB0
-cmFjZSB0aGlzIGZhaWx1cmUgYW5kIHByb3ZpZGUgYSBmaXggaWYgeW91IGNhbiBub3Qgd2FpdCBm
-b3IgdGhlIG5leHQgdmVyc2lvbi4KCkNvdWxkIHlvdSBzZW5kIG1lIHlvdXIgLmNvbmZpZyBpbiBw
-cml2YXRlPyBJIGRvbid0IHdhbnQgdG8gYm90aGVyIGFsbCB0aGUgaGFja2VyIGluIHRoZSBtYWls
-LWxpc3QuCgoKVGhhbmtzLApaaGljaGFuZwoKPiAKPiBUaGFua3MsCj4gTWluZwo+IAo+IFsxXSAn
-bWFrZSBtb2R1bGVzJyBmYWlsdXJlIGxvZwo+IAo+ICAgQnVpbGRpbmcgbW9kdWxlcywgc3RhZ2Ug
-Mi4KPiAgIE1PRFBPU1QgMjI2MCBtb2R1bGVzCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3dhdGNo
-ZG9nL3dkdF9wY2kua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dGIiIFtkcml2ZXJzL3dhdGNo
-ZG9nL3dkdF9wY2kua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dGIiIFtkcml2ZXJzL3dhdGNo
-ZG9nL3Bjd2RfcGNpLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3dhdGNo
-ZG9nL3Bjd2RfcGNpLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJvdXR3IiBbZHJpdmVycy92aWRl
-by92Z2FzdGF0ZS5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0YiIgW2RyaXZlcnMvdmlkZW8v
-dmdhc3RhdGUua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogImluYiIgW2RyaXZlcnMvdmlkZW8vdmdh
-c3RhdGUua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dHciIFtkcml2ZXJzL3ZpZGVvL2ZiZGV2
-L3Z0ODYyM2ZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3ZpZGVvL2Zi
-ZGV2L3Z0ODYyM2ZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJvdXRiIiBbZHJpdmVycy92aWRl
-by9mYmRldi92dDg2MjNmYi5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0dyIgW2RyaXZlcnMv
-dmlkZW8vZmJkZXYvdHJpZGVudGZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2
-ZXJzL3ZpZGVvL2ZiZGV2L3RyaWRlbnRmYi5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0YiIg
-W2RyaXZlcnMvdmlkZW8vZmJkZXYvdHJpZGVudGZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJp
-bmIiIFtkcml2ZXJzL3ZpZGVvL2ZiZGV2L3RkZnhmYi5rb10gdW5kZWZpbmVkIQo+IC4uLi4uCj4g
-RVJST1I6ICJpbmIiIFtkcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5rb10gdW5kZWZpbmVkIQo+IEVS
-Uk9SOiAiaW5iIiBbZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5rb10gdW5kZWZpbmVkIQo+IHNjcmlw
-dHMvTWFrZWZpbGUubW9kcG9zdDo5MTogcmVjaXBlIGZvciB0YXJnZXQgJ19fbW9kcG9zdCcgZmFp
-bGVkCj4gbWFrZVsxXTogKioqIFtfX21vZHBvc3RdIEVycm9yIDEKPiBNYWtlZmlsZToxMTk2OiBy
-ZWNpcGUgZm9yIHRhcmdldCAnbW9kdWxlcycgZmFpbGVkCj4gbWFrZTogKioqIFttb2R1bGVzXSBF
-cnJvciAyCj4gCj4gCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9pbmNsdWRlL2Fz
-bS9leHRpby5oCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8u
-Ywo+Pgo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29u
-ZmlnCj4+IGluZGV4IDk2OWVmODguLmI0NDA3MGIgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQv
-S2NvbmZpZwo+PiArKysgYi9hcmNoL2FybTY0L0tjb25maWcKPj4gQEAgLTE2Myw2ICsxNjMsMTIg
-QEAgY29uZmlnIEFSQ0hfTU1BUF9STkRfQ09NUEFUX0JJVFNfTUlOCj4+ICBjb25maWcgQVJDSF9N
-TUFQX1JORF9DT01QQVRfQklUU19NQVgKPj4gICAgICAgICBkZWZhdWx0IDE2Cj4+Cj4+ICtjb25m
-aWcgQVJNNjRfSU5ESVJFQ1RfUElPCj4+ICsgICAgICAgYm9vbCAiYWNjZXNzIHBlcmlwaGVyYWxz
-IHdpdGggbGVnYWN5IEkvTyBwb3J0Igo+PiArICAgICAgIGhlbHAKPj4gKyAgICAgICAgIFN1cHBv
-cnQgc3BlY2lhbCBhY2Nlc3NvcnMgZm9yIElTQSBJL08gZGV2aWNlcy4gVGhpcyBpcyBuZWVkZWQg
-Zm9yCj4+ICsgICAgICAgICBTb0NzIHRoYXQgZG8gbm90IHN1cHBvcnQgc3RhbmRhcmQgcmVhZC93
-cml0ZSBmb3IgdGhlIElTQSByYW5nZS4KPj4gKwo+PiAgY29uZmlnIE5PX0lPUE9SVF9NQVAKPj4g
-ICAgICAgICBkZWZfYm9vbCB5IGlmICFQQ0kKPj4KPj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQv
-aW5jbHVkZS9hc20vZXh0aW8uaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXh0aW8uaAo+PiBu
-ZXcgZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi42YWUwNzg3Cj4+IC0tLSAvZGV2
-L251bGwKPj4gKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9leHRpby5oCj4+IEBAIC0wLDAg
-KzEsOTQgQEAKPj4gKy8qCj4+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSGlzaWxpY29uIExpbWl0
-ZWQsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCj4+ICsgKiBBdXRob3I6IFpoaWNoYW5nIFl1YW4gPHl1
-YW56aGljaGFuZ0BoaXNpbGljb24uY29tPgo+PiArICoKPj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBm
-cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4+ICsg
-KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZl
-cnNpb24gMiBhcwo+PiArICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
-b24uCj4+ICsgKgo+PiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
-IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
-IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+PiArICogTUVSQ0hBTlRBQklM
-SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+PiArICog
-R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KPj4gKyAqCj4+ICsg
-KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs
-aWMgTGljZW5zZQo+PiArICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8
-aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCj4+ICsgKi8KPj4gKwo+PiArI2lmbmRlZiBf
-X0xJTlVYX0VYVElPX0gKPj4gKyNkZWZpbmUgX19MSU5VWF9FWFRJT19ICj4+ICsKPj4gK3N0cnVj
-dCBleHRpb19vcHMgewo+PiArICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQ7LyogaW5jbHVzaXZl
-LCBzeXMgaW8gYWRkciAqLwo+PiArICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kOy8qIGluY2x1c2l2
-ZSwgc3lzIGlvIGFkZHIgKi8KPj4gKwo+PiArICAgICAgIHU2NCAoKnBmaW4pKHZvaWQgKmRldm9i
-aiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsIHNpemVfdCBkbGVuKTsKPj4gKyAgICAgICB2b2lkICgq
-cGZvdXQpKHZvaWQgKmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsIHUzMiBvdXR2YWwsCj4+
-ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGxlbik7Cj4+
-ICsgICAgICAgdTY0ICgqcGZpbnMpKHZvaWQgKmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIs
-IHZvaWQgKmluYnVmLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBk
-bGVuLCB1bnNpZ25lZCBpbnQgY291bnQpOwo+PiArICAgICAgIHZvaWQgKCpwZm91dHMpKHZvaWQg
-KmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsCj4+ICsgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgY29uc3Qgdm9pZCAqb3V0YnVmLCBzaXplX3QgZGxlbiwKPj4gKyAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQpOwo+PiArICAgICAgIHZvaWQg
-KmRldnBhcmE7Cj4+ICt9Owo+PiArCj4+ICtleHRlcm4gc3RydWN0IGV4dGlvX29wcyAqYXJtNjRf
-ZXh0aW9fb3BzOwo+PiArCj4+ICsjZGVmaW5lIERFQ0xBUkVfRVhUSU8oYncsIHR5cGUpICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArZXh0ZXJuIHR5
-cGUgaW4jI2J3KHVuc2lnbmVkIGxvbmcgYWRkcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgIFwKPj4gK2V4dGVybiB2b2lkIG91dCMjYncodHlwZSB2YWx1ZSwgdW5zaWdu
-ZWQgbG9uZyBhZGRyKTsgICAgICAgICAgICAgICAgICAgXAo+PiArZXh0ZXJuIHZvaWQgaW5zIyNi
-dyh1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KTtc
-Cj4+ICtleHRlcm4gdm9pZCBvdXRzIyNidyh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQg
-KmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KTsKPj4gKwo+PiArI2RlZmluZSBCVUlMRF9FWFRJ
-TyhidywgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+
-ICt0eXBlIGluIyNidyh1bnNpZ25lZCBsb25nIGFkZHIpICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAreyAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+ICsgICAgICAg
-aWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9fb3BzLT5zdGFydCA+IGFkZHIgfHwg
-ICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgYXJtNjRfZXh0aW9fb3BzLT5lbmQg
-PCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAgICAgICAgICAgICAgcmV0dXJuIHJl
-YWQjI2J3KFBDSV9JT0JBU0UgKyBhZGRyKTsgICAgICAgICAgICAgICAgICAgICBcCj4+ICsgICAg
-ICAgcmV0dXJuIGFybTY0X2V4dGlvX29wcy0+cGZpbiA/ICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGFybTY0X2V4dGlvX29wcy0+cGZpbihhcm02
-NF9leHRpb19vcHMtPmRldnBhcmEsICAgICAgICAgXAo+PiArICAgICAgICAgICAgICAgICAgICAg
-ICBhZGRyLCBzaXplb2YodHlwZSkpIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICBcCj4+ICt9
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArdm9pZCBvdXQjI2J3KHR5cGUg
-dmFsdWUsIHVuc2lnbmVkIGxvbmcgYWRkcikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+
-ICt7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICBpZiAoIWFybTY0X2V4dGlvX29wcyB8fCBhcm02
-NF9leHRpb19vcHMtPnN0YXJ0ID4gYWRkciB8fCAgICAgICAgXAo+PiArICAgICAgICAgICAgICAg
-ICAgICAgICBhcm02NF9leHRpb19vcHMtPmVuZCA8IGFkZHIpICAgICAgICAgICAgICAgICAgICBc
-Cj4+ICsgICAgICAgICAgICAgICB3cml0ZSMjYncodmFsdWUsIFBDSV9JT0JBU0UgKyBhZGRyKTsg
-ICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArICAgICAgICAgICAg
-ICAgaWYgKGFybTY0X2V4dGlvX29wcy0+cGZvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICBcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgIGFybTY0X2V4dGlvX29wcy0+cGZvdXQoYXJt
-NjRfZXh0aW9fb3BzLT5kZXZwYXJhLFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICBhZGRyLCB2YWx1ZSwgc2l6ZW9mKHR5cGUpKTsgICAgICAgICAgICAgXAo+PiArfSAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICBcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gK3ZvaWQgaW5zIyNidyh1bnNpZ25lZCBsb25n
-IGFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KSAgICAgXAo+PiAreyAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICBcCj4+ICsgICAgICAgaWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9f
-b3BzLT5zdGFydCA+IGFkZHIgfHwgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg
-YXJtNjRfZXh0aW9fb3BzLT5lbmQgPCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAg
-ICAgICAgICAgICAgcmVhZHMjI2J3KFBDSV9JT0JBU0UgKyBhZGRyLCBidWZmZXIsIGNvdW50KTsg
-ICAgICAgICAgICBcCj4+ICsgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGlmIChh
-cm02NF9leHRpb19vcHMtPnBmaW5zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAr
-ICAgICAgICAgICAgICAgICAgICAgICBhcm02NF9leHRpb19vcHMtPnBmaW5zKGFybTY0X2V4dGlv
-X29wcy0+ZGV2cGFyYSxcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciwg
-YnVmZmVyLCBzaXplb2YodHlwZSksIGNvdW50KTsgICAgIFwKPj4gK30gICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+
-PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICBcCj4+ICt2b2lkIG91dHMjI2J3KHVuc2lnbmVkIGxvbmcgYWRkciwg
-Y29uc3Qgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgY291bnQpICAgICAgXAo+PiAreyAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICBcCj4+ICsgICAgICAgaWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9f
-b3BzLT5zdGFydCA+IGFkZHIgfHwgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg
-YXJtNjRfZXh0aW9fb3BzLT5lbmQgPCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAg
-ICAgICAgICAgICAgd3JpdGVzIyNidyhQQ0lfSU9CQVNFICsgYWRkciwgYnVmZmVyLCBjb3VudCk7
-ICAgICAgICAgICBcCj4+ICsgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGlmIChh
-cm02NF9leHRpb19vcHMtPnBmb3V0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAr
-ICAgICAgICAgICAgICAgICAgICAgICBhcm02NF9leHRpb19vcHMtPnBmb3V0cyhhcm02NF9leHRp
-b19vcHMtPmRldnBhcmEsXAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIs
-IGJ1ZmZlciwgc2l6ZW9mKHR5cGUpLCBjb3VudCk7ICAgICBcCj4+ICt9Cj4+ICsKPj4gK3N0YXRp
-YyBpbmxpbmUgdm9pZCBhcm02NF9zZXRfZXh0b3BzKHN0cnVjdCBleHRpb19vcHMgKm9wcykKPj4g
-K3sKPj4gKyAgICAgICBpZiAob3BzKQo+PiArICAgICAgICAgICAgICAgV1JJVEVfT05DRShhcm02
-NF9leHRpb19vcHMsIG9wcyk7Cj4+ICt9Cj4+ICsKPj4gKyNlbmRpZiAvKiBfX0xJTlVYX0VYVElP
-X0gqLwo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9h
-cm02NC9pbmNsdWRlL2FzbS9pby5oCj4+IGluZGV4IDBiYmE0MjcuLjEzNjczNWQgMTAwNjQ0Cj4+
-IC0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW8uaAo+PiArKysgYi9hcmNoL2FybTY0L2lu
-Y2x1ZGUvYXNtL2lvLmgKPj4gQEAgLTMxLDYgKzMxLDcgQEAKPj4gICNpbmNsdWRlIDxhc20vZWFy
-bHlfaW9yZW1hcC5oPgo+PiAgI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS5oPgo+PiAgI2luY2x1
-ZGUgPGFzbS9jcHVmZWF0dXJlLmg+Cj4+ICsjaW5jbHVkZSA8YXNtL2V4dGlvLmg+Cj4+Cj4+ICAj
-aW5jbHVkZSA8eGVuL3hlbi5oPgo+Pgo+PiBAQCAtMTQ5LDYgKzE1MCwzNCBAQCBzdGF0aWMgaW5s
-aW5lIHU2NCBfX3Jhd19yZWFkcShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCj4+
-ICAjZGVmaW5lIElPX1NQQUNFX0xJTUlUICAgICAgICAgKFBDSV9JT19TSVpFIC0gMSkKPj4gICNk
-ZWZpbmUgUENJX0lPQkFTRSAgICAgICAgICAgICAoKHZvaWQgX19pb21lbSAqKVBDSV9JT19TVEFS
-VCkKPj4KPj4gKwo+PiArLyoKPj4gKyAqIHJlZGVmaW5lIHRoZSBpbihzKWIvb3V0KHMpYiBmb3Ig
-aW5kaXJlY3QtSU8uCj4+ICsgKi8KPj4gKyNpZmRlZiBDT05GSUdfQVJNNjRfSU5ESVJFQ1RfUElP
-Cj4+ICsjZGVmaW5lIGluYiBpbmIKPj4gKyNkZWZpbmUgb3V0YiBvdXRiCj4+ICsjZGVmaW5lIGlu
-c2IgaW5zYgo+PiArI2RlZmluZSBvdXRzYiBvdXRzYgo+PiArLyogZXh0ZXJuYWwgZGVjbGFyYXRp
-b24gKi8KPj4gK0RFQ0xBUkVfRVhUSU8oYiwgdTgpCj4+ICsKPj4gKyNkZWZpbmUgaW53IGludwo+
-PiArI2RlZmluZSBvdXR3IG91dHcKPj4gKyNkZWZpbmUgaW5zdyBpbnN3Cj4+ICsjZGVmaW5lIG91
-dHN3IG91dHN3Cj4+ICsKPj4gK0RFQ0xBUkVfRVhUSU8odywgdTE2KQo+PiArCj4+ICsjZGVmaW5l
-IGlubCBpbmwKPj4gKyNkZWZpbmUgb3V0bCBvdXRsCj4+ICsjZGVmaW5lIGluc2wgaW5zbAo+PiAr
-I2RlZmluZSBvdXRzbCBvdXRzbAo+PiArCj4+ICtERUNMQVJFX0VYVElPKGwsIHUzMikKPj4gKyNl
-bmRpZgo+PiArCj4+ICsKPj4gIC8qCj4+ICAgKiBTdHJpbmcgdmVyc2lvbiBvZiBJL08gbWVtb3J5
-IGFjY2VzcyBvcGVyYXRpb25zLgo+PiAgICovCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tl
-cm5lbC9NYWtlZmlsZSBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+IGluZGV4IDdkNjZi
-YmEuLjYwZTA0ODIgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+
-ICsrKyBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+IEBAIC0zMSw2ICszMSw3IEBAIGFy
-bTY0LW9iai0kKENPTkZJR19DT01QQVQpICAgICAgICAgICAgKz0gc3lzMzIubyBrdXNlcjMyLm8g
-c2lnbmFsMzIubyAgICAgICAgIFwKPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgIHN5c19jb21wYXQubyBlbnRyeTMyLm8KPj4gIGFybTY0LW9iai0kKENPTkZJR19G
-VU5DVElPTl9UUkFDRVIpICAgICs9IGZ0cmFjZS5vIGVudHJ5LWZ0cmFjZS5vCj4+ICBhcm02NC1v
-YmotJChDT05GSUdfTU9EVUxFUykgICAgICAgICAgICArPSBhcm02NGtzeW1zLm8gbW9kdWxlLm8K
-Pj4gK2FybTY0LW9iai0kKENPTkZJR19BUk02NF9JTkRJUkVDVF9QSU8pICs9IGV4dGlvLm8KPj4g
-IGFybTY0LW9iai0kKENPTkZJR19BUk02NF9NT0RVTEVfUExUUykgICs9IG1vZHVsZS1wbHRzLm8K
-Pj4gIGFybTY0LW9iai0kKENPTkZJR19QRVJGX0VWRU5UUykgICAgICAgICAgICAgICAgKz0gcGVy
-Zl9yZWdzLm8gcGVyZl9jYWxsY2hhaW4ubwo+PiAgYXJtNjQtb2JqLSQoQ09ORklHX0hXX1BFUkZf
-RVZFTlRTKSAgICAgKz0gcGVyZl9ldmVudC5vCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tl
-cm5lbC9leHRpby5jIGIvYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8uYwo+PiBuZXcgZmlsZSBtb2Rl
-IDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi42NDdiM2ZhCj4+IC0tLSAvZGV2L251bGwKPj4gKysr
-IGIvYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8uYwo+PiBAQCAtMCwwICsxLDI3IEBACj4+ICsvKgo+
-PiArICogQ29weXJpZ2h0IChDKSAyMDE2IEhpc2lsaWNvbiBMaW1pdGVkLCBBbGwgUmlnaHRzIFJl
-c2VydmVkLgo+PiArICogQXV0aG9yOiBaaGljaGFuZyBZdWFuIDx5dWFuemhpY2hhbmdAaGlzaWxp
-Y29uLmNvbT4KPj4gKyAqCj4+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91
-IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+PiArICogaXQgdW5kZXIgdGhlIHRl
-cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKPj4gKyAq
-IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+PiArICoKPj4gKyAq
-IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
-dXNlZnVsLAo+PiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
-IGltcGxpZWQgd2FycmFudHkgb2YKPj4gKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
-UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKPj4gKyAqIEdOVSBHZW5lcmFsIFB1Ymxp
-YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4+ICsgKgo+PiArICogWW91IHNob3VsZCBoYXZl
-IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKPj4gKyAq
-IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9y
-Zy9saWNlbnNlcy8+Lgo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRlIDxsaW51eC9pby5oPgo+PiAr
-Cj4+ICtzdHJ1Y3QgZXh0aW9fb3BzICphcm02NF9leHRpb19vcHM7Cj4+ICsKPj4gKwo+PiArQlVJ
-TERfRVhUSU8oYiwgdTgpCj4+ICsKPj4gK0JVSUxEX0VYVElPKHcsIHUxNikKPj4gKwo+PiArQlVJ
-TERfRVhUSU8obCwgdTMyKQo+PiAtLQo+PiAxLjkuMQo+Pgo+IAo+IAo+IAoKCl9fX19fX19fX19f
-X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFp
-bGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlz
-dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK
+Hi,Ming,
+
+
+On 2016/12/22 16:15, Ming Lei wrote:
+> Hi Guys,
+> 
+> On Tue, Nov 8, 2016 at 11:47 AM, zhichang.yuan
+> <yuanzhichang@hisilicon.com> wrote:
+>> For arm64, there is no I/O space as other architectural platforms, such as
+>> X86. Most I/O accesses are achieved based on MMIO. But for some arm64 SoCs,
+>> such as Hip06, when accessing some legacy ISA devices connected to LPC, those
+>> known port addresses are used to control the corresponding target devices, for
+>> example, 0x2f8 is for UART, 0xe4 is for ipmi-bt. It is different from the
+>> normal MMIO mode in using.
+>>
+>> To drive these devices, this patch introduces a method named indirect-IO.
+>> In this method the in/out pair in arch/arm64/include/asm/io.h will be
+>> redefined. When upper layer drivers call in/out with those known legacy port
+>> addresses to access the peripherals, the hooking functions corrresponding to
+>> those target peripherals will be called. Through this way, those upper layer
+>> drivers which depend on in/out can run on Hip06 without any changes.
+>>
+>> Cc: Catalin Marinas <catalin.marinas@arm.com>
+>> Cc: Will Deacon <will.deacon@arm.com>
+>> Signed-off-by: zhichang.yuan <yuanzhichang@hisilicon.com>
+>> Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>
+>> ---
+>>  arch/arm64/Kconfig             |  6 +++
+>>  arch/arm64/include/asm/extio.h | 94 ++++++++++++++++++++++++++++++++++++++++++
+>>  arch/arm64/include/asm/io.h    | 29 +++++++++++++
+>>  arch/arm64/kernel/Makefile     |  1 +
+>>  arch/arm64/kernel/extio.c      | 27 ++++++++++++
+>>  5 files changed, 157 insertions(+)
+> 
+> When I applied these three patches against current linus tree and
+> enable CONFIG_HISILICON_LPC, the following build failure[1] is
+> triggered when running 'make modules'.
+> 
+
+Thanks for your report!
+
+This patch has compilation issue on some architectures, sorry for the inconvenience caused by this!
+The ongoing v6 will solve these issues.
+I will trace this failure and provide a fix if you can not wait for the next version.
+
+Could you send me your .config in private? I don't want to bother all the hacker in the mail-list.
+
+
+Thanks,
+Zhichang
+
+> 
+> Thanks,
+> Ming
+> 
+> [1] 'make modules' failure log
+> 
+>   Building modules, stage 2.
+>   MODPOST 2260 modules
+> ERROR: "inb" [drivers/watchdog/wdt_pci.ko] undefined!
+> ERROR: "outb" [drivers/watchdog/wdt_pci.ko] undefined!
+> ERROR: "outb" [drivers/watchdog/pcwd_pci.ko] undefined!
+> ERROR: "inb" [drivers/watchdog/pcwd_pci.ko] undefined!
+> ERROR: "outw" [drivers/video/vgastate.ko] undefined!
+> ERROR: "outb" [drivers/video/vgastate.ko] undefined!
+> ERROR: "inb" [drivers/video/vgastate.ko] undefined!
+> ERROR: "outw" [drivers/video/fbdev/vt8623fb.ko] undefined!
+> ERROR: "inb" [drivers/video/fbdev/vt8623fb.ko] undefined!
+> ERROR: "outb" [drivers/video/fbdev/vt8623fb.ko] undefined!
+> ERROR: "outw" [drivers/video/fbdev/tridentfb.ko] undefined!
+> ERROR: "inb" [drivers/video/fbdev/tridentfb.ko] undefined!
+> ERROR: "outb" [drivers/video/fbdev/tridentfb.ko] undefined!
+> ERROR: "inb" [drivers/video/fbdev/tdfxfb.ko] undefined!
+> .....
+> ERROR: "inb" [drivers/ata/pata_cmd64x.ko] undefined!
+> ERROR: "inb" [drivers/ata/pata_artop.ko] undefined!
+> scripts/Makefile.modpost:91: recipe for target '__modpost' failed
+> make[1]: *** [__modpost] Error 1
+> Makefile:1196: recipe for target 'modules' failed
+> make: *** [modules] Error 2
+> 
+> 
+>>  create mode 100644 arch/arm64/include/asm/extio.h
+>>  create mode 100644 arch/arm64/kernel/extio.c
+>>
+>> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
+>> index 969ef88..b44070b 100644
+>> --- a/arch/arm64/Kconfig
+>> +++ b/arch/arm64/Kconfig
+>> @@ -163,6 +163,12 @@ config ARCH_MMAP_RND_COMPAT_BITS_MIN
+>>  config ARCH_MMAP_RND_COMPAT_BITS_MAX
+>>         default 16
+>>
+>> +config ARM64_INDIRECT_PIO
+>> +       bool "access peripherals with legacy I/O port"
+>> +       help
+>> +         Support special accessors for ISA I/O devices. This is needed for
+>> +         SoCs that do not support standard read/write for the ISA range.
+>> +
+>>  config NO_IOPORT_MAP
+>>         def_bool y if !PCI
+>>
+>> diff --git a/arch/arm64/include/asm/extio.h b/arch/arm64/include/asm/extio.h
+>> new file mode 100644
+>> index 0000000..6ae0787
+>> --- /dev/null
+>> +++ b/arch/arm64/include/asm/extio.h
+>> @@ -0,0 +1,94 @@
+>> +/*
+>> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved.
+>> + * Author: Zhichang Yuan <yuanzhichang@hisilicon.com>
+>> + *
+>> + * This program is free software; you can redistribute it and/or modify
+>> + * it under the terms of the GNU General Public License version 2 as
+>> + * published by the Free Software Foundation.
+>> + *
+>> + * 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.
+>> + *
+>> + * You should have received a copy of the GNU General Public License
+>> + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+>> + */
+>> +
+>> +#ifndef __LINUX_EXTIO_H
+>> +#define __LINUX_EXTIO_H
+>> +
+>> +struct extio_ops {
+>> +       unsigned long start;/* inclusive, sys io addr */
+>> +       unsigned long end;/* inclusive, sys io addr */
+>> +
+>> +       u64 (*pfin)(void *devobj, unsigned long ptaddr, size_t dlen);
+>> +       void (*pfout)(void *devobj, unsigned long ptaddr, u32 outval,
+>> +                                       size_t dlen);
+>> +       u64 (*pfins)(void *devobj, unsigned long ptaddr, void *inbuf,
+>> +                               size_t dlen, unsigned int count);
+>> +       void (*pfouts)(void *devobj, unsigned long ptaddr,
+>> +                               const void *outbuf, size_t dlen,
+>> +                               unsigned int count);
+>> +       void *devpara;
+>> +};
+>> +
+>> +extern struct extio_ops *arm64_extio_ops;
+>> +
+>> +#define DECLARE_EXTIO(bw, type)                                                \
+>> +extern type in##bw(unsigned long addr);                                        \
+>> +extern void out##bw(type value, unsigned long addr);                   \
+>> +extern void ins##bw(unsigned long addr, void *buffer, unsigned int count);\
+>> +extern void outs##bw(unsigned long addr, const void *buffer, unsigned int count);
+>> +
+>> +#define BUILD_EXTIO(bw, type)                                          \
+>> +type in##bw(unsigned long addr)                                                \
+>> +{                                                                      \
+>> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \
+>> +                       arm64_extio_ops->end < addr)                    \
+>> +               return read##bw(PCI_IOBASE + addr);                     \
+>> +       return arm64_extio_ops->pfin ?                                  \
+>> +               arm64_extio_ops->pfin(arm64_extio_ops->devpara,         \
+>> +                       addr, sizeof(type)) : -1;                       \
+>> +}                                                                      \
+>> +                                                                       \
+>> +void out##bw(type value, unsigned long addr)                           \
+>> +{                                                                      \
+>> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \
+>> +                       arm64_extio_ops->end < addr)                    \
+>> +               write##bw(value, PCI_IOBASE + addr);                    \
+>> +       else                                                            \
+>> +               if (arm64_extio_ops->pfout)                             \
+>> +                       arm64_extio_ops->pfout(arm64_extio_ops->devpara,\
+>> +                               addr, value, sizeof(type));             \
+>> +}                                                                      \
+>> +                                                                       \
+>> +void ins##bw(unsigned long addr, void *buffer, unsigned int count)     \
+>> +{                                                                      \
+>> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \
+>> +                       arm64_extio_ops->end < addr)                    \
+>> +               reads##bw(PCI_IOBASE + addr, buffer, count);            \
+>> +       else                                                            \
+>> +               if (arm64_extio_ops->pfins)                             \
+>> +                       arm64_extio_ops->pfins(arm64_extio_ops->devpara,\
+>> +                               addr, buffer, sizeof(type), count);     \
+>> +}                                                                      \
+>> +                                                                       \
+>> +void outs##bw(unsigned long addr, const void *buffer, unsigned int count)      \
+>> +{                                                                      \
+>> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \
+>> +                       arm64_extio_ops->end < addr)                    \
+>> +               writes##bw(PCI_IOBASE + addr, buffer, count);           \
+>> +       else                                                            \
+>> +               if (arm64_extio_ops->pfouts)                            \
+>> +                       arm64_extio_ops->pfouts(arm64_extio_ops->devpara,\
+>> +                               addr, buffer, sizeof(type), count);     \
+>> +}
+>> +
+>> +static inline void arm64_set_extops(struct extio_ops *ops)
+>> +{
+>> +       if (ops)
+>> +               WRITE_ONCE(arm64_extio_ops, ops);
+>> +}
+>> +
+>> +#endif /* __LINUX_EXTIO_H*/
+>> diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h
+>> index 0bba427..136735d 100644
+>> --- a/arch/arm64/include/asm/io.h
+>> +++ b/arch/arm64/include/asm/io.h
+>> @@ -31,6 +31,7 @@
+>>  #include <asm/early_ioremap.h>
+>>  #include <asm/alternative.h>
+>>  #include <asm/cpufeature.h>
+>> +#include <asm/extio.h>
+>>
+>>  #include <xen/xen.h>
+>>
+>> @@ -149,6 +150,34 @@ static inline u64 __raw_readq(const volatile void __iomem *addr)
+>>  #define IO_SPACE_LIMIT         (PCI_IO_SIZE - 1)
+>>  #define PCI_IOBASE             ((void __iomem *)PCI_IO_START)
+>>
+>> +
+>> +/*
+>> + * redefine the in(s)b/out(s)b for indirect-IO.
+>> + */
+>> +#ifdef CONFIG_ARM64_INDIRECT_PIO
+>> +#define inb inb
+>> +#define outb outb
+>> +#define insb insb
+>> +#define outsb outsb
+>> +/* external declaration */
+>> +DECLARE_EXTIO(b, u8)
+>> +
+>> +#define inw inw
+>> +#define outw outw
+>> +#define insw insw
+>> +#define outsw outsw
+>> +
+>> +DECLARE_EXTIO(w, u16)
+>> +
+>> +#define inl inl
+>> +#define outl outl
+>> +#define insl insl
+>> +#define outsl outsl
+>> +
+>> +DECLARE_EXTIO(l, u32)
+>> +#endif
+>> +
+>> +
+>>  /*
+>>   * String version of I/O memory access operations.
+>>   */
+>> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
+>> index 7d66bba..60e0482 100644
+>> --- a/arch/arm64/kernel/Makefile
+>> +++ b/arch/arm64/kernel/Makefile
+>> @@ -31,6 +31,7 @@ arm64-obj-$(CONFIG_COMPAT)            += sys32.o kuser32.o signal32.o         \
+>>                                            sys_compat.o entry32.o
+>>  arm64-obj-$(CONFIG_FUNCTION_TRACER)    += ftrace.o entry-ftrace.o
+>>  arm64-obj-$(CONFIG_MODULES)            += arm64ksyms.o module.o
+>> +arm64-obj-$(CONFIG_ARM64_INDIRECT_PIO) += extio.o
+>>  arm64-obj-$(CONFIG_ARM64_MODULE_PLTS)  += module-plts.o
+>>  arm64-obj-$(CONFIG_PERF_EVENTS)                += perf_regs.o perf_callchain.o
+>>  arm64-obj-$(CONFIG_HW_PERF_EVENTS)     += perf_event.o
+>> diff --git a/arch/arm64/kernel/extio.c b/arch/arm64/kernel/extio.c
+>> new file mode 100644
+>> index 0000000..647b3fa
+>> --- /dev/null
+>> +++ b/arch/arm64/kernel/extio.c
+>> @@ -0,0 +1,27 @@
+>> +/*
+>> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved.
+>> + * Author: Zhichang Yuan <yuanzhichang@hisilicon.com>
+>> + *
+>> + * This program is free software; you can redistribute it and/or modify
+>> + * it under the terms of the GNU General Public License version 2 as
+>> + * published by the Free Software Foundation.
+>> + *
+>> + * 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.
+>> + *
+>> + * You should have received a copy of the GNU General Public License
+>> + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+>> + */
+>> +
+>> +#include <linux/io.h>
+>> +
+>> +struct extio_ops *arm64_extio_ops;
+>> +
+>> +
+>> +BUILD_EXTIO(b, u8)
+>> +
+>> +BUILD_EXTIO(w, u16)
+>> +
+>> +BUILD_EXTIO(l, u32)
+>> --
+>> 1.9.1
+>>
+> 
+> 
+>
diff --git a/a/content_digest b/N3/content_digest
index d3eaabc..ba09669 100644
--- a/a/content_digest
+++ b/N3/content_digest
@@ -5,258 +5,330 @@
  "Subject\0Re: [PATCH V5 1/3] ARM64 LPC: Indirect ISA port IO introduced\0"
  "Date\0Fri, 23 Dec 2016 09:43:55 +0800\0"
  "To\0Ming Lei <tom.leiming@gmail.com>\0"
- "Cc\0Mark Rutland <mark.rutland@arm.com>"
-  gabriele.paoloni@huawei.com
-  Benjamin Herrenschmidt <benh@kernel.crashing.org>
+ "Cc\0Catalin Marinas <catalin.marinas@arm.com>"
   Will Deacon <will.deacon@arm.com>
-  linuxarm@huawei.com
-  Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
-  Arnd Bergmann <arnd@arndb.de>
-  xuwei5@hisilicon.com
-  linux-serial@vger.kernel.org
-  Catalin Marinas <catalin.marinas@arm.com>
-  devicetree@vger.kernel.org <devicetree@vger.kernel.org>
-  minyard@acm.org
-  Liviu Dudau <liviu.dudau@arm.com>
-  john.garry@huawei.com
-  zourongrong@gmail.com
   Rob Herring <robh+dt@kernel.org>
   Bjorn Helgaas <bhelgaas@google.com>
-  kantyzc@163.com
-  zhichang.yuan02@gmail.com
+  Mark Rutland <mark.rutland@arm.com>
+  Olof Johansson <olof@lixom.net>
+  Arnd Bergmann <arnd@arndb.de>
   linux-arm-kernel <linux-arm-kernel@lists.infradead.org>
-  linux-pci@vger.kernel.org <linux-pci@vger.kernel.org>
+  Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
   Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
- " Olof Johansson <olof@lixom.net>\0"
+  <linuxarm@huawei.com>
+  devicetree@vger.kernel.org <devicetree@vger.kernel.org>
+  linux-pci@vger.kernel.org <linux-pci@vger.kernel.org>
+  <linux-serial@vger.kernel.org>
+  <minyard@acm.org>
+  Benjamin Herrenschmidt <benh@kernel.crashing.org>
+  Liviu Dudau <liviu.dudau@arm.com>
+  <zourongrong@gmail.com>
+  <john.garry@huawei.com>
+  <gabriele.paoloni@huawei.com>
+  <zhichang.yuan02@gmail.com>
+  <kantyzc@163.com>
+ " <xuwei5@hisilicon.com>\0"
  "\00:1\0"
  "b\0"
- "SGnvvIxNaW5nLAoKCk9uIDIwMTYvMTIvMjIgMTY6MTUsIE1pbmcgTGVpIHdyb3RlOgo+IEhpIEd1\n"
- "eXMsCj4gCj4gT24gVHVlLCBOb3YgOCwgMjAxNiBhdCAxMTo0NyBBTSwgemhpY2hhbmcueXVhbgo+\n"
- "IDx5dWFuemhpY2hhbmdAaGlzaWxpY29uLmNvbT4gd3JvdGU6Cj4+IEZvciBhcm02NCwgdGhlcmUg\n"
- "aXMgbm8gSS9PIHNwYWNlIGFzIG90aGVyIGFyY2hpdGVjdHVyYWwgcGxhdGZvcm1zLCBzdWNoIGFz\n"
- "Cj4+IFg4Ni4gTW9zdCBJL08gYWNjZXNzZXMgYXJlIGFjaGlldmVkIGJhc2VkIG9uIE1NSU8uIEJ1\n"
- "dCBmb3Igc29tZSBhcm02NCBTb0NzLAo+PiBzdWNoIGFzIEhpcDA2LCB3aGVuIGFjY2Vzc2luZyBz\n"
- "b21lIGxlZ2FjeSBJU0EgZGV2aWNlcyBjb25uZWN0ZWQgdG8gTFBDLCB0aG9zZQo+PiBrbm93biBw\n"
- "b3J0IGFkZHJlc3NlcyBhcmUgdXNlZCB0byBjb250cm9sIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdl\n"
- "dCBkZXZpY2VzLCBmb3IKPj4gZXhhbXBsZSwgMHgyZjggaXMgZm9yIFVBUlQsIDB4ZTQgaXMgZm9y\n"
- "IGlwbWktYnQuIEl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZQo+PiBub3JtYWwgTU1JTyBtb2RlIGlu\n"
- "IHVzaW5nLgo+Pgo+PiBUbyBkcml2ZSB0aGVzZSBkZXZpY2VzLCB0aGlzIHBhdGNoIGludHJvZHVj\n"
- "ZXMgYSBtZXRob2QgbmFtZWQgaW5kaXJlY3QtSU8uCj4+IEluIHRoaXMgbWV0aG9kIHRoZSBpbi9v\n"
- "dXQgcGFpciBpbiBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lvLmggd2lsbCBiZQo+PiByZWRlZmlu\n"
- "ZWQuIFdoZW4gdXBwZXIgbGF5ZXIgZHJpdmVycyBjYWxsIGluL291dCB3aXRoIHRob3NlIGtub3du\n"
- "IGxlZ2FjeSBwb3J0Cj4+IGFkZHJlc3NlcyB0byBhY2Nlc3MgdGhlIHBlcmlwaGVyYWxzLCB0aGUg\n"
- "aG9va2luZyBmdW5jdGlvbnMgY29ycnJlc3BvbmRpbmcgdG8KPj4gdGhvc2UgdGFyZ2V0IHBlcmlw\n"
- "aGVyYWxzIHdpbGwgYmUgY2FsbGVkLiBUaHJvdWdoIHRoaXMgd2F5LCB0aG9zZSB1cHBlciBsYXll\n"
- "cgo+PiBkcml2ZXJzIHdoaWNoIGRlcGVuZCBvbiBpbi9vdXQgY2FuIHJ1biBvbiBIaXAwNiB3aXRo\n"
- "b3V0IGFueSBjaGFuZ2VzLgo+Pgo+PiBDYzogQ2F0YWxpbiBNYXJpbmFzIDxjYXRhbGluLm1hcmlu\n"
- "YXNAYXJtLmNvbT4KPj4gQ2M6IFdpbGwgRGVhY29uIDx3aWxsLmRlYWNvbkBhcm0uY29tPgo+PiBT\n"
- "aWduZWQtb2ZmLWJ5OiB6aGljaGFuZy55dWFuIDx5dWFuemhpY2hhbmdAaGlzaWxpY29uLmNvbT4K\n"
- "Pj4gU2lnbmVkLW9mZi1ieTogR2FicmllbGUgUGFvbG9uaSA8Z2FicmllbGUucGFvbG9uaUBodWF3\n"
- "ZWkuY29tPgo+PiAtLS0KPj4gIGFyY2gvYXJtNjQvS2NvbmZpZyAgICAgICAgICAgICB8ICA2ICsr\n"
- "Kwo+PiAgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9leHRpby5oIHwgOTQgKysrKysrKysrKysrKysr\n"
- "KysrKysrKysrKysrKysrKysrKysrKysrKysrCj4+ICBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lv\n"
- "LmggICAgfCAyOSArKysrKysrKysrKysrCj4+ICBhcmNoL2FybTY0L2tlcm5lbC9NYWtlZmlsZSAg\n"
- "ICAgfCAgMSArCj4+ICBhcmNoL2FybTY0L2tlcm5lbC9leHRpby5jICAgICAgfCAyNyArKysrKysr\n"
- "KysrKysKPj4gIDUgZmlsZXMgY2hhbmdlZCwgMTU3IGluc2VydGlvbnMoKykKPiAKPiBXaGVuIEkg\n"
- "YXBwbGllZCB0aGVzZSB0aHJlZSBwYXRjaGVzIGFnYWluc3QgY3VycmVudCBsaW51cyB0cmVlIGFu\n"
- "ZAo+IGVuYWJsZSBDT05GSUdfSElTSUxJQ09OX0xQQywgdGhlIGZvbGxvd2luZyBidWlsZCBmYWls\n"
- "dXJlWzFdIGlzCj4gdHJpZ2dlcmVkIHdoZW4gcnVubmluZyAnbWFrZSBtb2R1bGVzJy4KPiAKClRo\n"
- "YW5rcyBmb3IgeW91ciByZXBvcnQhCgpUaGlzIHBhdGNoIGhhcyBjb21waWxhdGlvbiBpc3N1ZSBv\n"
- "biBzb21lIGFyY2hpdGVjdHVyZXMsIHNvcnJ5IGZvciB0aGUgaW5jb252ZW5pZW5jZSBjYXVzZWQg\n"
- "YnkgdGhpcyEKVGhlIG9uZ29pbmcgdjYgd2lsbCBzb2x2ZSB0aGVzZSBpc3N1ZXMuCkkgd2lsbCB0\n"
- "cmFjZSB0aGlzIGZhaWx1cmUgYW5kIHByb3ZpZGUgYSBmaXggaWYgeW91IGNhbiBub3Qgd2FpdCBm\n"
- "b3IgdGhlIG5leHQgdmVyc2lvbi4KCkNvdWxkIHlvdSBzZW5kIG1lIHlvdXIgLmNvbmZpZyBpbiBw\n"
- "cml2YXRlPyBJIGRvbid0IHdhbnQgdG8gYm90aGVyIGFsbCB0aGUgaGFja2VyIGluIHRoZSBtYWls\n"
- "LWxpc3QuCgoKVGhhbmtzLApaaGljaGFuZwoKPiAKPiBUaGFua3MsCj4gTWluZwo+IAo+IFsxXSAn\n"
- "bWFrZSBtb2R1bGVzJyBmYWlsdXJlIGxvZwo+IAo+ICAgQnVpbGRpbmcgbW9kdWxlcywgc3RhZ2Ug\n"
- "Mi4KPiAgIE1PRFBPU1QgMjI2MCBtb2R1bGVzCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3dhdGNo\n"
- "ZG9nL3dkdF9wY2kua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dGIiIFtkcml2ZXJzL3dhdGNo\n"
- "ZG9nL3dkdF9wY2kua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dGIiIFtkcml2ZXJzL3dhdGNo\n"
- "ZG9nL3Bjd2RfcGNpLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3dhdGNo\n"
- "ZG9nL3Bjd2RfcGNpLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJvdXR3IiBbZHJpdmVycy92aWRl\n"
- "by92Z2FzdGF0ZS5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0YiIgW2RyaXZlcnMvdmlkZW8v\n"
- "dmdhc3RhdGUua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogImluYiIgW2RyaXZlcnMvdmlkZW8vdmdh\n"
- "c3RhdGUua29dIHVuZGVmaW5lZCEKPiBFUlJPUjogIm91dHciIFtkcml2ZXJzL3ZpZGVvL2ZiZGV2\n"
- "L3Z0ODYyM2ZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2ZXJzL3ZpZGVvL2Zi\n"
- "ZGV2L3Z0ODYyM2ZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJvdXRiIiBbZHJpdmVycy92aWRl\n"
- "by9mYmRldi92dDg2MjNmYi5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0dyIgW2RyaXZlcnMv\n"
- "dmlkZW8vZmJkZXYvdHJpZGVudGZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJpbmIiIFtkcml2\n"
- "ZXJzL3ZpZGVvL2ZiZGV2L3RyaWRlbnRmYi5rb10gdW5kZWZpbmVkIQo+IEVSUk9SOiAib3V0YiIg\n"
- "W2RyaXZlcnMvdmlkZW8vZmJkZXYvdHJpZGVudGZiLmtvXSB1bmRlZmluZWQhCj4gRVJST1I6ICJp\n"
- "bmIiIFtkcml2ZXJzL3ZpZGVvL2ZiZGV2L3RkZnhmYi5rb10gdW5kZWZpbmVkIQo+IC4uLi4uCj4g\n"
- "RVJST1I6ICJpbmIiIFtkcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5rb10gdW5kZWZpbmVkIQo+IEVS\n"
- "Uk9SOiAiaW5iIiBbZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5rb10gdW5kZWZpbmVkIQo+IHNjcmlw\n"
- "dHMvTWFrZWZpbGUubW9kcG9zdDo5MTogcmVjaXBlIGZvciB0YXJnZXQgJ19fbW9kcG9zdCcgZmFp\n"
- "bGVkCj4gbWFrZVsxXTogKioqIFtfX21vZHBvc3RdIEVycm9yIDEKPiBNYWtlZmlsZToxMTk2OiBy\n"
- "ZWNpcGUgZm9yIHRhcmdldCAnbW9kdWxlcycgZmFpbGVkCj4gbWFrZTogKioqIFttb2R1bGVzXSBF\n"
- "cnJvciAyCj4gCj4gCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9pbmNsdWRlL2Fz\n"
- "bS9leHRpby5oCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8u\n"
- "Ywo+Pgo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29u\n"
- "ZmlnCj4+IGluZGV4IDk2OWVmODguLmI0NDA3MGIgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQv\n"
- "S2NvbmZpZwo+PiArKysgYi9hcmNoL2FybTY0L0tjb25maWcKPj4gQEAgLTE2Myw2ICsxNjMsMTIg\n"
- "QEAgY29uZmlnIEFSQ0hfTU1BUF9STkRfQ09NUEFUX0JJVFNfTUlOCj4+ICBjb25maWcgQVJDSF9N\n"
- "TUFQX1JORF9DT01QQVRfQklUU19NQVgKPj4gICAgICAgICBkZWZhdWx0IDE2Cj4+Cj4+ICtjb25m\n"
- "aWcgQVJNNjRfSU5ESVJFQ1RfUElPCj4+ICsgICAgICAgYm9vbCAiYWNjZXNzIHBlcmlwaGVyYWxz\n"
- "IHdpdGggbGVnYWN5IEkvTyBwb3J0Igo+PiArICAgICAgIGhlbHAKPj4gKyAgICAgICAgIFN1cHBv\n"
- "cnQgc3BlY2lhbCBhY2Nlc3NvcnMgZm9yIElTQSBJL08gZGV2aWNlcy4gVGhpcyBpcyBuZWVkZWQg\n"
- "Zm9yCj4+ICsgICAgICAgICBTb0NzIHRoYXQgZG8gbm90IHN1cHBvcnQgc3RhbmRhcmQgcmVhZC93\n"
- "cml0ZSBmb3IgdGhlIElTQSByYW5nZS4KPj4gKwo+PiAgY29uZmlnIE5PX0lPUE9SVF9NQVAKPj4g\n"
- "ICAgICAgICBkZWZfYm9vbCB5IGlmICFQQ0kKPj4KPj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQv\n"
- "aW5jbHVkZS9hc20vZXh0aW8uaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXh0aW8uaAo+PiBu\n"
- "ZXcgZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi42YWUwNzg3Cj4+IC0tLSAvZGV2\n"
- "L251bGwKPj4gKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9leHRpby5oCj4+IEBAIC0wLDAg\n"
- "KzEsOTQgQEAKPj4gKy8qCj4+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSGlzaWxpY29uIExpbWl0\n"
- "ZWQsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCj4+ICsgKiBBdXRob3I6IFpoaWNoYW5nIFl1YW4gPHl1\n"
- "YW56aGljaGFuZ0BoaXNpbGljb24uY29tPgo+PiArICoKPj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBm\n"
- "cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4+ICsg\n"
- "KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZl\n"
- "cnNpb24gMiBhcwo+PiArICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp\n"
- "b24uCj4+ICsgKgo+PiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl\n"
- "IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7\n"
- "IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+PiArICogTUVSQ0hBTlRBQklM\n"
- "SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+PiArICog\n"
- "R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KPj4gKyAqCj4+ICsg\n"
- "KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs\n"
- "aWMgTGljZW5zZQo+PiArICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8\n"
- "aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCj4+ICsgKi8KPj4gKwo+PiArI2lmbmRlZiBf\n"
- "X0xJTlVYX0VYVElPX0gKPj4gKyNkZWZpbmUgX19MSU5VWF9FWFRJT19ICj4+ICsKPj4gK3N0cnVj\n"
- "dCBleHRpb19vcHMgewo+PiArICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQ7LyogaW5jbHVzaXZl\n"
- "LCBzeXMgaW8gYWRkciAqLwo+PiArICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kOy8qIGluY2x1c2l2\n"
- "ZSwgc3lzIGlvIGFkZHIgKi8KPj4gKwo+PiArICAgICAgIHU2NCAoKnBmaW4pKHZvaWQgKmRldm9i\n"
- "aiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsIHNpemVfdCBkbGVuKTsKPj4gKyAgICAgICB2b2lkICgq\n"
- "cGZvdXQpKHZvaWQgKmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsIHUzMiBvdXR2YWwsCj4+\n"
- "ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGxlbik7Cj4+\n"
- "ICsgICAgICAgdTY0ICgqcGZpbnMpKHZvaWQgKmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIs\n"
- "IHZvaWQgKmluYnVmLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBk\n"
- "bGVuLCB1bnNpZ25lZCBpbnQgY291bnQpOwo+PiArICAgICAgIHZvaWQgKCpwZm91dHMpKHZvaWQg\n"
- "KmRldm9iaiwgdW5zaWduZWQgbG9uZyBwdGFkZHIsCj4+ICsgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgY29uc3Qgdm9pZCAqb3V0YnVmLCBzaXplX3QgZGxlbiwKPj4gKyAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQpOwo+PiArICAgICAgIHZvaWQg\n"
- "KmRldnBhcmE7Cj4+ICt9Owo+PiArCj4+ICtleHRlcm4gc3RydWN0IGV4dGlvX29wcyAqYXJtNjRf\n"
- "ZXh0aW9fb3BzOwo+PiArCj4+ICsjZGVmaW5lIERFQ0xBUkVfRVhUSU8oYncsIHR5cGUpICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArZXh0ZXJuIHR5\n"
- "cGUgaW4jI2J3KHVuc2lnbmVkIGxvbmcgYWRkcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgIFwKPj4gK2V4dGVybiB2b2lkIG91dCMjYncodHlwZSB2YWx1ZSwgdW5zaWdu\n"
- "ZWQgbG9uZyBhZGRyKTsgICAgICAgICAgICAgICAgICAgXAo+PiArZXh0ZXJuIHZvaWQgaW5zIyNi\n"
- "dyh1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KTtc\n"
- "Cj4+ICtleHRlcm4gdm9pZCBvdXRzIyNidyh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQg\n"
- "KmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KTsKPj4gKwo+PiArI2RlZmluZSBCVUlMRF9FWFRJ\n"
- "TyhidywgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+\n"
- "ICt0eXBlIGluIyNidyh1bnNpZ25lZCBsb25nIGFkZHIpICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAreyAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+ICsgICAgICAg\n"
- "aWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9fb3BzLT5zdGFydCA+IGFkZHIgfHwg\n"
- "ICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgYXJtNjRfZXh0aW9fb3BzLT5lbmQg\n"
- "PCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAgICAgICAgICAgICAgcmV0dXJuIHJl\n"
- "YWQjI2J3KFBDSV9JT0JBU0UgKyBhZGRyKTsgICAgICAgICAgICAgICAgICAgICBcCj4+ICsgICAg\n"
- "ICAgcmV0dXJuIGFybTY0X2V4dGlvX29wcy0+cGZpbiA/ICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGFybTY0X2V4dGlvX29wcy0+cGZpbihhcm02\n"
- "NF9leHRpb19vcHMtPmRldnBhcmEsICAgICAgICAgXAo+PiArICAgICAgICAgICAgICAgICAgICAg\n"
- "ICBhZGRyLCBzaXplb2YodHlwZSkpIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICBcCj4+ICt9\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArdm9pZCBvdXQjI2J3KHR5cGUg\n"
- "dmFsdWUsIHVuc2lnbmVkIGxvbmcgYWRkcikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+\n"
- "ICt7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICBpZiAoIWFybTY0X2V4dGlvX29wcyB8fCBhcm02\n"
- "NF9leHRpb19vcHMtPnN0YXJ0ID4gYWRkciB8fCAgICAgICAgXAo+PiArICAgICAgICAgICAgICAg\n"
- "ICAgICAgICBhcm02NF9leHRpb19vcHMtPmVuZCA8IGFkZHIpICAgICAgICAgICAgICAgICAgICBc\n"
- "Cj4+ICsgICAgICAgICAgICAgICB3cml0ZSMjYncodmFsdWUsIFBDSV9JT0JBU0UgKyBhZGRyKTsg\n"
- "ICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiArICAgICAgICAgICAg\n"
- "ICAgaWYgKGFybTY0X2V4dGlvX29wcy0+cGZvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICBcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgIGFybTY0X2V4dGlvX29wcy0+cGZvdXQoYXJt\n"
- "NjRfZXh0aW9fb3BzLT5kZXZwYXJhLFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICBhZGRyLCB2YWx1ZSwgc2l6ZW9mKHR5cGUpKTsgICAgICAgICAgICAgXAo+PiArfSAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICBcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gK3ZvaWQgaW5zIyNidyh1bnNpZ25lZCBsb25n\n"
- "IGFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KSAgICAgXAo+PiAreyAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICBcCj4+ICsgICAgICAgaWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9f\n"
- "b3BzLT5zdGFydCA+IGFkZHIgfHwgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg\n"
- "YXJtNjRfZXh0aW9fb3BzLT5lbmQgPCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAg\n"
- "ICAgICAgICAgICAgcmVhZHMjI2J3KFBDSV9JT0JBU0UgKyBhZGRyLCBidWZmZXIsIGNvdW50KTsg\n"
- "ICAgICAgICAgICBcCj4+ICsgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGlmIChh\n"
- "cm02NF9leHRpb19vcHMtPnBmaW5zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAr\n"
- "ICAgICAgICAgICAgICAgICAgICAgICBhcm02NF9leHRpb19vcHMtPnBmaW5zKGFybTY0X2V4dGlv\n"
- "X29wcy0+ZGV2cGFyYSxcCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciwg\n"
- "YnVmZmVyLCBzaXplb2YodHlwZSksIGNvdW50KTsgICAgIFwKPj4gK30gICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+\n"
- "PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICBcCj4+ICt2b2lkIG91dHMjI2J3KHVuc2lnbmVkIGxvbmcgYWRkciwg\n"
- "Y29uc3Qgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgY291bnQpICAgICAgXAo+PiAreyAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICBcCj4+ICsgICAgICAgaWYgKCFhcm02NF9leHRpb19vcHMgfHwgYXJtNjRfZXh0aW9f\n"
- "b3BzLT5zdGFydCA+IGFkZHIgfHwgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAg\n"
- "YXJtNjRfZXh0aW9fb3BzLT5lbmQgPCBhZGRyKSAgICAgICAgICAgICAgICAgICAgXAo+PiArICAg\n"
- "ICAgICAgICAgICAgd3JpdGVzIyNidyhQQ0lfSU9CQVNFICsgYWRkciwgYnVmZmVyLCBjb3VudCk7\n"
- "ICAgICAgICAgICBcCj4+ICsgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4gKyAgICAgICAgICAgICAgIGlmIChh\n"
- "cm02NF9leHRpb19vcHMtPnBmb3V0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+PiAr\n"
- "ICAgICAgICAgICAgICAgICAgICAgICBhcm02NF9leHRpb19vcHMtPnBmb3V0cyhhcm02NF9leHRp\n"
- "b19vcHMtPmRldnBhcmEsXAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIs\n"
- "IGJ1ZmZlciwgc2l6ZW9mKHR5cGUpLCBjb3VudCk7ICAgICBcCj4+ICt9Cj4+ICsKPj4gK3N0YXRp\n"
- "YyBpbmxpbmUgdm9pZCBhcm02NF9zZXRfZXh0b3BzKHN0cnVjdCBleHRpb19vcHMgKm9wcykKPj4g\n"
- "K3sKPj4gKyAgICAgICBpZiAob3BzKQo+PiArICAgICAgICAgICAgICAgV1JJVEVfT05DRShhcm02\n"
- "NF9leHRpb19vcHMsIG9wcyk7Cj4+ICt9Cj4+ICsKPj4gKyNlbmRpZiAvKiBfX0xJTlVYX0VYVElP\n"
- "X0gqLwo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9h\n"
- "cm02NC9pbmNsdWRlL2FzbS9pby5oCj4+IGluZGV4IDBiYmE0MjcuLjEzNjczNWQgMTAwNjQ0Cj4+\n"
- "IC0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW8uaAo+PiArKysgYi9hcmNoL2FybTY0L2lu\n"
- "Y2x1ZGUvYXNtL2lvLmgKPj4gQEAgLTMxLDYgKzMxLDcgQEAKPj4gICNpbmNsdWRlIDxhc20vZWFy\n"
- "bHlfaW9yZW1hcC5oPgo+PiAgI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS5oPgo+PiAgI2luY2x1\n"
- "ZGUgPGFzbS9jcHVmZWF0dXJlLmg+Cj4+ICsjaW5jbHVkZSA8YXNtL2V4dGlvLmg+Cj4+Cj4+ICAj\n"
- "aW5jbHVkZSA8eGVuL3hlbi5oPgo+Pgo+PiBAQCAtMTQ5LDYgKzE1MCwzNCBAQCBzdGF0aWMgaW5s\n"
- "aW5lIHU2NCBfX3Jhd19yZWFkcShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCj4+\n"
- "ICAjZGVmaW5lIElPX1NQQUNFX0xJTUlUICAgICAgICAgKFBDSV9JT19TSVpFIC0gMSkKPj4gICNk\n"
- "ZWZpbmUgUENJX0lPQkFTRSAgICAgICAgICAgICAoKHZvaWQgX19pb21lbSAqKVBDSV9JT19TVEFS\n"
- "VCkKPj4KPj4gKwo+PiArLyoKPj4gKyAqIHJlZGVmaW5lIHRoZSBpbihzKWIvb3V0KHMpYiBmb3Ig\n"
- "aW5kaXJlY3QtSU8uCj4+ICsgKi8KPj4gKyNpZmRlZiBDT05GSUdfQVJNNjRfSU5ESVJFQ1RfUElP\n"
- "Cj4+ICsjZGVmaW5lIGluYiBpbmIKPj4gKyNkZWZpbmUgb3V0YiBvdXRiCj4+ICsjZGVmaW5lIGlu\n"
- "c2IgaW5zYgo+PiArI2RlZmluZSBvdXRzYiBvdXRzYgo+PiArLyogZXh0ZXJuYWwgZGVjbGFyYXRp\n"
- "b24gKi8KPj4gK0RFQ0xBUkVfRVhUSU8oYiwgdTgpCj4+ICsKPj4gKyNkZWZpbmUgaW53IGludwo+\n"
- "PiArI2RlZmluZSBvdXR3IG91dHcKPj4gKyNkZWZpbmUgaW5zdyBpbnN3Cj4+ICsjZGVmaW5lIG91\n"
- "dHN3IG91dHN3Cj4+ICsKPj4gK0RFQ0xBUkVfRVhUSU8odywgdTE2KQo+PiArCj4+ICsjZGVmaW5l\n"
- "IGlubCBpbmwKPj4gKyNkZWZpbmUgb3V0bCBvdXRsCj4+ICsjZGVmaW5lIGluc2wgaW5zbAo+PiAr\n"
- "I2RlZmluZSBvdXRzbCBvdXRzbAo+PiArCj4+ICtERUNMQVJFX0VYVElPKGwsIHUzMikKPj4gKyNl\n"
- "bmRpZgo+PiArCj4+ICsKPj4gIC8qCj4+ICAgKiBTdHJpbmcgdmVyc2lvbiBvZiBJL08gbWVtb3J5\n"
- "IGFjY2VzcyBvcGVyYXRpb25zLgo+PiAgICovCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tl\n"
- "cm5lbC9NYWtlZmlsZSBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+IGluZGV4IDdkNjZi\n"
- "YmEuLjYwZTA0ODIgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+\n"
- "ICsrKyBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCj4+IEBAIC0zMSw2ICszMSw3IEBAIGFy\n"
- "bTY0LW9iai0kKENPTkZJR19DT01QQVQpICAgICAgICAgICAgKz0gc3lzMzIubyBrdXNlcjMyLm8g\n"
- "c2lnbmFsMzIubyAgICAgICAgIFwKPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgIHN5c19jb21wYXQubyBlbnRyeTMyLm8KPj4gIGFybTY0LW9iai0kKENPTkZJR19G\n"
- "VU5DVElPTl9UUkFDRVIpICAgICs9IGZ0cmFjZS5vIGVudHJ5LWZ0cmFjZS5vCj4+ICBhcm02NC1v\n"
- "YmotJChDT05GSUdfTU9EVUxFUykgICAgICAgICAgICArPSBhcm02NGtzeW1zLm8gbW9kdWxlLm8K\n"
- "Pj4gK2FybTY0LW9iai0kKENPTkZJR19BUk02NF9JTkRJUkVDVF9QSU8pICs9IGV4dGlvLm8KPj4g\n"
- "IGFybTY0LW9iai0kKENPTkZJR19BUk02NF9NT0RVTEVfUExUUykgICs9IG1vZHVsZS1wbHRzLm8K\n"
- "Pj4gIGFybTY0LW9iai0kKENPTkZJR19QRVJGX0VWRU5UUykgICAgICAgICAgICAgICAgKz0gcGVy\n"
- "Zl9yZWdzLm8gcGVyZl9jYWxsY2hhaW4ubwo+PiAgYXJtNjQtb2JqLSQoQ09ORklHX0hXX1BFUkZf\n"
- "RVZFTlRTKSAgICAgKz0gcGVyZl9ldmVudC5vCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tl\n"
- "cm5lbC9leHRpby5jIGIvYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8uYwo+PiBuZXcgZmlsZSBtb2Rl\n"
- "IDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi42NDdiM2ZhCj4+IC0tLSAvZGV2L251bGwKPj4gKysr\n"
- "IGIvYXJjaC9hcm02NC9rZXJuZWwvZXh0aW8uYwo+PiBAQCAtMCwwICsxLDI3IEBACj4+ICsvKgo+\n"
- "PiArICogQ29weXJpZ2h0IChDKSAyMDE2IEhpc2lsaWNvbiBMaW1pdGVkLCBBbGwgUmlnaHRzIFJl\n"
- "c2VydmVkLgo+PiArICogQXV0aG9yOiBaaGljaGFuZyBZdWFuIDx5dWFuemhpY2hhbmdAaGlzaWxp\n"
- "Y29uLmNvbT4KPj4gKyAqCj4+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91\n"
- "IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+PiArICogaXQgdW5kZXIgdGhlIHRl\n"
- "cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKPj4gKyAq\n"
- "IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+PiArICoKPj4gKyAq\n"
- "IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg\n"
- "dXNlZnVsLAo+PiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl\n"
- "IGltcGxpZWQgd2FycmFudHkgb2YKPj4gKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP\n"
- "UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKPj4gKyAqIEdOVSBHZW5lcmFsIFB1Ymxp\n"
- "YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4+ICsgKgo+PiArICogWW91IHNob3VsZCBoYXZl\n"
- "IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKPj4gKyAq\n"
- "IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9y\n"
- "Zy9saWNlbnNlcy8+Lgo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRlIDxsaW51eC9pby5oPgo+PiAr\n"
- "Cj4+ICtzdHJ1Y3QgZXh0aW9fb3BzICphcm02NF9leHRpb19vcHM7Cj4+ICsKPj4gKwo+PiArQlVJ\n"
- "TERfRVhUSU8oYiwgdTgpCj4+ICsKPj4gK0JVSUxEX0VYVElPKHcsIHUxNikKPj4gKwo+PiArQlVJ\n"
- "TERfRVhUSU8obCwgdTMyKQo+PiAtLQo+PiAxLjkuMQo+Pgo+IAo+IAo+IAoKCl9fX19fX19fX19f\n"
- "X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFp\n"
- "bGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlz\n"
- dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK
+ "Hi\357\274\214Ming,\n"
+ "\n"
+ "\n"
+ "On 2016/12/22 16:15, Ming Lei wrote:\n"
+ "> Hi Guys,\n"
+ "> \n"
+ "> On Tue, Nov 8, 2016 at 11:47 AM, zhichang.yuan\n"
+ "> <yuanzhichang@hisilicon.com> wrote:\n"
+ ">> For arm64, there is no I/O space as other architectural platforms, such as\n"
+ ">> X86. Most I/O accesses are achieved based on MMIO. But for some arm64 SoCs,\n"
+ ">> such as Hip06, when accessing some legacy ISA devices connected to LPC, those\n"
+ ">> known port addresses are used to control the corresponding target devices, for\n"
+ ">> example, 0x2f8 is for UART, 0xe4 is for ipmi-bt. It is different from the\n"
+ ">> normal MMIO mode in using.\n"
+ ">>\n"
+ ">> To drive these devices, this patch introduces a method named indirect-IO.\n"
+ ">> In this method the in/out pair in arch/arm64/include/asm/io.h will be\n"
+ ">> redefined. When upper layer drivers call in/out with those known legacy port\n"
+ ">> addresses to access the peripherals, the hooking functions corrresponding to\n"
+ ">> those target peripherals will be called. Through this way, those upper layer\n"
+ ">> drivers which depend on in/out can run on Hip06 without any changes.\n"
+ ">>\n"
+ ">> Cc: Catalin Marinas <catalin.marinas@arm.com>\n"
+ ">> Cc: Will Deacon <will.deacon@arm.com>\n"
+ ">> Signed-off-by: zhichang.yuan <yuanzhichang@hisilicon.com>\n"
+ ">> Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>\n"
+ ">> ---\n"
+ ">>  arch/arm64/Kconfig             |  6 +++\n"
+ ">>  arch/arm64/include/asm/extio.h | 94 ++++++++++++++++++++++++++++++++++++++++++\n"
+ ">>  arch/arm64/include/asm/io.h    | 29 +++++++++++++\n"
+ ">>  arch/arm64/kernel/Makefile     |  1 +\n"
+ ">>  arch/arm64/kernel/extio.c      | 27 ++++++++++++\n"
+ ">>  5 files changed, 157 insertions(+)\n"
+ "> \n"
+ "> When I applied these three patches against current linus tree and\n"
+ "> enable CONFIG_HISILICON_LPC, the following build failure[1] is\n"
+ "> triggered when running 'make modules'.\n"
+ "> \n"
+ "\n"
+ "Thanks for your report!\n"
+ "\n"
+ "This patch has compilation issue on some architectures, sorry for the inconvenience caused by this!\n"
+ "The ongoing v6 will solve these issues.\n"
+ "I will trace this failure and provide a fix if you can not wait for the next version.\n"
+ "\n"
+ "Could you send me your .config in private? I don't want to bother all the hacker in the mail-list.\n"
+ "\n"
+ "\n"
+ "Thanks,\n"
+ "Zhichang\n"
+ "\n"
+ "> \n"
+ "> Thanks,\n"
+ "> Ming\n"
+ "> \n"
+ "> [1] 'make modules' failure log\n"
+ "> \n"
+ ">   Building modules, stage 2.\n"
+ ">   MODPOST 2260 modules\n"
+ "> ERROR: \"inb\" [drivers/watchdog/wdt_pci.ko] undefined!\n"
+ "> ERROR: \"outb\" [drivers/watchdog/wdt_pci.ko] undefined!\n"
+ "> ERROR: \"outb\" [drivers/watchdog/pcwd_pci.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/watchdog/pcwd_pci.ko] undefined!\n"
+ "> ERROR: \"outw\" [drivers/video/vgastate.ko] undefined!\n"
+ "> ERROR: \"outb\" [drivers/video/vgastate.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/video/vgastate.ko] undefined!\n"
+ "> ERROR: \"outw\" [drivers/video/fbdev/vt8623fb.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/video/fbdev/vt8623fb.ko] undefined!\n"
+ "> ERROR: \"outb\" [drivers/video/fbdev/vt8623fb.ko] undefined!\n"
+ "> ERROR: \"outw\" [drivers/video/fbdev/tridentfb.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/video/fbdev/tridentfb.ko] undefined!\n"
+ "> ERROR: \"outb\" [drivers/video/fbdev/tridentfb.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/video/fbdev/tdfxfb.ko] undefined!\n"
+ "> .....\n"
+ "> ERROR: \"inb\" [drivers/ata/pata_cmd64x.ko] undefined!\n"
+ "> ERROR: \"inb\" [drivers/ata/pata_artop.ko] undefined!\n"
+ "> scripts/Makefile.modpost:91: recipe for target '__modpost' failed\n"
+ "> make[1]: *** [__modpost] Error 1\n"
+ "> Makefile:1196: recipe for target 'modules' failed\n"
+ "> make: *** [modules] Error 2\n"
+ "> \n"
+ "> \n"
+ ">>  create mode 100644 arch/arm64/include/asm/extio.h\n"
+ ">>  create mode 100644 arch/arm64/kernel/extio.c\n"
+ ">>\n"
+ ">> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig\n"
+ ">> index 969ef88..b44070b 100644\n"
+ ">> --- a/arch/arm64/Kconfig\n"
+ ">> +++ b/arch/arm64/Kconfig\n"
+ ">> @@ -163,6 +163,12 @@ config ARCH_MMAP_RND_COMPAT_BITS_MIN\n"
+ ">>  config ARCH_MMAP_RND_COMPAT_BITS_MAX\n"
+ ">>         default 16\n"
+ ">>\n"
+ ">> +config ARM64_INDIRECT_PIO\n"
+ ">> +       bool \"access peripherals with legacy I/O port\"\n"
+ ">> +       help\n"
+ ">> +         Support special accessors for ISA I/O devices. This is needed for\n"
+ ">> +         SoCs that do not support standard read/write for the ISA range.\n"
+ ">> +\n"
+ ">>  config NO_IOPORT_MAP\n"
+ ">>         def_bool y if !PCI\n"
+ ">>\n"
+ ">> diff --git a/arch/arm64/include/asm/extio.h b/arch/arm64/include/asm/extio.h\n"
+ ">> new file mode 100644\n"
+ ">> index 0000000..6ae0787\n"
+ ">> --- /dev/null\n"
+ ">> +++ b/arch/arm64/include/asm/extio.h\n"
+ ">> @@ -0,0 +1,94 @@\n"
+ ">> +/*\n"
+ ">> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved.\n"
+ ">> + * Author: Zhichang Yuan <yuanzhichang@hisilicon.com>\n"
+ ">> + *\n"
+ ">> + * This program is free software; you can redistribute it and/or modify\n"
+ ">> + * it under the terms of the GNU General Public License version 2 as\n"
+ ">> + * published by the Free Software Foundation.\n"
+ ">> + *\n"
+ ">> + * This program is distributed in the hope that it will be useful,\n"
+ ">> + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ ">> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+ ">> + * GNU General Public License for more details.\n"
+ ">> + *\n"
+ ">> + * You should have received a copy of the GNU General Public License\n"
+ ">> + * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
+ ">> + */\n"
+ ">> +\n"
+ ">> +#ifndef __LINUX_EXTIO_H\n"
+ ">> +#define __LINUX_EXTIO_H\n"
+ ">> +\n"
+ ">> +struct extio_ops {\n"
+ ">> +       unsigned long start;/* inclusive, sys io addr */\n"
+ ">> +       unsigned long end;/* inclusive, sys io addr */\n"
+ ">> +\n"
+ ">> +       u64 (*pfin)(void *devobj, unsigned long ptaddr, size_t dlen);\n"
+ ">> +       void (*pfout)(void *devobj, unsigned long ptaddr, u32 outval,\n"
+ ">> +                                       size_t dlen);\n"
+ ">> +       u64 (*pfins)(void *devobj, unsigned long ptaddr, void *inbuf,\n"
+ ">> +                               size_t dlen, unsigned int count);\n"
+ ">> +       void (*pfouts)(void *devobj, unsigned long ptaddr,\n"
+ ">> +                               const void *outbuf, size_t dlen,\n"
+ ">> +                               unsigned int count);\n"
+ ">> +       void *devpara;\n"
+ ">> +};\n"
+ ">> +\n"
+ ">> +extern struct extio_ops *arm64_extio_ops;\n"
+ ">> +\n"
+ ">> +#define DECLARE_EXTIO(bw, type)                                                \\\n"
+ ">> +extern type in##bw(unsigned long addr);                                        \\\n"
+ ">> +extern void out##bw(type value, unsigned long addr);                   \\\n"
+ ">> +extern void ins##bw(unsigned long addr, void *buffer, unsigned int count);\\\n"
+ ">> +extern void outs##bw(unsigned long addr, const void *buffer, unsigned int count);\n"
+ ">> +\n"
+ ">> +#define BUILD_EXTIO(bw, type)                                          \\\n"
+ ">> +type in##bw(unsigned long addr)                                                \\\n"
+ ">> +{                                                                      \\\n"
+ ">> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \\\n"
+ ">> +                       arm64_extio_ops->end < addr)                    \\\n"
+ ">> +               return read##bw(PCI_IOBASE + addr);                     \\\n"
+ ">> +       return arm64_extio_ops->pfin ?                                  \\\n"
+ ">> +               arm64_extio_ops->pfin(arm64_extio_ops->devpara,         \\\n"
+ ">> +                       addr, sizeof(type)) : -1;                       \\\n"
+ ">> +}                                                                      \\\n"
+ ">> +                                                                       \\\n"
+ ">> +void out##bw(type value, unsigned long addr)                           \\\n"
+ ">> +{                                                                      \\\n"
+ ">> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \\\n"
+ ">> +                       arm64_extio_ops->end < addr)                    \\\n"
+ ">> +               write##bw(value, PCI_IOBASE + addr);                    \\\n"
+ ">> +       else                                                            \\\n"
+ ">> +               if (arm64_extio_ops->pfout)                             \\\n"
+ ">> +                       arm64_extio_ops->pfout(arm64_extio_ops->devpara,\\\n"
+ ">> +                               addr, value, sizeof(type));             \\\n"
+ ">> +}                                                                      \\\n"
+ ">> +                                                                       \\\n"
+ ">> +void ins##bw(unsigned long addr, void *buffer, unsigned int count)     \\\n"
+ ">> +{                                                                      \\\n"
+ ">> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \\\n"
+ ">> +                       arm64_extio_ops->end < addr)                    \\\n"
+ ">> +               reads##bw(PCI_IOBASE + addr, buffer, count);            \\\n"
+ ">> +       else                                                            \\\n"
+ ">> +               if (arm64_extio_ops->pfins)                             \\\n"
+ ">> +                       arm64_extio_ops->pfins(arm64_extio_ops->devpara,\\\n"
+ ">> +                               addr, buffer, sizeof(type), count);     \\\n"
+ ">> +}                                                                      \\\n"
+ ">> +                                                                       \\\n"
+ ">> +void outs##bw(unsigned long addr, const void *buffer, unsigned int count)      \\\n"
+ ">> +{                                                                      \\\n"
+ ">> +       if (!arm64_extio_ops || arm64_extio_ops->start > addr ||        \\\n"
+ ">> +                       arm64_extio_ops->end < addr)                    \\\n"
+ ">> +               writes##bw(PCI_IOBASE + addr, buffer, count);           \\\n"
+ ">> +       else                                                            \\\n"
+ ">> +               if (arm64_extio_ops->pfouts)                            \\\n"
+ ">> +                       arm64_extio_ops->pfouts(arm64_extio_ops->devpara,\\\n"
+ ">> +                               addr, buffer, sizeof(type), count);     \\\n"
+ ">> +}\n"
+ ">> +\n"
+ ">> +static inline void arm64_set_extops(struct extio_ops *ops)\n"
+ ">> +{\n"
+ ">> +       if (ops)\n"
+ ">> +               WRITE_ONCE(arm64_extio_ops, ops);\n"
+ ">> +}\n"
+ ">> +\n"
+ ">> +#endif /* __LINUX_EXTIO_H*/\n"
+ ">> diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h\n"
+ ">> index 0bba427..136735d 100644\n"
+ ">> --- a/arch/arm64/include/asm/io.h\n"
+ ">> +++ b/arch/arm64/include/asm/io.h\n"
+ ">> @@ -31,6 +31,7 @@\n"
+ ">>  #include <asm/early_ioremap.h>\n"
+ ">>  #include <asm/alternative.h>\n"
+ ">>  #include <asm/cpufeature.h>\n"
+ ">> +#include <asm/extio.h>\n"
+ ">>\n"
+ ">>  #include <xen/xen.h>\n"
+ ">>\n"
+ ">> @@ -149,6 +150,34 @@ static inline u64 __raw_readq(const volatile void __iomem *addr)\n"
+ ">>  #define IO_SPACE_LIMIT         (PCI_IO_SIZE - 1)\n"
+ ">>  #define PCI_IOBASE             ((void __iomem *)PCI_IO_START)\n"
+ ">>\n"
+ ">> +\n"
+ ">> +/*\n"
+ ">> + * redefine the in(s)b/out(s)b for indirect-IO.\n"
+ ">> + */\n"
+ ">> +#ifdef CONFIG_ARM64_INDIRECT_PIO\n"
+ ">> +#define inb inb\n"
+ ">> +#define outb outb\n"
+ ">> +#define insb insb\n"
+ ">> +#define outsb outsb\n"
+ ">> +/* external declaration */\n"
+ ">> +DECLARE_EXTIO(b, u8)\n"
+ ">> +\n"
+ ">> +#define inw inw\n"
+ ">> +#define outw outw\n"
+ ">> +#define insw insw\n"
+ ">> +#define outsw outsw\n"
+ ">> +\n"
+ ">> +DECLARE_EXTIO(w, u16)\n"
+ ">> +\n"
+ ">> +#define inl inl\n"
+ ">> +#define outl outl\n"
+ ">> +#define insl insl\n"
+ ">> +#define outsl outsl\n"
+ ">> +\n"
+ ">> +DECLARE_EXTIO(l, u32)\n"
+ ">> +#endif\n"
+ ">> +\n"
+ ">> +\n"
+ ">>  /*\n"
+ ">>   * String version of I/O memory access operations.\n"
+ ">>   */\n"
+ ">> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile\n"
+ ">> index 7d66bba..60e0482 100644\n"
+ ">> --- a/arch/arm64/kernel/Makefile\n"
+ ">> +++ b/arch/arm64/kernel/Makefile\n"
+ ">> @@ -31,6 +31,7 @@ arm64-obj-$(CONFIG_COMPAT)            += sys32.o kuser32.o signal32.o         \\\n"
+ ">>                                            sys_compat.o entry32.o\n"
+ ">>  arm64-obj-$(CONFIG_FUNCTION_TRACER)    += ftrace.o entry-ftrace.o\n"
+ ">>  arm64-obj-$(CONFIG_MODULES)            += arm64ksyms.o module.o\n"
+ ">> +arm64-obj-$(CONFIG_ARM64_INDIRECT_PIO) += extio.o\n"
+ ">>  arm64-obj-$(CONFIG_ARM64_MODULE_PLTS)  += module-plts.o\n"
+ ">>  arm64-obj-$(CONFIG_PERF_EVENTS)                += perf_regs.o perf_callchain.o\n"
+ ">>  arm64-obj-$(CONFIG_HW_PERF_EVENTS)     += perf_event.o\n"
+ ">> diff --git a/arch/arm64/kernel/extio.c b/arch/arm64/kernel/extio.c\n"
+ ">> new file mode 100644\n"
+ ">> index 0000000..647b3fa\n"
+ ">> --- /dev/null\n"
+ ">> +++ b/arch/arm64/kernel/extio.c\n"
+ ">> @@ -0,0 +1,27 @@\n"
+ ">> +/*\n"
+ ">> + * Copyright (C) 2016 Hisilicon Limited, All Rights Reserved.\n"
+ ">> + * Author: Zhichang Yuan <yuanzhichang@hisilicon.com>\n"
+ ">> + *\n"
+ ">> + * This program is free software; you can redistribute it and/or modify\n"
+ ">> + * it under the terms of the GNU General Public License version 2 as\n"
+ ">> + * published by the Free Software Foundation.\n"
+ ">> + *\n"
+ ">> + * This program is distributed in the hope that it will be useful,\n"
+ ">> + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ ">> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+ ">> + * GNU General Public License for more details.\n"
+ ">> + *\n"
+ ">> + * You should have received a copy of the GNU General Public License\n"
+ ">> + * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
+ ">> + */\n"
+ ">> +\n"
+ ">> +#include <linux/io.h>\n"
+ ">> +\n"
+ ">> +struct extio_ops *arm64_extio_ops;\n"
+ ">> +\n"
+ ">> +\n"
+ ">> +BUILD_EXTIO(b, u8)\n"
+ ">> +\n"
+ ">> +BUILD_EXTIO(w, u16)\n"
+ ">> +\n"
+ ">> +BUILD_EXTIO(l, u32)\n"
+ ">> --\n"
+ ">> 1.9.1\n"
+ ">>\n"
+ "> \n"
+ "> \n"
+ >
 
-fed89004616937ba8e0d068d584ec9df670c49b178295e735c345268124d4f79
+147cbe1b0ba3eafaa8e79863266fdcea4aad584a4375b76e7624cb8d1cd37378

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.