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.