diff for duplicates of <20170608103956.GB8644@red-moon> diff --git a/a/1.txt b/N1/1.txt index 85675fc..8f92ab9 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -1,166 +1,235 @@ -T24gVHVlLCBKdW4gMDYsIDIwMTcgYXQgMDk6NDQ6MTVBTSAtMDcwMCwgS2h1b25nIERpbmggd3Jv -dGU6Cj4gSGkgTG9yZW56bywKPiAKPiBPbiBUdWUsIE1heSA5LCAyMDE3IGF0IDM6NTUgUE0sIEto -dW9uZyBEaW5oIDxrZGluaEBhcG0uY29tPiB3cm90ZToKPiA+IEhpIExvcmVuem8sCj4gPgo+ID4g -T24gRnJpLCBNYXkgNSwgMjAxNyBhdCA5OjUxIEFNLCBMb3JlbnpvIFBpZXJhbGlzaQo+ID4gPGxv -cmVuem8ucGllcmFsaXNpQGFybS5jb20+IHdyb3RlOgo+ID4+IE9uIFRodSwgTWF5IDA0LCAyMDE3 -IGF0IDA1OjM2OjA2UE0gLTA3MDAsIEtodW9uZyBEaW5oIHdyb3RlOgo+ID4+PiBIaSBNYXJjLAo+ -ID4+PiBUaGVyZSdzIG5vIGV4cGxpY2l0IGRlcGVuZGVuY3kgYmV0d2VlbiBwY2llIGRyaXZlciBh -bmQgbXNpCj4gPj4+IGNvbnRyb2xsZXIuICBUaGUgY3VycmVudCBzb2x1dGlvbiB0aGF0IHdlIGRp -ZCBpcyByZWx5aW5nIG9uIHRoZQo+ID4+PiBub2RlIG9yZGVyaW5nIGluIEJJT1MuICBBQ1BJIDUu -MCBpbnRyb2R1Y2VkIF9ERVAgbWV0aG9kIHRvIGFzc2lnbiBhCj4gPj4+IGhpZ2hlciBwcmlvcml0 -eSBpbiBzdGFydCBvcmRlcmluZy4gIFRoaXMgbWV0aG9kIGNvdWxkIGJlIGFwcGxpZWQgaW4KPiA+ -Pj4gY2FzZSBvZiBtc2kgYW5kIHBjaWUgYXJlIHRoZSBzYW1lIGxldmVsIG9mIHN1YnN5c19pbml0 -IChpbiBBQ1BJCj4gPj4+IGJvb3QpLiAgSG93ZXZlciwgUENJZSBkcml2ZXIgaGFzIG5vdCBzdXBw -b3J0ZWQgZm9yIHRoaXMgZGVwZW5kZW5jeQo+ID4+PiBjaGVjayB5ZXQuICBIb3cgZG8geW91IHRo -aW5rIGFib3V0IHRoaXMgc29sdXRpb24uCj4gPj4KPiA+PiBGaXJzdCBvZmYsIHlvdSBjYW4ndCBw -b3N0IGVtYWlscyB3aXRoIGNvbmZpZGVudGlhbGl0eSBub3RpY2VzIG9uCj4gPj4gbWFpbGluZyBs -aXN0cyBzbyByZW1vdmUgaXQgZnJvbSBub3cgb253YXJkcy4KPiA+Cj4gPiBGaXhlZAo+ID4KPiA+ -PiBTZWNvbmRseSwgSSBjb21tZW50ZWQgb24gdGhpcyBiZWZvcmUsIHNvIHlvdSBrbm93IHdoYXQg -bXkgb3BpbmlvbiBpcy4KPiA+Cj4gPiBJIGdvdCB5b3VyIG9waW5pb24uIEknbGwgaW1wbGVtZW50 -IGFzIHlvdXIgc3VnZ2VzdGlvbi4KPiA+Cj4gCj4gICBSZWdhcmRpbmcgdG8geW91ciBwcmV2aW91 -cyBzdWdnZXN0aW9uIHRvIGFkZCBhIGhvb2sgd2Fsa2luZyB0aGUgQUNQSQo+ICAgbmFtZXNwYWNl -IGJlZm9yZSBhY3BpX2J1c19zY2FuKCkgaW4gYWNwaV9zY2FuX2luaXQoKSB0byBtYWtlIE1TSQo+ -ICAgY29udHJvbGxlcnMgbXVzdCBiZSBwcm9iZWQgYmVmb3JlIFBDSS4gIEkgaGF2ZSBhIGNvbmNl -cm4gdGhhdCB0aGUKPiAgIE1TSSBuYW1lc3BhY2Ug4oCcIF9TQi5NU0lY4oCdIGlzIG5vdCBhIHVu -aXF1ZSBuYW1lIGFuZCBob3cgY2FuIHdlIHdhbGsKPiAgIHRoZSBBQ1BJIG5hbWVzcGFjZSBhbmQg -dXNlIHRoaXMgbmFtZSB0byBtYWtlIE1TSSBwcm9iZWQgYmVmb3JlIFBDSS4KPiAgIE1heSB5b3Ug -aGF2ZSBsaXR0bGUgYml0IG1vcmUgaW5mb3JtYXRpb24gZm9yIHRoaXMgb3IgZG8geW91IGhhdmUK -PiAgIGFub3RoZXIgc3VnZ2VzdGlvbiBmb3IgdGhpcz8KPiAKPiAgICBUaGVyZeKAmXMgYW5vdGhl -ciBzb2x1dGlvbiB3aGljaCBtYWtlcyB0aGlzIHNpbXBsZXIgYW5kIEnigJlkIGxpa2UgdG8KPiAg -ICBhc2sgeW91ciBvcGluaW9uIGFib3V0IHRoaXMuCj4gICAgVGhlIHNvbHV0aW9uIGlzIHRvIG1h -a2UgYW4gaGllcmFyY2h5IGJldHdlZW4gTVNJIGFuZCBQQ0kgbm9kZXMgIGFzIGJlbG93Ogo+IERl -dmljZShcX1NCLk1TSVgpIHsKPiAgICBEZXZpY2UoXF9TQi5QQ0kwKQo+ICAgIERldmljZShcX1NC -LlBDSTEpCj4gICAg4oCm4oCmCj4gfQo+ICAgSW4gb3RoZXIgd29yZCwgTVNJWCBub2RlIGlzIGEg -cGFyZW50IG5vZGUgb2YgUENJIG5vZGVzIGluIEFDUEkKPiAgIHRhYmxlLiAgSW4gdGhpcyBzZW5z -ZSwgdGhlcmXigJlzIGFuIGV4cGxpY2l0IGRlcGVuZGVuY3kgYmV0d2VlbiBNU0kKPiAgIGFuZCBQ -Q0ksIE1TSSBjb250cm9sbGVyIG11c3QgYmUgcHJvYmVkIGJlZm9yZSBQQ0kgYW5kIGl0IHdpbGwK -PiAgIGd1YXJhbnRlZSBub3QgYnJlYWtpbmcgbmV4dCBrZXJuZWwgcmVsZWFzZXMuICBIb3cgZG8g -eW91IHRoaW5rIGFib3V0Cj4gICB0aGlzIHNvbHV0aW9uLgoKSSB0aGluayB0aGF0J3MgYSBwbGFz -dGVyIGFzIGluZWZmZWN0aXZlIGFzIHJlb3JkZXJpbmcgbm9kZXMsIGluIHNob3J0Cml0IGlzIG5v -dCBhIHNvbHV0aW9uIGFuZCB5b3Ugc3RpbGwgcmVseSBvbiBrZXJuZWwgbGluayBvcmRlcmluZywg -eW91CmNhbiBmaWRkbGUgd2l0aCBBQ1BJIHRhYmxlcyBhcyBtdWNoIGFzIHlvdSB3YW50IGJ1dCB0 -aGF0IGRvZXMgbm90IGNoYW5nZS4KCj4gIEkgYWxzbyB0cmllZCB0byB1c2UgX0RFUCBtZXRob2Qg -dG8gZGVzY3JpYmUgdGhlIGRlcGVuZGVuY3kgb2YgUENJZQo+ICBub2RlcywgYnV0IGl0IGxvb2tz -IHRoYXQgaXQgZG9lcyBub3Qgd29yayBhcyBQQ0kgYW5kIE1TSSBhcmUgaGFuZGVkCj4gIGJ5IGFj -cGlfYnVzX3NjYW4gYW5kIHN0aWxsIGhhdmluZyBpc3N1ZSB3aGVuIHdlIHJlLXByb2JlIFBDSS4K -ClRoYXQncyBhIHRhZCB2YWd1ZSB0byBiZSBmcmFuaywgYW55d2F5IGl0IGlzIHByZXR0eSBjbGVh -ciB0byBtZSB0aGF0IHdlCmhhdmUgaGl0IGEgd2FsbC4gSW4gQUNQSSB0aGVyZSBpcyBubyB3YXkg -dG8gZGVzY3JpYmUgcHJvYmUgZGVwZW5kZW5jaWVzCmxpa2UgdGhlIG9uZSB5b3UgaGF2ZSwgaXQg -aXMgYXMgc2ltcGxlIGFzIHRoYXQsIGFuZCB0aGlzIE1TSSBpc3N1ZSB5b3UKYXJlIGZhY2luZyBp -cyBqdXN0IGFuIGV4YW1wbGUsIHRoZXJlIGFyZSBtb3JlIGVnOgoKaHR0cHM6Ly93d3cuc3Bpbmlj -cy5uZXQvbGlzdHMvYXJtLWtlcm5lbC9tc2c1ODU4MjUuaHRtbAoKQXQgdGhlIGVuZCBvZiB0aGUg -ZGF5IHRoZSBjaG9pY2UgaXMgc2ltcGxlIGVpdGhlciB3ZSBhY2NlcHQgKGFuZCB3ZQptYWludGFp -biBiZWNhdXNlIHRoYXQncyB0aGUgcHJvYmxlbSkgdGhlc2UgaGFja3MgLSBhbmQgSSBhbSBub3Qg -d2lsbGluZwp0byBkbyB0aGF0IC0gb3Igd2UgZmluZCBhIHdheSB0byBzb2x2ZSB0aGlzIGZyb20g -YSBnZW5lcmFsIHBlcnNwZWN0aXZlIG5vdAphcyBhIHBvaW50IGhhY2suCgpJIGNhbiBoYXZlIGEg -bG9vayBhdCBzb2x2aW5nIHRoZSB3aG9sZSBpc3N1ZSBidXQgaXQgd29uJ3QgaGFwcGVuCnRvbW9y -cm93LgoKVGhhbmtzLApMb3JlbnpvCgo+IFRoYW5rcywKPiBLaHVvbmcgRGluaAo+IAo+ID4+IEZp -bmFsbHksIHBsZWFzZSBleGVjdXRlIHRoaXMgY29tbWFuZCBvbiB0aGUgdm1saW51eCB0aGF0ICJ3 -b3JrcyIKPiA+PiBmb3IgeW91Ogo+ID4+Cj4gPj4gbm0gdm1saW51eCB8IGdyZXAgLUUgJ19faW5p -dGNhbGxfKHhnZW5lX3BjaWVfbXNpX2luaXR8YWNwaV9pbml0KScKPiA+Cj4gPiAkIG5tIHZtbGlu -dXggfCBncmVwIC1FICdfX2luaXRjYWxsXyh4Z2VuZV9wY2llX21zaV9pbml0fGFjcGlfaW5pdCkn -Cj4gPiBmZmZmMDAwMDA4ZGFiMmQ4IHQgX19pbml0Y2FsbF9hY3BpX2luaXQ0Cj4gPiBmZmZmMDAw -MDA4ZGFiMmM4IHQgX19pbml0Y2FsbF94Z2VuZV9wY2llX21zaV9pbml0NAo+ID4KPiA+IEJlc3Qg -cmVnYXJkcywKPiA+IEtodW9uZyBEaW5oCj4gPgo+ID4+IEV2ZW4gYnkgb3JkZXJpbmcgZGV2aWNl -cyBpbiB0aGUgQUNQSSB0YWJsZXMgKHRoYXQgSSBhYmhvcikgSSBzdGlsbCBkbwo+ID4+IG5vdCB1 -bmRlcnN0YW5kIGhvdyB0aGlzIHdvcmtzIChJIG1lYW4gd2l0aG91dCByZWx5aW5nIG9uIGtlcm5l -bCBsaW5rCj4gPj4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIE1TSSBkcml2ZXIgaXMgcHJvYmVk -IGJlZm9yZSBQQ0kgZGV2aWNlcyBhcmUKPiA+PiBlbnVtZXJhdGVkIGluIGFjcGlfaW5pdCgpKS4K -PiA+Pgo+ID4+IFRoYW5rcywKPiA+PiBMb3JlbnpvCj4gPj4KPiA+Pj4gQmVzdCByZWdhcmRzLAo+ -ID4+PiBLaHVvbmcKPiA+Pj4KPiA+Pj4gT24gRnJpLCBBcHIgMjgsIDIwMTcgYXQgMjoyNyBBTSwg -TWFyYyBaeW5naWVyIDxtYXJjLnp5bmdpZXJAYXJtLmNvbT4gd3JvdGU6Cj4gPj4+ID4gT24gMjgv -MDQvMTcgMDE6NTQsIEtodW9uZyBEaW5oIHdyb3RlOgo+ID4+PiA+PiBGcm9tOiBLaHVvbmcgRGlu -aCA8a2RpbmhAYXBtLmNvbT4KPiA+Pj4gPj4KPiA+Pj4gPj4gVGhpcyBwYXRjaCBtYWtlcyBwY2kt -eGdlbmUtbXNpIGRyaXZlciBBQ1BJLWF3YXJlIGFuZCBwcm92aWRlcwo+ID4+PiA+PiBNU0kgY2Fw -YWJpbGl0eSBmb3IgWC1HZW5lIHYxIFBDSWUgY29udHJvbGxlcnMgaW4gQUNQSSBib290IG1vZGUu -Cj4gPj4+ID4+Cj4gPj4+ID4+IFNpZ25lZC1vZmYtYnk6IEtodW9uZyBEaW5oIDxrZGluaEBhcG0u -Y29tPgo+ID4+PiA+PiBTaWduZWQtb2ZmLWJ5OiBEdWMgRGFuZyA8ZGhkYW5nQGFwbS5jb20+Cj4g -Pj4+ID4+IEFja2VkLWJ5OiBNYXJjIFp5bmdpZXIgPG1hcmMuenluZ2llckBhcm0uY29tPgo+ID4+ -PiA+PiAtLS0KPiA+Pj4gPj4gdjI6Cj4gPj4+ID4+ICAtIFZlcmlmeSB3aXRoIEJJT1MgdmVyc2lv -biAzLjA2LjI1IGFuZCAzLjA3LjA5Cj4gPj4+ID4+IHYxOgo+ID4+PiA+PiAgLSBJbml0aWFsIHZl -cnNpb24KPiA+Pj4gPj4gLS0tCj4gPj4+ID4+ICBkcml2ZXJzL3BjaS9ob3N0L3BjaS14Z2VuZS1t -c2kuYyB8ICAgMzUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0KPiA+Pj4gPj4g -IDEgZmlsZXMgY2hhbmdlZCwgMzIgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKPiA+Pj4g -Pj4KPiA+Pj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLXhnZW5lLW1zaS5j -IGIvZHJpdmVycy9wY2kvaG9zdC9wY2kteGdlbmUtbXNpLmMKPiA+Pj4gPj4gaW5kZXggZjFiNjMz -Yi4uMDBhYWEzZCAxMDA2NDQKPiA+Pj4gPj4gLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2kteGdl -bmUtbXNpLmMKPiA+Pj4gPj4gKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2kteGdlbmUtbXNpLmMK -PiA+Pj4gPj4gQEAgLTI0LDYgKzI0LDcgQEAKPiA+Pj4gPj4gICNpbmNsdWRlIDxsaW51eC9wY2ku -aD4KPiA+Pj4gPj4gICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiA+Pj4gPj4g -ICNpbmNsdWRlIDxsaW51eC9vZl9wY2kuaD4KPiA+Pj4gPj4gKyNpbmNsdWRlIDxsaW51eC9hY3Bp -Lmg+Cj4gPj4+ID4+Cj4gPj4+ID4+ICAjZGVmaW5lIE1TSV9JUjAgICAgICAgICAgICAgICAgICAg -ICAgMHgwMDAwMDAKPiA+Pj4gPj4gICNkZWZpbmUgTVNJX0lOVDAgICAgICAgICAgICAgMHg4MDAw -MDAKPiA+Pj4gPj4gQEAgLTM5LDcgKzQwLDcgQEAgc3RydWN0IHhnZW5lX21zaV9ncm91cCB7Cj4g -Pj4+ID4+ICB9Owo+ID4+PiA+Pgo+ID4+PiA+PiAgc3RydWN0IHhnZW5lX21zaSB7Cj4gPj4+ID4+ -IC0gICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAgICAgICpub2RlOwo+ID4+PiA+PiArICAgICBzdHJ1 -Y3QgZndub2RlX2hhbmRsZSAgICAqZndub2RlOwo+ID4+PiA+PiAgICAgICBzdHJ1Y3QgaXJxX2Rv -bWFpbiAgICAgICAqaW5uZXJfZG9tYWluOwo+ID4+PiA+PiAgICAgICBzdHJ1Y3QgaXJxX2RvbWFp -biAgICAgICAqbXNpX2RvbWFpbjsKPiA+Pj4gPj4gICAgICAgdTY0ICAgICAgICAgICAgICAgICAg -ICAgbXNpX2FkZHI7Cj4gPj4+ID4+IEBAIC0yNDksNiArMjUwLDEzIEBAIHN0YXRpYyB2b2lkIHhn -ZW5lX2lycV9kb21haW5fZnJlZShzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLAo+ID4+PiA+PiAg -ICAgICAuZnJlZSAgID0geGdlbmVfaXJxX2RvbWFpbl9mcmVlLAo+ID4+PiA+PiAgfTsKPiA+Pj4g -Pj4KPiA+Pj4gPj4gKyNpZmRlZiBDT05GSUdfQUNQSQo+ID4+PiA+PiArc3RhdGljIHN0cnVjdCBm -d25vZGVfaGFuZGxlICp4Z2VuZV9tc2lfZ2V0X2Z3bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4g -Pj4+ID4+ICt7Cj4gPj4+ID4+ICsgICAgIHJldHVybiB4Z2VuZV9tc2lfY3RybC5md25vZGU7Cj4g -Pj4+ID4+ICt9Cj4gPj4+ID4+ICsjZW5kaWYKPiA+Pj4gPj4gKwo+ID4+PiA+PiAgc3RhdGljIGlu -dCB4Z2VuZV9hbGxvY2F0ZV9kb21haW5zKHN0cnVjdCB4Z2VuZV9tc2kgKm1zaSkKPiA+Pj4gPj4g -IHsKPiA+Pj4gPj4gICAgICAgbXNpLT5pbm5lcl9kb21haW4gPSBpcnFfZG9tYWluX2FkZF9saW5l -YXIoTlVMTCwgTlJfTVNJX1ZFQywKPiA+Pj4gPj4gQEAgLTI1Niw3ICsyNjQsNyBAQCBzdGF0aWMg -aW50IHhnZW5lX2FsbG9jYXRlX2RvbWFpbnMoc3RydWN0IHhnZW5lX21zaSAqbXNpKQo+ID4+PiA+ -PiAgICAgICBpZiAoIW1zaS0+aW5uZXJfZG9tYWluKQo+ID4+PiA+PiAgICAgICAgICAgICAgIHJl -dHVybiAtRU5PTUVNOwo+ID4+PiA+Pgo+ID4+PiA+PiAtICAgICBtc2ktPm1zaV9kb21haW4gPSBw -Y2lfbXNpX2NyZWF0ZV9pcnFfZG9tYWluKG9mX25vZGVfdG9fZndub2RlKG1zaS0+bm9kZSksCj4g -Pj4+ID4+ICsgICAgIG1zaS0+bXNpX2RvbWFpbiA9IHBjaV9tc2lfY3JlYXRlX2lycV9kb21haW4o -bXNpLT5md25vZGUsCj4gPj4+ID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgJnhnZW5lX21zaV9kb21haW5faW5mbywKPiA+Pj4gPj4gICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2ktPmlubmVyX2RvbWFp -bik7Cj4gPj4+ID4+Cj4gPj4+ID4+IEBAIC0yNjUsNiArMjczLDkgQEAgc3RhdGljIGludCB4Z2Vu -ZV9hbGxvY2F0ZV9kb21haW5zKHN0cnVjdCB4Z2VuZV9tc2kgKm1zaSkKPiA+Pj4gPj4gICAgICAg -ICAgICAgICByZXR1cm4gLUVOT01FTTsKPiA+Pj4gPj4gICAgICAgfQo+ID4+PiA+Pgo+ID4+PiA+ -PiArI2lmZGVmIENPTkZJR19BQ1BJCj4gPj4+ID4+ICsgICAgIHBjaV9tc2lfcmVnaXN0ZXJfZndu -b2RlX3Byb3ZpZGVyKCZ4Z2VuZV9tc2lfZ2V0X2Z3bm9kZSk7Cj4gPj4+ID4+ICsjZW5kaWYKPiA+ -Pj4gPj4gICAgICAgcmV0dXJuIDA7Cj4gPj4+ID4+ICB9Cj4gPj4+ID4+Cj4gPj4+ID4+IEBAIC00 -NDksNiArNDYwLDEzIEBAIHN0YXRpYyBpbnQgeGdlbmVfbXNpX2h3aXJxX2ZyZWUodW5zaWduZWQg -aW50IGNwdSkKPiA+Pj4gPj4gICAgICAge30sCj4gPj4+ID4+ICB9Owo+ID4+PiA+Pgo+ID4+PiA+ -PiArI2lmZGVmIENPTkZJR19BQ1BJCj4gPj4+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlf -ZGV2aWNlX2lkIHhnZW5lX21zaV9hY3BpX2lkc1tdID0gewo+ID4+PiA+PiArICAgICB7IkFQTUMw -RDBFIiwgMH0sCj4gPj4+ID4+ICsgICAgIHsgfSwKPiA+Pj4gPj4gK307Cj4gPj4+ID4+ICsjZW5k -aWYKPiA+Pj4gPj4gKwo+ID4+PiA+PiAgc3RhdGljIGludCB4Z2VuZV9tc2lfcHJvYmUoc3RydWN0 -IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+Pj4gPj4gIHsKPiA+Pj4gPj4gICAgICAgc3RydWN0 -IHJlc291cmNlICpyZXM7Cj4gPj4+ID4+IEBAIC00NjksNyArNDg3LDE3IEBAIHN0YXRpYyBpbnQg -eGdlbmVfbXNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPj4+ID4+ICAg -ICAgICAgICAgICAgZ290byBlcnJvcjsKPiA+Pj4gPj4gICAgICAgfQo+ID4+PiA+PiAgICAgICB4 -Z2VuZV9tc2ktPm1zaV9hZGRyID0gcmVzLT5zdGFydDsKPiA+Pj4gPj4gLSAgICAgeGdlbmVfbXNp -LT5ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7Cj4gPj4+ID4+ICsKPiA+Pj4gPj4gKyAgICAgeGdl -bmVfbXNpLT5md25vZGUgPSBvZl9ub2RlX3RvX2Z3bm9kZShwZGV2LT5kZXYub2Zfbm9kZSk7Cj4g -Pj4+ID4+ICsgICAgIGlmICgheGdlbmVfbXNpLT5md25vZGUpIHsKPiA+Pj4gPj4gKyAgICAgICAg -ICAgICB4Z2VuZV9tc2ktPmZ3bm9kZSA9IGlycV9kb21haW5fYWxsb2NfZndub2RlKE5VTEwpOwo+ -ID4+PiA+Cj4gPj4+ID4gUGxlYXNlIHByb3ZpZGUgc29tZXRoaW5nIG90aGVyIHRoYW4gTlVMTCwg -c3VjaCBhcyB0aGUgYmFzZSBhZGRyZXNzIGlmCj4gPj4+ID4gdGhlIGRldmljZS4gVGhhdCdzIHF1 -aXRlIHVzZWZ1bCBmb3IgZGVidWdnaW5nLgo+ID4+PiA+Cj4gPj4+ID4+ICsgICAgICAgICAgICAg -aWYgKCF4Z2VuZV9tc2ktPmZ3bm9kZSkgewo+ID4+PiA+PiArICAgICAgICAgICAgICAgICAgICAg -ZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBmd25vZGVcbiIpOwo+ID4+PiA+ -PiArICAgICAgICAgICAgICAgICAgICAgcmMgPSBFTk9NRU07Cj4gPj4+ID4+ICsgICAgICAgICAg -ICAgICAgICAgICBnb3RvIGVycm9yOwo+ID4+PiA+PiArICAgICAgICAgICAgIH0KPiA+Pj4gPj4g -KyAgICAgfQo+ID4+PiA+PiArCj4gPj4+ID4+ICAgICAgIHhnZW5lX21zaS0+bnVtX2NwdXMgPSBu -dW1fcG9zc2libGVfY3B1cygpOwo+ID4+PiA+Pgo+ID4+PiA+PiAgICAgICByYyA9IHhnZW5lX21z -aV9pbml0X2FsbG9jYXRvcih4Z2VuZV9tc2kpOwo+ID4+PiA+PiBAQCAtNTQwLDYgKzU2OCw3IEBA -IHN0YXRpYyBpbnQgeGdlbmVfbXNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYp -Cj4gPj4+ID4+ICAgICAgIC5kcml2ZXIgPSB7Cj4gPj4+ID4+ICAgICAgICAgICAgICAgLm5hbWUg -PSAieGdlbmUtbXNpIiwKPiA+Pj4gPj4gICAgICAgICAgICAgICAub2ZfbWF0Y2hfdGFibGUgPSB4 -Z2VuZV9tc2lfbWF0Y2hfdGFibGUsCj4gPj4+ID4+ICsgICAgICAgICAgICAgLmFjcGlfbWF0Y2hf -dGFibGUgPSBBQ1BJX1BUUih4Z2VuZV9tc2lfYWNwaV9pZHMpLAo+ID4+PiA+PiAgICAgICB9LAo+ -ID4+PiA+PiAgICAgICAucHJvYmUgPSB4Z2VuZV9tc2lfcHJvYmUsCj4gPj4+ID4+ICAgICAgIC5y -ZW1vdmUgPSB4Z2VuZV9tc2lfcmVtb3ZlLAo+ID4+PiA+Pgo+ID4+PiA+Cj4gPj4+ID4gVGhlIGNv -ZGUgaXMgdHJpdmlhbCwgYnV0IHJlbGllcyBvbiB0aGUgTVNJIGNvbnRyb2xsZXIgdG8gcHJvYmUg -YmVmb3JlCj4gPj4+ID4gdGhlIFBDSSBidXMuIFdoYXQgZW5mb3JjZXMgdGhpcz8gSG93IGlzIGl0 -IG1ha2luZyBzdXJlIHRoYXQgdGhpcyBpcyBub3QKPiA+Pj4gPiBnb2luZyB0byBicmVhayBpbiB0 -aGUgbmV4dCBrZXJuZWwgcmVsZWFzZT8gQXMgZmFyIGFzIEkgY2FuIHRlbGwsIHRoZXJlCj4gPj4+ -ID4gaXMgbm8gZXhwbGljaXQgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSB0d28sIG1ha2luZyBpdCB0 -aGUgd2hvbGUgdGhpbmcKPiA+Pj4gPiBleHRyZW1lbHkgZnJhZ2lsZS4KPiA+Pj4gPgo+ID4+PiA+ -IFRoYW5rcywKPiA+Pj4gPgo+ID4+PiA+ICAgICAgICAgTS4KPiA+Pj4gPiAtLQo+ID4+PiA+IEph -enogaXMgbm90IGRlYWQuIEl0IGp1c3Qgc21lbGxzIGZ1bm55Li4uCj4gPj4+Cj4gPj4+IC0tCgpf -X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0t -a2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcK -aHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2Vy -bmVsCg== +On Tue, Jun 06, 2017 at 09:44:15AM -0700, Khuong Dinh wrote: +> Hi Lorenzo, +> +> On Tue, May 9, 2017 at 3:55 PM, Khuong Dinh <kdinh@apm.com> wrote: +> > Hi Lorenzo, +> > +> > On Fri, May 5, 2017 at 9:51 AM, Lorenzo Pieralisi +> > <lorenzo.pieralisi@arm.com> wrote: +> >> On Thu, May 04, 2017 at 05:36:06PM -0700, Khuong Dinh wrote: +> >>> Hi Marc, +> >>> There's no explicit dependency between pcie driver and msi +> >>> controller. The current solution that we did is relying on the +> >>> node ordering in BIOS. ACPI 5.0 introduced _DEP method to assign a +> >>> higher priority in start ordering. This method could be applied in +> >>> case of msi and pcie are the same level of subsys_init (in ACPI +> >>> boot). However, PCIe driver has not supported for this dependency +> >>> check yet. How do you think about this solution. +> >> +> >> First off, you can't post emails with confidentiality notices on +> >> mailing lists so remove it from now onwards. +> > +> > Fixed +> > +> >> Secondly, I commented on this before, so you know what my opinion is. +> > +> > I got your opinion. I'll implement as your suggestion. +> > +> +> Regarding to your previous suggestion to add a hook walking the ACPI +> namespace before acpi_bus_scan() in acpi_scan_init() to make MSI +> controllers must be probed before PCI. I have a concern that the +> MSI namespace ? _SB.MSIX? is not a unique name and how can we walk +> the ACPI namespace and use this name to make MSI probed before PCI. +> May you have little bit more information for this or do you have +> another suggestion for this? +> +> There?s another solution which makes this simpler and I?d like to +> ask your opinion about this. +> The solution is to make an hierarchy between MSI and PCI nodes as below: +> Device(\_SB.MSIX) { +> Device(\_SB.PCI0) +> Device(\_SB.PCI1) +> ?? +> } +> In other word, MSIX node is a parent node of PCI nodes in ACPI +> table. In this sense, there?s an explicit dependency between MSI +> and PCI, MSI controller must be probed before PCI and it will +> guarantee not breaking next kernel releases. How do you think about +> this solution. + +I think that's a plaster as ineffective as reordering nodes, in short +it is not a solution and you still rely on kernel link ordering, you +can fiddle with ACPI tables as much as you want but that does not change. + +> I also tried to use _DEP method to describe the dependency of PCIe +> nodes, but it looks that it does not work as PCI and MSI are handed +> by acpi_bus_scan and still having issue when we re-probe PCI. + +That's a tad vague to be frank, anyway it is pretty clear to me that we +have hit a wall. In ACPI there is no way to describe probe dependencies +like the one you have, it is as simple as that, and this MSI issue you +are facing is just an example, there are more eg: + +https://www.spinics.net/lists/arm-kernel/msg585825.html + +At the end of the day the choice is simple either we accept (and we +maintain because that's the problem) these hacks - and I am not willing +to do that - or we find a way to solve this from a general perspective not +as a point hack. + +I can have a look at solving the whole issue but it won't happen +tomorrow. + +Thanks, +Lorenzo + +> Thanks, +> Khuong Dinh +> +> >> Finally, please execute this command on the vmlinux that "works" +> >> for you: +> >> +> >> nm vmlinux | grep -E '__initcall_(xgene_pcie_msi_init|acpi_init)' +> > +> > $ nm vmlinux | grep -E '__initcall_(xgene_pcie_msi_init|acpi_init)' +> > ffff000008dab2d8 t __initcall_acpi_init4 +> > ffff000008dab2c8 t __initcall_xgene_pcie_msi_init4 +> > +> > Best regards, +> > Khuong Dinh +> > +> >> Even by ordering devices in the ACPI tables (that I abhor) I still do +> >> not understand how this works (I mean without relying on kernel link +> >> order to ensure that the MSI driver is probed before PCI devices are +> >> enumerated in acpi_init()). +> >> +> >> Thanks, +> >> Lorenzo +> >> +> >>> Best regards, +> >>> Khuong +> >>> +> >>> On Fri, Apr 28, 2017 at 2:27 AM, Marc Zyngier <marc.zyngier@arm.com> wrote: +> >>> > On 28/04/17 01:54, Khuong Dinh wrote: +> >>> >> From: Khuong Dinh <kdinh@apm.com> +> >>> >> +> >>> >> This patch makes pci-xgene-msi driver ACPI-aware and provides +> >>> >> MSI capability for X-Gene v1 PCIe controllers in ACPI boot mode. +> >>> >> +> >>> >> Signed-off-by: Khuong Dinh <kdinh@apm.com> +> >>> >> Signed-off-by: Duc Dang <dhdang@apm.com> +> >>> >> Acked-by: Marc Zyngier <marc.zyngier@arm.com> +> >>> >> --- +> >>> >> v2: +> >>> >> - Verify with BIOS version 3.06.25 and 3.07.09 +> >>> >> v1: +> >>> >> - Initial version +> >>> >> --- +> >>> >> drivers/pci/host/pci-xgene-msi.c | 35 ++++++++++++++++++++++++++++++++--- +> >>> >> 1 files changed, 32 insertions(+), 3 deletions(-) +> >>> >> +> >>> >> diff --git a/drivers/pci/host/pci-xgene-msi.c b/drivers/pci/host/pci-xgene-msi.c +> >>> >> index f1b633b..00aaa3d 100644 +> >>> >> --- a/drivers/pci/host/pci-xgene-msi.c +> >>> >> +++ b/drivers/pci/host/pci-xgene-msi.c +> >>> >> @@ -24,6 +24,7 @@ +> >>> >> #include <linux/pci.h> +> >>> >> #include <linux/platform_device.h> +> >>> >> #include <linux/of_pci.h> +> >>> >> +#include <linux/acpi.h> +> >>> >> +> >>> >> #define MSI_IR0 0x000000 +> >>> >> #define MSI_INT0 0x800000 +> >>> >> @@ -39,7 +40,7 @@ struct xgene_msi_group { +> >>> >> }; +> >>> >> +> >>> >> struct xgene_msi { +> >>> >> - struct device_node *node; +> >>> >> + struct fwnode_handle *fwnode; +> >>> >> struct irq_domain *inner_domain; +> >>> >> struct irq_domain *msi_domain; +> >>> >> u64 msi_addr; +> >>> >> @@ -249,6 +250,13 @@ static void xgene_irq_domain_free(struct irq_domain *domain, +> >>> >> .free = xgene_irq_domain_free, +> >>> >> }; +> >>> >> +> >>> >> +#ifdef CONFIG_ACPI +> >>> >> +static struct fwnode_handle *xgene_msi_get_fwnode(struct device *dev) +> >>> >> +{ +> >>> >> + return xgene_msi_ctrl.fwnode; +> >>> >> +} +> >>> >> +#endif +> >>> >> + +> >>> >> static int xgene_allocate_domains(struct xgene_msi *msi) +> >>> >> { +> >>> >> msi->inner_domain = irq_domain_add_linear(NULL, NR_MSI_VEC, +> >>> >> @@ -256,7 +264,7 @@ static int xgene_allocate_domains(struct xgene_msi *msi) +> >>> >> if (!msi->inner_domain) +> >>> >> return -ENOMEM; +> >>> >> +> >>> >> - msi->msi_domain = pci_msi_create_irq_domain(of_node_to_fwnode(msi->node), +> >>> >> + msi->msi_domain = pci_msi_create_irq_domain(msi->fwnode, +> >>> >> &xgene_msi_domain_info, +> >>> >> msi->inner_domain); +> >>> >> +> >>> >> @@ -265,6 +273,9 @@ static int xgene_allocate_domains(struct xgene_msi *msi) +> >>> >> return -ENOMEM; +> >>> >> } +> >>> >> +> >>> >> +#ifdef CONFIG_ACPI +> >>> >> + pci_msi_register_fwnode_provider(&xgene_msi_get_fwnode); +> >>> >> +#endif +> >>> >> return 0; +> >>> >> } +> >>> >> +> >>> >> @@ -449,6 +460,13 @@ static int xgene_msi_hwirq_free(unsigned int cpu) +> >>> >> {}, +> >>> >> }; +> >>> >> +> >>> >> +#ifdef CONFIG_ACPI +> >>> >> +static const struct acpi_device_id xgene_msi_acpi_ids[] = { +> >>> >> + {"APMC0D0E", 0}, +> >>> >> + { }, +> >>> >> +}; +> >>> >> +#endif +> >>> >> + +> >>> >> static int xgene_msi_probe(struct platform_device *pdev) +> >>> >> { +> >>> >> struct resource *res; +> >>> >> @@ -469,7 +487,17 @@ static int xgene_msi_probe(struct platform_device *pdev) +> >>> >> goto error; +> >>> >> } +> >>> >> xgene_msi->msi_addr = res->start; +> >>> >> - xgene_msi->node = pdev->dev.of_node; +> >>> >> + +> >>> >> + xgene_msi->fwnode = of_node_to_fwnode(pdev->dev.of_node); +> >>> >> + if (!xgene_msi->fwnode) { +> >>> >> + xgene_msi->fwnode = irq_domain_alloc_fwnode(NULL); +> >>> > +> >>> > Please provide something other than NULL, such as the base address if +> >>> > the device. That's quite useful for debugging. +> >>> > +> >>> >> + if (!xgene_msi->fwnode) { +> >>> >> + dev_err(&pdev->dev, "Failed to create fwnode\n"); +> >>> >> + rc = ENOMEM; +> >>> >> + goto error; +> >>> >> + } +> >>> >> + } +> >>> >> + +> >>> >> xgene_msi->num_cpus = num_possible_cpus(); +> >>> >> +> >>> >> rc = xgene_msi_init_allocator(xgene_msi); +> >>> >> @@ -540,6 +568,7 @@ static int xgene_msi_probe(struct platform_device *pdev) +> >>> >> .driver = { +> >>> >> .name = "xgene-msi", +> >>> >> .of_match_table = xgene_msi_match_table, +> >>> >> + .acpi_match_table = ACPI_PTR(xgene_msi_acpi_ids), +> >>> >> }, +> >>> >> .probe = xgene_msi_probe, +> >>> >> .remove = xgene_msi_remove, +> >>> >> +> >>> > +> >>> > The code is trivial, but relies on the MSI controller to probe before +> >>> > the PCI bus. What enforces this? How is it making sure that this is not +> >>> > going to break in the next kernel release? As far as I can tell, there +> >>> > is no explicit dependency between the two, making it the whole thing +> >>> > extremely fragile. +> >>> > +> >>> > Thanks, +> >>> > +> >>> > M. +> >>> > -- +> >>> > Jazz is not dead. It just smells funny... +> >>> +> >>> -- diff --git a/a/content_digest b/N1/content_digest index 638c708..9bd6ab6 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -4,187 +4,246 @@ "ref\020170505165119.GA8614@red-moon\0" "ref\0CAAsHzqttOoWOCAEmYaWjWmH4a--o0FXCRKfFC9S-+3KGiZVuHQ@mail.gmail.com\0" "ref\0CAAsHzqvnGWkG_KN6m_+HzGFaNOHU-m2FocTxy3pyM7Hhd9rz7w@mail.gmail.com\0" - "From\0Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>\0" - "Subject\0Re: [PATCH v2 pci] PCI/MSI: pci-xgene-msi: Enable MSI support in ACPI boot for X-Gene v1\0" + "From\0lorenzo.pieralisi@arm.com (Lorenzo Pieralisi)\0" + "Subject\0[PATCH v2 pci] PCI/MSI: pci-xgene-msi: Enable MSI support in ACPI boot for X-Gene v1\0" "Date\0Thu, 8 Jun 2017 11:39:56 +0100\0" - "To\0Khuong Dinh <kdinh@apm.com>\0" - "Cc\0rjw@rjwysocki.net" - Duc Dang <dhdang@apm.com> - Marc Zyngier <marc.zyngier@arm.com> - linux-pci@vger.kernel.org - msalter@redhat.com - patches@apm.com - linux-kernel@vger.kernel.org - jcm@redhat.com - Bjorn Helgaas <bhelgaas@google.com> - " linux-arm-kernel@lists.infradead.org\0" + "To\0linux-arm-kernel@lists.infradead.org\0" "\00:1\0" "b\0" - "T24gVHVlLCBKdW4gMDYsIDIwMTcgYXQgMDk6NDQ6MTVBTSAtMDcwMCwgS2h1b25nIERpbmggd3Jv\n" - "dGU6Cj4gSGkgTG9yZW56bywKPiAKPiBPbiBUdWUsIE1heSA5LCAyMDE3IGF0IDM6NTUgUE0sIEto\n" - "dW9uZyBEaW5oIDxrZGluaEBhcG0uY29tPiB3cm90ZToKPiA+IEhpIExvcmVuem8sCj4gPgo+ID4g\n" - "T24gRnJpLCBNYXkgNSwgMjAxNyBhdCA5OjUxIEFNLCBMb3JlbnpvIFBpZXJhbGlzaQo+ID4gPGxv\n" - "cmVuem8ucGllcmFsaXNpQGFybS5jb20+IHdyb3RlOgo+ID4+IE9uIFRodSwgTWF5IDA0LCAyMDE3\n" - "IGF0IDA1OjM2OjA2UE0gLTA3MDAsIEtodW9uZyBEaW5oIHdyb3RlOgo+ID4+PiBIaSBNYXJjLAo+\n" - "ID4+PiBUaGVyZSdzIG5vIGV4cGxpY2l0IGRlcGVuZGVuY3kgYmV0d2VlbiBwY2llIGRyaXZlciBh\n" - "bmQgbXNpCj4gPj4+IGNvbnRyb2xsZXIuICBUaGUgY3VycmVudCBzb2x1dGlvbiB0aGF0IHdlIGRp\n" - "ZCBpcyByZWx5aW5nIG9uIHRoZQo+ID4+PiBub2RlIG9yZGVyaW5nIGluIEJJT1MuICBBQ1BJIDUu\n" - "MCBpbnRyb2R1Y2VkIF9ERVAgbWV0aG9kIHRvIGFzc2lnbiBhCj4gPj4+IGhpZ2hlciBwcmlvcml0\n" - "eSBpbiBzdGFydCBvcmRlcmluZy4gIFRoaXMgbWV0aG9kIGNvdWxkIGJlIGFwcGxpZWQgaW4KPiA+\n" - "Pj4gY2FzZSBvZiBtc2kgYW5kIHBjaWUgYXJlIHRoZSBzYW1lIGxldmVsIG9mIHN1YnN5c19pbml0\n" - "IChpbiBBQ1BJCj4gPj4+IGJvb3QpLiAgSG93ZXZlciwgUENJZSBkcml2ZXIgaGFzIG5vdCBzdXBw\n" - "b3J0ZWQgZm9yIHRoaXMgZGVwZW5kZW5jeQo+ID4+PiBjaGVjayB5ZXQuICBIb3cgZG8geW91IHRo\n" - "aW5rIGFib3V0IHRoaXMgc29sdXRpb24uCj4gPj4KPiA+PiBGaXJzdCBvZmYsIHlvdSBjYW4ndCBw\n" - "b3N0IGVtYWlscyB3aXRoIGNvbmZpZGVudGlhbGl0eSBub3RpY2VzIG9uCj4gPj4gbWFpbGluZyBs\n" - "aXN0cyBzbyByZW1vdmUgaXQgZnJvbSBub3cgb253YXJkcy4KPiA+Cj4gPiBGaXhlZAo+ID4KPiA+\n" - "PiBTZWNvbmRseSwgSSBjb21tZW50ZWQgb24gdGhpcyBiZWZvcmUsIHNvIHlvdSBrbm93IHdoYXQg\n" - "bXkgb3BpbmlvbiBpcy4KPiA+Cj4gPiBJIGdvdCB5b3VyIG9waW5pb24uIEknbGwgaW1wbGVtZW50\n" - "IGFzIHlvdXIgc3VnZ2VzdGlvbi4KPiA+Cj4gCj4gICBSZWdhcmRpbmcgdG8geW91ciBwcmV2aW91\n" - "cyBzdWdnZXN0aW9uIHRvIGFkZCBhIGhvb2sgd2Fsa2luZyB0aGUgQUNQSQo+ICAgbmFtZXNwYWNl\n" - "IGJlZm9yZSBhY3BpX2J1c19zY2FuKCkgaW4gYWNwaV9zY2FuX2luaXQoKSB0byBtYWtlIE1TSQo+\n" - "ICAgY29udHJvbGxlcnMgbXVzdCBiZSBwcm9iZWQgYmVmb3JlIFBDSS4gIEkgaGF2ZSBhIGNvbmNl\n" - "cm4gdGhhdCB0aGUKPiAgIE1TSSBuYW1lc3BhY2Ug4oCcIF9TQi5NU0lY4oCdIGlzIG5vdCBhIHVu\n" - "aXF1ZSBuYW1lIGFuZCBob3cgY2FuIHdlIHdhbGsKPiAgIHRoZSBBQ1BJIG5hbWVzcGFjZSBhbmQg\n" - "dXNlIHRoaXMgbmFtZSB0byBtYWtlIE1TSSBwcm9iZWQgYmVmb3JlIFBDSS4KPiAgIE1heSB5b3Ug\n" - "aGF2ZSBsaXR0bGUgYml0IG1vcmUgaW5mb3JtYXRpb24gZm9yIHRoaXMgb3IgZG8geW91IGhhdmUK\n" - "PiAgIGFub3RoZXIgc3VnZ2VzdGlvbiBmb3IgdGhpcz8KPiAKPiAgICBUaGVyZeKAmXMgYW5vdGhl\n" - "ciBzb2x1dGlvbiB3aGljaCBtYWtlcyB0aGlzIHNpbXBsZXIgYW5kIEnigJlkIGxpa2UgdG8KPiAg\n" - "ICBhc2sgeW91ciBvcGluaW9uIGFib3V0IHRoaXMuCj4gICAgVGhlIHNvbHV0aW9uIGlzIHRvIG1h\n" - "a2UgYW4gaGllcmFyY2h5IGJldHdlZW4gTVNJIGFuZCBQQ0kgbm9kZXMgIGFzIGJlbG93Ogo+IERl\n" - "dmljZShcX1NCLk1TSVgpIHsKPiAgICBEZXZpY2UoXF9TQi5QQ0kwKQo+ICAgIERldmljZShcX1NC\n" - "LlBDSTEpCj4gICAg4oCm4oCmCj4gfQo+ICAgSW4gb3RoZXIgd29yZCwgTVNJWCBub2RlIGlzIGEg\n" - "cGFyZW50IG5vZGUgb2YgUENJIG5vZGVzIGluIEFDUEkKPiAgIHRhYmxlLiAgSW4gdGhpcyBzZW5z\n" - "ZSwgdGhlcmXigJlzIGFuIGV4cGxpY2l0IGRlcGVuZGVuY3kgYmV0d2VlbiBNU0kKPiAgIGFuZCBQ\n" - "Q0ksIE1TSSBjb250cm9sbGVyIG11c3QgYmUgcHJvYmVkIGJlZm9yZSBQQ0kgYW5kIGl0IHdpbGwK\n" - "PiAgIGd1YXJhbnRlZSBub3QgYnJlYWtpbmcgbmV4dCBrZXJuZWwgcmVsZWFzZXMuICBIb3cgZG8g\n" - "eW91IHRoaW5rIGFib3V0Cj4gICB0aGlzIHNvbHV0aW9uLgoKSSB0aGluayB0aGF0J3MgYSBwbGFz\n" - "dGVyIGFzIGluZWZmZWN0aXZlIGFzIHJlb3JkZXJpbmcgbm9kZXMsIGluIHNob3J0Cml0IGlzIG5v\n" - "dCBhIHNvbHV0aW9uIGFuZCB5b3Ugc3RpbGwgcmVseSBvbiBrZXJuZWwgbGluayBvcmRlcmluZywg\n" - "eW91CmNhbiBmaWRkbGUgd2l0aCBBQ1BJIHRhYmxlcyBhcyBtdWNoIGFzIHlvdSB3YW50IGJ1dCB0\n" - "aGF0IGRvZXMgbm90IGNoYW5nZS4KCj4gIEkgYWxzbyB0cmllZCB0byB1c2UgX0RFUCBtZXRob2Qg\n" - "dG8gZGVzY3JpYmUgdGhlIGRlcGVuZGVuY3kgb2YgUENJZQo+ICBub2RlcywgYnV0IGl0IGxvb2tz\n" - "IHRoYXQgaXQgZG9lcyBub3Qgd29yayBhcyBQQ0kgYW5kIE1TSSBhcmUgaGFuZGVkCj4gIGJ5IGFj\n" - "cGlfYnVzX3NjYW4gYW5kIHN0aWxsIGhhdmluZyBpc3N1ZSB3aGVuIHdlIHJlLXByb2JlIFBDSS4K\n" - "ClRoYXQncyBhIHRhZCB2YWd1ZSB0byBiZSBmcmFuaywgYW55d2F5IGl0IGlzIHByZXR0eSBjbGVh\n" - "ciB0byBtZSB0aGF0IHdlCmhhdmUgaGl0IGEgd2FsbC4gSW4gQUNQSSB0aGVyZSBpcyBubyB3YXkg\n" - "dG8gZGVzY3JpYmUgcHJvYmUgZGVwZW5kZW5jaWVzCmxpa2UgdGhlIG9uZSB5b3UgaGF2ZSwgaXQg\n" - "aXMgYXMgc2ltcGxlIGFzIHRoYXQsIGFuZCB0aGlzIE1TSSBpc3N1ZSB5b3UKYXJlIGZhY2luZyBp\n" - "cyBqdXN0IGFuIGV4YW1wbGUsIHRoZXJlIGFyZSBtb3JlIGVnOgoKaHR0cHM6Ly93d3cuc3Bpbmlj\n" - "cy5uZXQvbGlzdHMvYXJtLWtlcm5lbC9tc2c1ODU4MjUuaHRtbAoKQXQgdGhlIGVuZCBvZiB0aGUg\n" - "ZGF5IHRoZSBjaG9pY2UgaXMgc2ltcGxlIGVpdGhlciB3ZSBhY2NlcHQgKGFuZCB3ZQptYWludGFp\n" - "biBiZWNhdXNlIHRoYXQncyB0aGUgcHJvYmxlbSkgdGhlc2UgaGFja3MgLSBhbmQgSSBhbSBub3Qg\n" - "d2lsbGluZwp0byBkbyB0aGF0IC0gb3Igd2UgZmluZCBhIHdheSB0byBzb2x2ZSB0aGlzIGZyb20g\n" - "YSBnZW5lcmFsIHBlcnNwZWN0aXZlIG5vdAphcyBhIHBvaW50IGhhY2suCgpJIGNhbiBoYXZlIGEg\n" - "bG9vayBhdCBzb2x2aW5nIHRoZSB3aG9sZSBpc3N1ZSBidXQgaXQgd29uJ3QgaGFwcGVuCnRvbW9y\n" - "cm93LgoKVGhhbmtzLApMb3JlbnpvCgo+IFRoYW5rcywKPiBLaHVvbmcgRGluaAo+IAo+ID4+IEZp\n" - "bmFsbHksIHBsZWFzZSBleGVjdXRlIHRoaXMgY29tbWFuZCBvbiB0aGUgdm1saW51eCB0aGF0ICJ3\n" - "b3JrcyIKPiA+PiBmb3IgeW91Ogo+ID4+Cj4gPj4gbm0gdm1saW51eCB8IGdyZXAgLUUgJ19faW5p\n" - "dGNhbGxfKHhnZW5lX3BjaWVfbXNpX2luaXR8YWNwaV9pbml0KScKPiA+Cj4gPiAkIG5tIHZtbGlu\n" - "dXggfCBncmVwIC1FICdfX2luaXRjYWxsXyh4Z2VuZV9wY2llX21zaV9pbml0fGFjcGlfaW5pdCkn\n" - "Cj4gPiBmZmZmMDAwMDA4ZGFiMmQ4IHQgX19pbml0Y2FsbF9hY3BpX2luaXQ0Cj4gPiBmZmZmMDAw\n" - "MDA4ZGFiMmM4IHQgX19pbml0Y2FsbF94Z2VuZV9wY2llX21zaV9pbml0NAo+ID4KPiA+IEJlc3Qg\n" - "cmVnYXJkcywKPiA+IEtodW9uZyBEaW5oCj4gPgo+ID4+IEV2ZW4gYnkgb3JkZXJpbmcgZGV2aWNl\n" - "cyBpbiB0aGUgQUNQSSB0YWJsZXMgKHRoYXQgSSBhYmhvcikgSSBzdGlsbCBkbwo+ID4+IG5vdCB1\n" - "bmRlcnN0YW5kIGhvdyB0aGlzIHdvcmtzIChJIG1lYW4gd2l0aG91dCByZWx5aW5nIG9uIGtlcm5l\n" - "bCBsaW5rCj4gPj4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIE1TSSBkcml2ZXIgaXMgcHJvYmVk\n" - "IGJlZm9yZSBQQ0kgZGV2aWNlcyBhcmUKPiA+PiBlbnVtZXJhdGVkIGluIGFjcGlfaW5pdCgpKS4K\n" - "PiA+Pgo+ID4+IFRoYW5rcywKPiA+PiBMb3JlbnpvCj4gPj4KPiA+Pj4gQmVzdCByZWdhcmRzLAo+\n" - "ID4+PiBLaHVvbmcKPiA+Pj4KPiA+Pj4gT24gRnJpLCBBcHIgMjgsIDIwMTcgYXQgMjoyNyBBTSwg\n" - "TWFyYyBaeW5naWVyIDxtYXJjLnp5bmdpZXJAYXJtLmNvbT4gd3JvdGU6Cj4gPj4+ID4gT24gMjgv\n" - "MDQvMTcgMDE6NTQsIEtodW9uZyBEaW5oIHdyb3RlOgo+ID4+PiA+PiBGcm9tOiBLaHVvbmcgRGlu\n" - "aCA8a2RpbmhAYXBtLmNvbT4KPiA+Pj4gPj4KPiA+Pj4gPj4gVGhpcyBwYXRjaCBtYWtlcyBwY2kt\n" - "eGdlbmUtbXNpIGRyaXZlciBBQ1BJLWF3YXJlIGFuZCBwcm92aWRlcwo+ID4+PiA+PiBNU0kgY2Fw\n" - "YWJpbGl0eSBmb3IgWC1HZW5lIHYxIFBDSWUgY29udHJvbGxlcnMgaW4gQUNQSSBib290IG1vZGUu\n" - "Cj4gPj4+ID4+Cj4gPj4+ID4+IFNpZ25lZC1vZmYtYnk6IEtodW9uZyBEaW5oIDxrZGluaEBhcG0u\n" - "Y29tPgo+ID4+PiA+PiBTaWduZWQtb2ZmLWJ5OiBEdWMgRGFuZyA8ZGhkYW5nQGFwbS5jb20+Cj4g\n" - "Pj4+ID4+IEFja2VkLWJ5OiBNYXJjIFp5bmdpZXIgPG1hcmMuenluZ2llckBhcm0uY29tPgo+ID4+\n" - "PiA+PiAtLS0KPiA+Pj4gPj4gdjI6Cj4gPj4+ID4+ICAtIFZlcmlmeSB3aXRoIEJJT1MgdmVyc2lv\n" - "biAzLjA2LjI1IGFuZCAzLjA3LjA5Cj4gPj4+ID4+IHYxOgo+ID4+PiA+PiAgLSBJbml0aWFsIHZl\n" - "cnNpb24KPiA+Pj4gPj4gLS0tCj4gPj4+ID4+ICBkcml2ZXJzL3BjaS9ob3N0L3BjaS14Z2VuZS1t\n" - "c2kuYyB8ICAgMzUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0KPiA+Pj4gPj4g\n" - "IDEgZmlsZXMgY2hhbmdlZCwgMzIgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKPiA+Pj4g\n" - "Pj4KPiA+Pj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLXhnZW5lLW1zaS5j\n" - "IGIvZHJpdmVycy9wY2kvaG9zdC9wY2kteGdlbmUtbXNpLmMKPiA+Pj4gPj4gaW5kZXggZjFiNjMz\n" - "Yi4uMDBhYWEzZCAxMDA2NDQKPiA+Pj4gPj4gLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2kteGdl\n" - "bmUtbXNpLmMKPiA+Pj4gPj4gKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2kteGdlbmUtbXNpLmMK\n" - "PiA+Pj4gPj4gQEAgLTI0LDYgKzI0LDcgQEAKPiA+Pj4gPj4gICNpbmNsdWRlIDxsaW51eC9wY2ku\n" - "aD4KPiA+Pj4gPj4gICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiA+Pj4gPj4g\n" - "ICNpbmNsdWRlIDxsaW51eC9vZl9wY2kuaD4KPiA+Pj4gPj4gKyNpbmNsdWRlIDxsaW51eC9hY3Bp\n" - "Lmg+Cj4gPj4+ID4+Cj4gPj4+ID4+ICAjZGVmaW5lIE1TSV9JUjAgICAgICAgICAgICAgICAgICAg\n" - "ICAgMHgwMDAwMDAKPiA+Pj4gPj4gICNkZWZpbmUgTVNJX0lOVDAgICAgICAgICAgICAgMHg4MDAw\n" - "MDAKPiA+Pj4gPj4gQEAgLTM5LDcgKzQwLDcgQEAgc3RydWN0IHhnZW5lX21zaV9ncm91cCB7Cj4g\n" - "Pj4+ID4+ICB9Owo+ID4+PiA+Pgo+ID4+PiA+PiAgc3RydWN0IHhnZW5lX21zaSB7Cj4gPj4+ID4+\n" - "IC0gICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAgICAgICpub2RlOwo+ID4+PiA+PiArICAgICBzdHJ1\n" - "Y3QgZndub2RlX2hhbmRsZSAgICAqZndub2RlOwo+ID4+PiA+PiAgICAgICBzdHJ1Y3QgaXJxX2Rv\n" - "bWFpbiAgICAgICAqaW5uZXJfZG9tYWluOwo+ID4+PiA+PiAgICAgICBzdHJ1Y3QgaXJxX2RvbWFp\n" - "biAgICAgICAqbXNpX2RvbWFpbjsKPiA+Pj4gPj4gICAgICAgdTY0ICAgICAgICAgICAgICAgICAg\n" - "ICAgbXNpX2FkZHI7Cj4gPj4+ID4+IEBAIC0yNDksNiArMjUwLDEzIEBAIHN0YXRpYyB2b2lkIHhn\n" - "ZW5lX2lycV9kb21haW5fZnJlZShzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLAo+ID4+PiA+PiAg\n" - "ICAgICAuZnJlZSAgID0geGdlbmVfaXJxX2RvbWFpbl9mcmVlLAo+ID4+PiA+PiAgfTsKPiA+Pj4g\n" - "Pj4KPiA+Pj4gPj4gKyNpZmRlZiBDT05GSUdfQUNQSQo+ID4+PiA+PiArc3RhdGljIHN0cnVjdCBm\n" - "d25vZGVfaGFuZGxlICp4Z2VuZV9tc2lfZ2V0X2Z3bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4g\n" - "Pj4+ID4+ICt7Cj4gPj4+ID4+ICsgICAgIHJldHVybiB4Z2VuZV9tc2lfY3RybC5md25vZGU7Cj4g\n" - "Pj4+ID4+ICt9Cj4gPj4+ID4+ICsjZW5kaWYKPiA+Pj4gPj4gKwo+ID4+PiA+PiAgc3RhdGljIGlu\n" - "dCB4Z2VuZV9hbGxvY2F0ZV9kb21haW5zKHN0cnVjdCB4Z2VuZV9tc2kgKm1zaSkKPiA+Pj4gPj4g\n" - "IHsKPiA+Pj4gPj4gICAgICAgbXNpLT5pbm5lcl9kb21haW4gPSBpcnFfZG9tYWluX2FkZF9saW5l\n" - "YXIoTlVMTCwgTlJfTVNJX1ZFQywKPiA+Pj4gPj4gQEAgLTI1Niw3ICsyNjQsNyBAQCBzdGF0aWMg\n" - "aW50IHhnZW5lX2FsbG9jYXRlX2RvbWFpbnMoc3RydWN0IHhnZW5lX21zaSAqbXNpKQo+ID4+PiA+\n" - "PiAgICAgICBpZiAoIW1zaS0+aW5uZXJfZG9tYWluKQo+ID4+PiA+PiAgICAgICAgICAgICAgIHJl\n" - "dHVybiAtRU5PTUVNOwo+ID4+PiA+Pgo+ID4+PiA+PiAtICAgICBtc2ktPm1zaV9kb21haW4gPSBw\n" - "Y2lfbXNpX2NyZWF0ZV9pcnFfZG9tYWluKG9mX25vZGVfdG9fZndub2RlKG1zaS0+bm9kZSksCj4g\n" - "Pj4+ID4+ICsgICAgIG1zaS0+bXNpX2RvbWFpbiA9IHBjaV9tc2lfY3JlYXRlX2lycV9kb21haW4o\n" - "bXNpLT5md25vZGUsCj4gPj4+ID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgJnhnZW5lX21zaV9kb21haW5faW5mbywKPiA+Pj4gPj4gICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2ktPmlubmVyX2RvbWFp\n" - "bik7Cj4gPj4+ID4+Cj4gPj4+ID4+IEBAIC0yNjUsNiArMjczLDkgQEAgc3RhdGljIGludCB4Z2Vu\n" - "ZV9hbGxvY2F0ZV9kb21haW5zKHN0cnVjdCB4Z2VuZV9tc2kgKm1zaSkKPiA+Pj4gPj4gICAgICAg\n" - "ICAgICAgICByZXR1cm4gLUVOT01FTTsKPiA+Pj4gPj4gICAgICAgfQo+ID4+PiA+Pgo+ID4+PiA+\n" - "PiArI2lmZGVmIENPTkZJR19BQ1BJCj4gPj4+ID4+ICsgICAgIHBjaV9tc2lfcmVnaXN0ZXJfZndu\n" - "b2RlX3Byb3ZpZGVyKCZ4Z2VuZV9tc2lfZ2V0X2Z3bm9kZSk7Cj4gPj4+ID4+ICsjZW5kaWYKPiA+\n" - "Pj4gPj4gICAgICAgcmV0dXJuIDA7Cj4gPj4+ID4+ICB9Cj4gPj4+ID4+Cj4gPj4+ID4+IEBAIC00\n" - "NDksNiArNDYwLDEzIEBAIHN0YXRpYyBpbnQgeGdlbmVfbXNpX2h3aXJxX2ZyZWUodW5zaWduZWQg\n" - "aW50IGNwdSkKPiA+Pj4gPj4gICAgICAge30sCj4gPj4+ID4+ICB9Owo+ID4+PiA+Pgo+ID4+PiA+\n" - "PiArI2lmZGVmIENPTkZJR19BQ1BJCj4gPj4+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlf\n" - "ZGV2aWNlX2lkIHhnZW5lX21zaV9hY3BpX2lkc1tdID0gewo+ID4+PiA+PiArICAgICB7IkFQTUMw\n" - "RDBFIiwgMH0sCj4gPj4+ID4+ICsgICAgIHsgfSwKPiA+Pj4gPj4gK307Cj4gPj4+ID4+ICsjZW5k\n" - "aWYKPiA+Pj4gPj4gKwo+ID4+PiA+PiAgc3RhdGljIGludCB4Z2VuZV9tc2lfcHJvYmUoc3RydWN0\n" - "IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+Pj4gPj4gIHsKPiA+Pj4gPj4gICAgICAgc3RydWN0\n" - "IHJlc291cmNlICpyZXM7Cj4gPj4+ID4+IEBAIC00NjksNyArNDg3LDE3IEBAIHN0YXRpYyBpbnQg\n" - "eGdlbmVfbXNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPj4+ID4+ICAg\n" - "ICAgICAgICAgICAgZ290byBlcnJvcjsKPiA+Pj4gPj4gICAgICAgfQo+ID4+PiA+PiAgICAgICB4\n" - "Z2VuZV9tc2ktPm1zaV9hZGRyID0gcmVzLT5zdGFydDsKPiA+Pj4gPj4gLSAgICAgeGdlbmVfbXNp\n" - "LT5ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7Cj4gPj4+ID4+ICsKPiA+Pj4gPj4gKyAgICAgeGdl\n" - "bmVfbXNpLT5md25vZGUgPSBvZl9ub2RlX3RvX2Z3bm9kZShwZGV2LT5kZXYub2Zfbm9kZSk7Cj4g\n" - "Pj4+ID4+ICsgICAgIGlmICgheGdlbmVfbXNpLT5md25vZGUpIHsKPiA+Pj4gPj4gKyAgICAgICAg\n" - "ICAgICB4Z2VuZV9tc2ktPmZ3bm9kZSA9IGlycV9kb21haW5fYWxsb2NfZndub2RlKE5VTEwpOwo+\n" - "ID4+PiA+Cj4gPj4+ID4gUGxlYXNlIHByb3ZpZGUgc29tZXRoaW5nIG90aGVyIHRoYW4gTlVMTCwg\n" - "c3VjaCBhcyB0aGUgYmFzZSBhZGRyZXNzIGlmCj4gPj4+ID4gdGhlIGRldmljZS4gVGhhdCdzIHF1\n" - "aXRlIHVzZWZ1bCBmb3IgZGVidWdnaW5nLgo+ID4+PiA+Cj4gPj4+ID4+ICsgICAgICAgICAgICAg\n" - "aWYgKCF4Z2VuZV9tc2ktPmZ3bm9kZSkgewo+ID4+PiA+PiArICAgICAgICAgICAgICAgICAgICAg\n" - "ZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBmd25vZGVcbiIpOwo+ID4+PiA+\n" - "PiArICAgICAgICAgICAgICAgICAgICAgcmMgPSBFTk9NRU07Cj4gPj4+ID4+ICsgICAgICAgICAg\n" - "ICAgICAgICAgICBnb3RvIGVycm9yOwo+ID4+PiA+PiArICAgICAgICAgICAgIH0KPiA+Pj4gPj4g\n" - "KyAgICAgfQo+ID4+PiA+PiArCj4gPj4+ID4+ICAgICAgIHhnZW5lX21zaS0+bnVtX2NwdXMgPSBu\n" - "dW1fcG9zc2libGVfY3B1cygpOwo+ID4+PiA+Pgo+ID4+PiA+PiAgICAgICByYyA9IHhnZW5lX21z\n" - "aV9pbml0X2FsbG9jYXRvcih4Z2VuZV9tc2kpOwo+ID4+PiA+PiBAQCAtNTQwLDYgKzU2OCw3IEBA\n" - "IHN0YXRpYyBpbnQgeGdlbmVfbXNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYp\n" - "Cj4gPj4+ID4+ICAgICAgIC5kcml2ZXIgPSB7Cj4gPj4+ID4+ICAgICAgICAgICAgICAgLm5hbWUg\n" - "PSAieGdlbmUtbXNpIiwKPiA+Pj4gPj4gICAgICAgICAgICAgICAub2ZfbWF0Y2hfdGFibGUgPSB4\n" - "Z2VuZV9tc2lfbWF0Y2hfdGFibGUsCj4gPj4+ID4+ICsgICAgICAgICAgICAgLmFjcGlfbWF0Y2hf\n" - "dGFibGUgPSBBQ1BJX1BUUih4Z2VuZV9tc2lfYWNwaV9pZHMpLAo+ID4+PiA+PiAgICAgICB9LAo+\n" - "ID4+PiA+PiAgICAgICAucHJvYmUgPSB4Z2VuZV9tc2lfcHJvYmUsCj4gPj4+ID4+ICAgICAgIC5y\n" - "ZW1vdmUgPSB4Z2VuZV9tc2lfcmVtb3ZlLAo+ID4+PiA+Pgo+ID4+PiA+Cj4gPj4+ID4gVGhlIGNv\n" - "ZGUgaXMgdHJpdmlhbCwgYnV0IHJlbGllcyBvbiB0aGUgTVNJIGNvbnRyb2xsZXIgdG8gcHJvYmUg\n" - "YmVmb3JlCj4gPj4+ID4gdGhlIFBDSSBidXMuIFdoYXQgZW5mb3JjZXMgdGhpcz8gSG93IGlzIGl0\n" - "IG1ha2luZyBzdXJlIHRoYXQgdGhpcyBpcyBub3QKPiA+Pj4gPiBnb2luZyB0byBicmVhayBpbiB0\n" - "aGUgbmV4dCBrZXJuZWwgcmVsZWFzZT8gQXMgZmFyIGFzIEkgY2FuIHRlbGwsIHRoZXJlCj4gPj4+\n" - "ID4gaXMgbm8gZXhwbGljaXQgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSB0d28sIG1ha2luZyBpdCB0\n" - "aGUgd2hvbGUgdGhpbmcKPiA+Pj4gPiBleHRyZW1lbHkgZnJhZ2lsZS4KPiA+Pj4gPgo+ID4+PiA+\n" - "IFRoYW5rcywKPiA+Pj4gPgo+ID4+PiA+ICAgICAgICAgTS4KPiA+Pj4gPiAtLQo+ID4+PiA+IEph\n" - "enogaXMgbm90IGRlYWQuIEl0IGp1c3Qgc21lbGxzIGZ1bm55Li4uCj4gPj4+Cj4gPj4+IC0tCgpf\n" - "X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0t\n" - "a2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcK\n" - "aHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2Vy\n" - bmVsCg== + "On Tue, Jun 06, 2017 at 09:44:15AM -0700, Khuong Dinh wrote:\n" + "> Hi Lorenzo,\n" + "> \n" + "> On Tue, May 9, 2017 at 3:55 PM, Khuong Dinh <kdinh@apm.com> wrote:\n" + "> > Hi Lorenzo,\n" + "> >\n" + "> > On Fri, May 5, 2017 at 9:51 AM, Lorenzo Pieralisi\n" + "> > <lorenzo.pieralisi@arm.com> wrote:\n" + "> >> On Thu, May 04, 2017 at 05:36:06PM -0700, Khuong Dinh wrote:\n" + "> >>> Hi Marc,\n" + "> >>> There's no explicit dependency between pcie driver and msi\n" + "> >>> controller. The current solution that we did is relying on the\n" + "> >>> node ordering in BIOS. ACPI 5.0 introduced _DEP method to assign a\n" + "> >>> higher priority in start ordering. This method could be applied in\n" + "> >>> case of msi and pcie are the same level of subsys_init (in ACPI\n" + "> >>> boot). However, PCIe driver has not supported for this dependency\n" + "> >>> check yet. How do you think about this solution.\n" + "> >>\n" + "> >> First off, you can't post emails with confidentiality notices on\n" + "> >> mailing lists so remove it from now onwards.\n" + "> >\n" + "> > Fixed\n" + "> >\n" + "> >> Secondly, I commented on this before, so you know what my opinion is.\n" + "> >\n" + "> > I got your opinion. I'll implement as your suggestion.\n" + "> >\n" + "> \n" + "> Regarding to your previous suggestion to add a hook walking the ACPI\n" + "> namespace before acpi_bus_scan() in acpi_scan_init() to make MSI\n" + "> controllers must be probed before PCI. I have a concern that the\n" + "> MSI namespace ? _SB.MSIX? is not a unique name and how can we walk\n" + "> the ACPI namespace and use this name to make MSI probed before PCI.\n" + "> May you have little bit more information for this or do you have\n" + "> another suggestion for this?\n" + "> \n" + "> There?s another solution which makes this simpler and I?d like to\n" + "> ask your opinion about this.\n" + "> The solution is to make an hierarchy between MSI and PCI nodes as below:\n" + "> Device(\\_SB.MSIX) {\n" + "> Device(\\_SB.PCI0)\n" + "> Device(\\_SB.PCI1)\n" + "> ??\n" + "> }\n" + "> In other word, MSIX node is a parent node of PCI nodes in ACPI\n" + "> table. In this sense, there?s an explicit dependency between MSI\n" + "> and PCI, MSI controller must be probed before PCI and it will\n" + "> guarantee not breaking next kernel releases. How do you think about\n" + "> this solution.\n" + "\n" + "I think that's a plaster as ineffective as reordering nodes, in short\n" + "it is not a solution and you still rely on kernel link ordering, you\n" + "can fiddle with ACPI tables as much as you want but that does not change.\n" + "\n" + "> I also tried to use _DEP method to describe the dependency of PCIe\n" + "> nodes, but it looks that it does not work as PCI and MSI are handed\n" + "> by acpi_bus_scan and still having issue when we re-probe PCI.\n" + "\n" + "That's a tad vague to be frank, anyway it is pretty clear to me that we\n" + "have hit a wall. In ACPI there is no way to describe probe dependencies\n" + "like the one you have, it is as simple as that, and this MSI issue you\n" + "are facing is just an example, there are more eg:\n" + "\n" + "https://www.spinics.net/lists/arm-kernel/msg585825.html\n" + "\n" + "At the end of the day the choice is simple either we accept (and we\n" + "maintain because that's the problem) these hacks - and I am not willing\n" + "to do that - or we find a way to solve this from a general perspective not\n" + "as a point hack.\n" + "\n" + "I can have a look at solving the whole issue but it won't happen\n" + "tomorrow.\n" + "\n" + "Thanks,\n" + "Lorenzo\n" + "\n" + "> Thanks,\n" + "> Khuong Dinh\n" + "> \n" + "> >> Finally, please execute this command on the vmlinux that \"works\"\n" + "> >> for you:\n" + "> >>\n" + "> >> nm vmlinux | grep -E '__initcall_(xgene_pcie_msi_init|acpi_init)'\n" + "> >\n" + "> > $ nm vmlinux | grep -E '__initcall_(xgene_pcie_msi_init|acpi_init)'\n" + "> > ffff000008dab2d8 t __initcall_acpi_init4\n" + "> > ffff000008dab2c8 t __initcall_xgene_pcie_msi_init4\n" + "> >\n" + "> > Best regards,\n" + "> > Khuong Dinh\n" + "> >\n" + "> >> Even by ordering devices in the ACPI tables (that I abhor) I still do\n" + "> >> not understand how this works (I mean without relying on kernel link\n" + "> >> order to ensure that the MSI driver is probed before PCI devices are\n" + "> >> enumerated in acpi_init()).\n" + "> >>\n" + "> >> Thanks,\n" + "> >> Lorenzo\n" + "> >>\n" + "> >>> Best regards,\n" + "> >>> Khuong\n" + "> >>>\n" + "> >>> On Fri, Apr 28, 2017 at 2:27 AM, Marc Zyngier <marc.zyngier@arm.com> wrote:\n" + "> >>> > On 28/04/17 01:54, Khuong Dinh wrote:\n" + "> >>> >> From: Khuong Dinh <kdinh@apm.com>\n" + "> >>> >>\n" + "> >>> >> This patch makes pci-xgene-msi driver ACPI-aware and provides\n" + "> >>> >> MSI capability for X-Gene v1 PCIe controllers in ACPI boot mode.\n" + "> >>> >>\n" + "> >>> >> Signed-off-by: Khuong Dinh <kdinh@apm.com>\n" + "> >>> >> Signed-off-by: Duc Dang <dhdang@apm.com>\n" + "> >>> >> Acked-by: Marc Zyngier <marc.zyngier@arm.com>\n" + "> >>> >> ---\n" + "> >>> >> v2:\n" + "> >>> >> - Verify with BIOS version 3.06.25 and 3.07.09\n" + "> >>> >> v1:\n" + "> >>> >> - Initial version\n" + "> >>> >> ---\n" + "> >>> >> drivers/pci/host/pci-xgene-msi.c | 35 ++++++++++++++++++++++++++++++++---\n" + "> >>> >> 1 files changed, 32 insertions(+), 3 deletions(-)\n" + "> >>> >>\n" + "> >>> >> diff --git a/drivers/pci/host/pci-xgene-msi.c b/drivers/pci/host/pci-xgene-msi.c\n" + "> >>> >> index f1b633b..00aaa3d 100644\n" + "> >>> >> --- a/drivers/pci/host/pci-xgene-msi.c\n" + "> >>> >> +++ b/drivers/pci/host/pci-xgene-msi.c\n" + "> >>> >> @@ -24,6 +24,7 @@\n" + "> >>> >> #include <linux/pci.h>\n" + "> >>> >> #include <linux/platform_device.h>\n" + "> >>> >> #include <linux/of_pci.h>\n" + "> >>> >> +#include <linux/acpi.h>\n" + "> >>> >>\n" + "> >>> >> #define MSI_IR0 0x000000\n" + "> >>> >> #define MSI_INT0 0x800000\n" + "> >>> >> @@ -39,7 +40,7 @@ struct xgene_msi_group {\n" + "> >>> >> };\n" + "> >>> >>\n" + "> >>> >> struct xgene_msi {\n" + "> >>> >> - struct device_node *node;\n" + "> >>> >> + struct fwnode_handle *fwnode;\n" + "> >>> >> struct irq_domain *inner_domain;\n" + "> >>> >> struct irq_domain *msi_domain;\n" + "> >>> >> u64 msi_addr;\n" + "> >>> >> @@ -249,6 +250,13 @@ static void xgene_irq_domain_free(struct irq_domain *domain,\n" + "> >>> >> .free = xgene_irq_domain_free,\n" + "> >>> >> };\n" + "> >>> >>\n" + "> >>> >> +#ifdef CONFIG_ACPI\n" + "> >>> >> +static struct fwnode_handle *xgene_msi_get_fwnode(struct device *dev)\n" + "> >>> >> +{\n" + "> >>> >> + return xgene_msi_ctrl.fwnode;\n" + "> >>> >> +}\n" + "> >>> >> +#endif\n" + "> >>> >> +\n" + "> >>> >> static int xgene_allocate_domains(struct xgene_msi *msi)\n" + "> >>> >> {\n" + "> >>> >> msi->inner_domain = irq_domain_add_linear(NULL, NR_MSI_VEC,\n" + "> >>> >> @@ -256,7 +264,7 @@ static int xgene_allocate_domains(struct xgene_msi *msi)\n" + "> >>> >> if (!msi->inner_domain)\n" + "> >>> >> return -ENOMEM;\n" + "> >>> >>\n" + "> >>> >> - msi->msi_domain = pci_msi_create_irq_domain(of_node_to_fwnode(msi->node),\n" + "> >>> >> + msi->msi_domain = pci_msi_create_irq_domain(msi->fwnode,\n" + "> >>> >> &xgene_msi_domain_info,\n" + "> >>> >> msi->inner_domain);\n" + "> >>> >>\n" + "> >>> >> @@ -265,6 +273,9 @@ static int xgene_allocate_domains(struct xgene_msi *msi)\n" + "> >>> >> return -ENOMEM;\n" + "> >>> >> }\n" + "> >>> >>\n" + "> >>> >> +#ifdef CONFIG_ACPI\n" + "> >>> >> + pci_msi_register_fwnode_provider(&xgene_msi_get_fwnode);\n" + "> >>> >> +#endif\n" + "> >>> >> return 0;\n" + "> >>> >> }\n" + "> >>> >>\n" + "> >>> >> @@ -449,6 +460,13 @@ static int xgene_msi_hwirq_free(unsigned int cpu)\n" + "> >>> >> {},\n" + "> >>> >> };\n" + "> >>> >>\n" + "> >>> >> +#ifdef CONFIG_ACPI\n" + "> >>> >> +static const struct acpi_device_id xgene_msi_acpi_ids[] = {\n" + "> >>> >> + {\"APMC0D0E\", 0},\n" + "> >>> >> + { },\n" + "> >>> >> +};\n" + "> >>> >> +#endif\n" + "> >>> >> +\n" + "> >>> >> static int xgene_msi_probe(struct platform_device *pdev)\n" + "> >>> >> {\n" + "> >>> >> struct resource *res;\n" + "> >>> >> @@ -469,7 +487,17 @@ static int xgene_msi_probe(struct platform_device *pdev)\n" + "> >>> >> goto error;\n" + "> >>> >> }\n" + "> >>> >> xgene_msi->msi_addr = res->start;\n" + "> >>> >> - xgene_msi->node = pdev->dev.of_node;\n" + "> >>> >> +\n" + "> >>> >> + xgene_msi->fwnode = of_node_to_fwnode(pdev->dev.of_node);\n" + "> >>> >> + if (!xgene_msi->fwnode) {\n" + "> >>> >> + xgene_msi->fwnode = irq_domain_alloc_fwnode(NULL);\n" + "> >>> >\n" + "> >>> > Please provide something other than NULL, such as the base address if\n" + "> >>> > the device. That's quite useful for debugging.\n" + "> >>> >\n" + "> >>> >> + if (!xgene_msi->fwnode) {\n" + "> >>> >> + dev_err(&pdev->dev, \"Failed to create fwnode\\n\");\n" + "> >>> >> + rc = ENOMEM;\n" + "> >>> >> + goto error;\n" + "> >>> >> + }\n" + "> >>> >> + }\n" + "> >>> >> +\n" + "> >>> >> xgene_msi->num_cpus = num_possible_cpus();\n" + "> >>> >>\n" + "> >>> >> rc = xgene_msi_init_allocator(xgene_msi);\n" + "> >>> >> @@ -540,6 +568,7 @@ static int xgene_msi_probe(struct platform_device *pdev)\n" + "> >>> >> .driver = {\n" + "> >>> >> .name = \"xgene-msi\",\n" + "> >>> >> .of_match_table = xgene_msi_match_table,\n" + "> >>> >> + .acpi_match_table = ACPI_PTR(xgene_msi_acpi_ids),\n" + "> >>> >> },\n" + "> >>> >> .probe = xgene_msi_probe,\n" + "> >>> >> .remove = xgene_msi_remove,\n" + "> >>> >>\n" + "> >>> >\n" + "> >>> > The code is trivial, but relies on the MSI controller to probe before\n" + "> >>> > the PCI bus. What enforces this? How is it making sure that this is not\n" + "> >>> > going to break in the next kernel release? As far as I can tell, there\n" + "> >>> > is no explicit dependency between the two, making it the whole thing\n" + "> >>> > extremely fragile.\n" + "> >>> >\n" + "> >>> > Thanks,\n" + "> >>> >\n" + "> >>> > M.\n" + "> >>> > --\n" + "> >>> > Jazz is not dead. It just smells funny...\n" + "> >>>\n" + > >>> -- -8a64b8f259c3b7e5d6c679eb012febb7bc95c1e9ccf4d97d3b58169197701ef6 +71d86291dd90ffc66ea46a8acb93267ba8bd0b6586f2650a0e35f04625cf2b28
diff --git a/a/1.txt b/N2/1.txt index 85675fc..407fca9 100644 --- a/a/1.txt +++ b/N2/1.txt @@ -1,166 +1,235 @@ -T24gVHVlLCBKdW4gMDYsIDIwMTcgYXQgMDk6NDQ6MTVBTSAtMDcwMCwgS2h1b25nIERpbmggd3Jv -dGU6Cj4gSGkgTG9yZW56bywKPiAKPiBPbiBUdWUsIE1heSA5LCAyMDE3IGF0IDM6NTUgUE0sIEto -dW9uZyBEaW5oIDxrZGluaEBhcG0uY29tPiB3cm90ZToKPiA+IEhpIExvcmVuem8sCj4gPgo+ID4g -T24gRnJpLCBNYXkgNSwgMjAxNyBhdCA5OjUxIEFNLCBMb3JlbnpvIFBpZXJhbGlzaQo+ID4gPGxv -cmVuem8ucGllcmFsaXNpQGFybS5jb20+IHdyb3RlOgo+ID4+IE9uIFRodSwgTWF5IDA0LCAyMDE3 -IGF0IDA1OjM2OjA2UE0gLTA3MDAsIEtodW9uZyBEaW5oIHdyb3RlOgo+ID4+PiBIaSBNYXJjLAo+ -ID4+PiBUaGVyZSdzIG5vIGV4cGxpY2l0IGRlcGVuZGVuY3kgYmV0d2VlbiBwY2llIGRyaXZlciBh -bmQgbXNpCj4gPj4+IGNvbnRyb2xsZXIuICBUaGUgY3VycmVudCBzb2x1dGlvbiB0aGF0IHdlIGRp -ZCBpcyByZWx5aW5nIG9uIHRoZQo+ID4+PiBub2RlIG9yZGVyaW5nIGluIEJJT1MuICBBQ1BJIDUu -MCBpbnRyb2R1Y2VkIF9ERVAgbWV0aG9kIHRvIGFzc2lnbiBhCj4gPj4+IGhpZ2hlciBwcmlvcml0 -eSBpbiBzdGFydCBvcmRlcmluZy4gIFRoaXMgbWV0aG9kIGNvdWxkIGJlIGFwcGxpZWQgaW4KPiA+ -Pj4gY2FzZSBvZiBtc2kgYW5kIHBjaWUgYXJlIHRoZSBzYW1lIGxldmVsIG9mIHN1YnN5c19pbml0 -IChpbiBBQ1BJCj4gPj4+IGJvb3QpLiAgSG93ZXZlciwgUENJZSBkcml2ZXIgaGFzIG5vdCBzdXBw -b3J0ZWQgZm9yIHRoaXMgZGVwZW5kZW5jeQo+ID4+PiBjaGVjayB5ZXQuICBIb3cgZG8geW91IHRo -aW5rIGFib3V0IHRoaXMgc29sdXRpb24uCj4gPj4KPiA+PiBGaXJzdCBvZmYsIHlvdSBjYW4ndCBw -b3N0IGVtYWlscyB3aXRoIGNvbmZpZGVudGlhbGl0eSBub3RpY2VzIG9uCj4gPj4gbWFpbGluZyBs -aXN0cyBzbyByZW1vdmUgaXQgZnJvbSBub3cgb253YXJkcy4KPiA+Cj4gPiBGaXhlZAo+ID4KPiA+ -PiBTZWNvbmRseSwgSSBjb21tZW50ZWQgb24gdGhpcyBiZWZvcmUsIHNvIHlvdSBrbm93IHdoYXQg -bXkgb3BpbmlvbiBpcy4KPiA+Cj4gPiBJIGdvdCB5b3VyIG9waW5pb24uIEknbGwgaW1wbGVtZW50 -IGFzIHlvdXIgc3VnZ2VzdGlvbi4KPiA+Cj4gCj4gICBSZWdhcmRpbmcgdG8geW91ciBwcmV2aW91 -cyBzdWdnZXN0aW9uIHRvIGFkZCBhIGhvb2sgd2Fsa2luZyB0aGUgQUNQSQo+ICAgbmFtZXNwYWNl -IGJlZm9yZSBhY3BpX2J1c19zY2FuKCkgaW4gYWNwaV9zY2FuX2luaXQoKSB0byBtYWtlIE1TSQo+ -ICAgY29udHJvbGxlcnMgbXVzdCBiZSBwcm9iZWQgYmVmb3JlIFBDSS4gIEkgaGF2ZSBhIGNvbmNl -cm4gdGhhdCB0aGUKPiAgIE1TSSBuYW1lc3BhY2Ug4oCcIF9TQi5NU0lY4oCdIGlzIG5vdCBhIHVu -aXF1ZSBuYW1lIGFuZCBob3cgY2FuIHdlIHdhbGsKPiAgIHRoZSBBQ1BJIG5hbWVzcGFjZSBhbmQg -dXNlIHRoaXMgbmFtZSB0byBtYWtlIE1TSSBwcm9iZWQgYmVmb3JlIFBDSS4KPiAgIE1heSB5b3Ug -aGF2ZSBsaXR0bGUgYml0IG1vcmUgaW5mb3JtYXRpb24gZm9yIHRoaXMgb3IgZG8geW91IGhhdmUK -PiAgIGFub3RoZXIgc3VnZ2VzdGlvbiBmb3IgdGhpcz8KPiAKPiAgICBUaGVyZeKAmXMgYW5vdGhl -ciBzb2x1dGlvbiB3aGljaCBtYWtlcyB0aGlzIHNpbXBsZXIgYW5kIEnigJlkIGxpa2UgdG8KPiAg -ICBhc2sgeW91ciBvcGluaW9uIGFib3V0IHRoaXMuCj4gICAgVGhlIHNvbHV0aW9uIGlzIHRvIG1h -a2UgYW4gaGllcmFyY2h5IGJldHdlZW4gTVNJIGFuZCBQQ0kgbm9kZXMgIGFzIGJlbG93Ogo+IERl -dmljZShcX1NCLk1TSVgpIHsKPiAgICBEZXZpY2UoXF9TQi5QQ0kwKQo+ICAgIERldmljZShcX1NC -LlBDSTEpCj4gICAg4oCm4oCmCj4gfQo+ICAgSW4gb3RoZXIgd29yZCwgTVNJWCBub2RlIGlzIGEg -cGFyZW50IG5vZGUgb2YgUENJIG5vZGVzIGluIEFDUEkKPiAgIHRhYmxlLiAgSW4gdGhpcyBzZW5z -ZSwgdGhlcmXigJlzIGFuIGV4cGxpY2l0IGRlcGVuZGVuY3kgYmV0d2VlbiBNU0kKPiAgIGFuZCBQ -Q0ksIE1TSSBjb250cm9sbGVyIG11c3QgYmUgcHJvYmVkIGJlZm9yZSBQQ0kgYW5kIGl0IHdpbGwK -PiAgIGd1YXJhbnRlZSBub3QgYnJlYWtpbmcgbmV4dCBrZXJuZWwgcmVsZWFzZXMuICBIb3cgZG8g -eW91IHRoaW5rIGFib3V0Cj4gICB0aGlzIHNvbHV0aW9uLgoKSSB0aGluayB0aGF0J3MgYSBwbGFz -dGVyIGFzIGluZWZmZWN0aXZlIGFzIHJlb3JkZXJpbmcgbm9kZXMsIGluIHNob3J0Cml0IGlzIG5v -dCBhIHNvbHV0aW9uIGFuZCB5b3Ugc3RpbGwgcmVseSBvbiBrZXJuZWwgbGluayBvcmRlcmluZywg -eW91CmNhbiBmaWRkbGUgd2l0aCBBQ1BJIHRhYmxlcyBhcyBtdWNoIGFzIHlvdSB3YW50IGJ1dCB0 -aGF0IGRvZXMgbm90IGNoYW5nZS4KCj4gIEkgYWxzbyB0cmllZCB0byB1c2UgX0RFUCBtZXRob2Qg -dG8gZGVzY3JpYmUgdGhlIGRlcGVuZGVuY3kgb2YgUENJZQo+ICBub2RlcywgYnV0IGl0IGxvb2tz -IHRoYXQgaXQgZG9lcyBub3Qgd29yayBhcyBQQ0kgYW5kIE1TSSBhcmUgaGFuZGVkCj4gIGJ5IGFj -cGlfYnVzX3NjYW4gYW5kIHN0aWxsIGhhdmluZyBpc3N1ZSB3aGVuIHdlIHJlLXByb2JlIFBDSS4K -ClRoYXQncyBhIHRhZCB2YWd1ZSB0byBiZSBmcmFuaywgYW55d2F5IGl0IGlzIHByZXR0eSBjbGVh -ciB0byBtZSB0aGF0IHdlCmhhdmUgaGl0IGEgd2FsbC4gSW4gQUNQSSB0aGVyZSBpcyBubyB3YXkg -dG8gZGVzY3JpYmUgcHJvYmUgZGVwZW5kZW5jaWVzCmxpa2UgdGhlIG9uZSB5b3UgaGF2ZSwgaXQg -aXMgYXMgc2ltcGxlIGFzIHRoYXQsIGFuZCB0aGlzIE1TSSBpc3N1ZSB5b3UKYXJlIGZhY2luZyBp -cyBqdXN0IGFuIGV4YW1wbGUsIHRoZXJlIGFyZSBtb3JlIGVnOgoKaHR0cHM6Ly93d3cuc3Bpbmlj -cy5uZXQvbGlzdHMvYXJtLWtlcm5lbC9tc2c1ODU4MjUuaHRtbAoKQXQgdGhlIGVuZCBvZiB0aGUg -ZGF5IHRoZSBjaG9pY2UgaXMgc2ltcGxlIGVpdGhlciB3ZSBhY2NlcHQgKGFuZCB3ZQptYWludGFp -biBiZWNhdXNlIHRoYXQncyB0aGUgcHJvYmxlbSkgdGhlc2UgaGFja3MgLSBhbmQgSSBhbSBub3Qg -d2lsbGluZwp0byBkbyB0aGF0IC0gb3Igd2UgZmluZCBhIHdheSB0byBzb2x2ZSB0aGlzIGZyb20g -YSBnZW5lcmFsIHBlcnNwZWN0aXZlIG5vdAphcyBhIHBvaW50IGhhY2suCgpJIGNhbiBoYXZlIGEg -bG9vayBhdCBzb2x2aW5nIHRoZSB3aG9sZSBpc3N1ZSBidXQgaXQgd29uJ3QgaGFwcGVuCnRvbW9y -cm93LgoKVGhhbmtzLApMb3JlbnpvCgo+IFRoYW5rcywKPiBLaHVvbmcgRGluaAo+IAo+ID4+IEZp -bmFsbHksIHBsZWFzZSBleGVjdXRlIHRoaXMgY29tbWFuZCBvbiB0aGUgdm1saW51eCB0aGF0ICJ3 -b3JrcyIKPiA+PiBmb3IgeW91Ogo+ID4+Cj4gPj4gbm0gdm1saW51eCB8IGdyZXAgLUUgJ19faW5p -dGNhbGxfKHhnZW5lX3BjaWVfbXNpX2luaXR8YWNwaV9pbml0KScKPiA+Cj4gPiAkIG5tIHZtbGlu -dXggfCBncmVwIC1FICdfX2luaXRjYWxsXyh4Z2VuZV9wY2llX21zaV9pbml0fGFjcGlfaW5pdCkn -Cj4gPiBmZmZmMDAwMDA4ZGFiMmQ4IHQgX19pbml0Y2FsbF9hY3BpX2luaXQ0Cj4gPiBmZmZmMDAw -MDA4ZGFiMmM4IHQgX19pbml0Y2FsbF94Z2VuZV9wY2llX21zaV9pbml0NAo+ID4KPiA+IEJlc3Qg -cmVnYXJkcywKPiA+IEtodW9uZyBEaW5oCj4gPgo+ID4+IEV2ZW4gYnkgb3JkZXJpbmcgZGV2aWNl -cyBpbiB0aGUgQUNQSSB0YWJsZXMgKHRoYXQgSSBhYmhvcikgSSBzdGlsbCBkbwo+ID4+IG5vdCB1 -bmRlcnN0YW5kIGhvdyB0aGlzIHdvcmtzIChJIG1lYW4gd2l0aG91dCByZWx5aW5nIG9uIGtlcm5l -bCBsaW5rCj4gPj4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIE1TSSBkcml2ZXIgaXMgcHJvYmVk -IGJlZm9yZSBQQ0kgZGV2aWNlcyBhcmUKPiA+PiBlbnVtZXJhdGVkIGluIGFjcGlfaW5pdCgpKS4K -PiA+Pgo+ID4+IFRoYW5rcywKPiA+PiBMb3JlbnpvCj4gPj4KPiA+Pj4gQmVzdCByZWdhcmRzLAo+ -ID4+PiBLaHVvbmcKPiA+Pj4KPiA+Pj4gT24gRnJpLCBBcHIgMjgsIDIwMTcgYXQgMjoyNyBBTSwg -TWFyYyBaeW5naWVyIDxtYXJjLnp5bmdpZXJAYXJtLmNvbT4gd3JvdGU6Cj4gPj4+ID4gT24gMjgv -MDQvMTcgMDE6NTQsIEtodW9uZyBEaW5oIHdyb3RlOgo+ID4+PiA+PiBGcm9tOiBLaHVvbmcgRGlu -aCA8a2RpbmhAYXBtLmNvbT4KPiA+Pj4gPj4KPiA+Pj4gPj4gVGhpcyBwYXRjaCBtYWtlcyBwY2kt -eGdlbmUtbXNpIGRyaXZlciBBQ1BJLWF3YXJlIGFuZCBwcm92aWRlcwo+ID4+PiA+PiBNU0kgY2Fw -YWJpbGl0eSBmb3IgWC1HZW5lIHYxIFBDSWUgY29udHJvbGxlcnMgaW4gQUNQSSBib290IG1vZGUu -Cj4gPj4+ID4+Cj4gPj4+ID4+IFNpZ25lZC1vZmYtYnk6IEtodW9uZyBEaW5oIDxrZGluaEBhcG0u -Y29tPgo+ID4+PiA+PiBTaWduZWQtb2ZmLWJ5OiBEdWMgRGFuZyA8ZGhkYW5nQGFwbS5jb20+Cj4g -Pj4+ID4+IEFja2VkLWJ5OiBNYXJjIFp5bmdpZXIgPG1hcmMuenluZ2llckBhcm0uY29tPgo+ID4+ -PiA+PiAtLS0KPiA+Pj4gPj4gdjI6Cj4gPj4+ID4+ICAtIFZlcmlmeSB3aXRoIEJJT1MgdmVyc2lv -biAzLjA2LjI1IGFuZCAzLjA3LjA5Cj4gPj4+ID4+IHYxOgo+ID4+PiA+PiAgLSBJbml0aWFsIHZl -cnNpb24KPiA+Pj4gPj4gLS0tCj4gPj4+ID4+ICBkcml2ZXJzL3BjaS9ob3N0L3BjaS14Z2VuZS1t -c2kuYyB8ICAgMzUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0KPiA+Pj4gPj4g -IDEgZmlsZXMgY2hhbmdlZCwgMzIgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKPiA+Pj4g -Pj4KPiA+Pj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLXhnZW5lLW1zaS5j -IGIvZHJpdmVycy9wY2kvaG9zdC9wY2kteGdlbmUtbXNpLmMKPiA+Pj4gPj4gaW5kZXggZjFiNjMz -Yi4uMDBhYWEzZCAxMDA2NDQKPiA+Pj4gPj4gLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2kteGdl -bmUtbXNpLmMKPiA+Pj4gPj4gKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2kteGdlbmUtbXNpLmMK -PiA+Pj4gPj4gQEAgLTI0LDYgKzI0LDcgQEAKPiA+Pj4gPj4gICNpbmNsdWRlIDxsaW51eC9wY2ku -aD4KPiA+Pj4gPj4gICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiA+Pj4gPj4g -ICNpbmNsdWRlIDxsaW51eC9vZl9wY2kuaD4KPiA+Pj4gPj4gKyNpbmNsdWRlIDxsaW51eC9hY3Bp -Lmg+Cj4gPj4+ID4+Cj4gPj4+ID4+ICAjZGVmaW5lIE1TSV9JUjAgICAgICAgICAgICAgICAgICAg -ICAgMHgwMDAwMDAKPiA+Pj4gPj4gICNkZWZpbmUgTVNJX0lOVDAgICAgICAgICAgICAgMHg4MDAw -MDAKPiA+Pj4gPj4gQEAgLTM5LDcgKzQwLDcgQEAgc3RydWN0IHhnZW5lX21zaV9ncm91cCB7Cj4g -Pj4+ID4+ICB9Owo+ID4+PiA+Pgo+ID4+PiA+PiAgc3RydWN0IHhnZW5lX21zaSB7Cj4gPj4+ID4+ -IC0gICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAgICAgICpub2RlOwo+ID4+PiA+PiArICAgICBzdHJ1 -Y3QgZndub2RlX2hhbmRsZSAgICAqZndub2RlOwo+ID4+PiA+PiAgICAgICBzdHJ1Y3QgaXJxX2Rv -bWFpbiAgICAgICAqaW5uZXJfZG9tYWluOwo+ID4+PiA+PiAgICAgICBzdHJ1Y3QgaXJxX2RvbWFp -biAgICAgICAqbXNpX2RvbWFpbjsKPiA+Pj4gPj4gICAgICAgdTY0ICAgICAgICAgICAgICAgICAg -ICAgbXNpX2FkZHI7Cj4gPj4+ID4+IEBAIC0yNDksNiArMjUwLDEzIEBAIHN0YXRpYyB2b2lkIHhn -ZW5lX2lycV9kb21haW5fZnJlZShzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLAo+ID4+PiA+PiAg -ICAgICAuZnJlZSAgID0geGdlbmVfaXJxX2RvbWFpbl9mcmVlLAo+ID4+PiA+PiAgfTsKPiA+Pj4g -Pj4KPiA+Pj4gPj4gKyNpZmRlZiBDT05GSUdfQUNQSQo+ID4+PiA+PiArc3RhdGljIHN0cnVjdCBm -d25vZGVfaGFuZGxlICp4Z2VuZV9tc2lfZ2V0X2Z3bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4g -Pj4+ID4+ICt7Cj4gPj4+ID4+ICsgICAgIHJldHVybiB4Z2VuZV9tc2lfY3RybC5md25vZGU7Cj4g -Pj4+ID4+ICt9Cj4gPj4+ID4+ICsjZW5kaWYKPiA+Pj4gPj4gKwo+ID4+PiA+PiAgc3RhdGljIGlu -dCB4Z2VuZV9hbGxvY2F0ZV9kb21haW5zKHN0cnVjdCB4Z2VuZV9tc2kgKm1zaSkKPiA+Pj4gPj4g -IHsKPiA+Pj4gPj4gICAgICAgbXNpLT5pbm5lcl9kb21haW4gPSBpcnFfZG9tYWluX2FkZF9saW5l -YXIoTlVMTCwgTlJfTVNJX1ZFQywKPiA+Pj4gPj4gQEAgLTI1Niw3ICsyNjQsNyBAQCBzdGF0aWMg -aW50IHhnZW5lX2FsbG9jYXRlX2RvbWFpbnMoc3RydWN0IHhnZW5lX21zaSAqbXNpKQo+ID4+PiA+ -PiAgICAgICBpZiAoIW1zaS0+aW5uZXJfZG9tYWluKQo+ID4+PiA+PiAgICAgICAgICAgICAgIHJl -dHVybiAtRU5PTUVNOwo+ID4+PiA+Pgo+ID4+PiA+PiAtICAgICBtc2ktPm1zaV9kb21haW4gPSBw -Y2lfbXNpX2NyZWF0ZV9pcnFfZG9tYWluKG9mX25vZGVfdG9fZndub2RlKG1zaS0+bm9kZSksCj4g -Pj4+ID4+ICsgICAgIG1zaS0+bXNpX2RvbWFpbiA9IHBjaV9tc2lfY3JlYXRlX2lycV9kb21haW4o -bXNpLT5md25vZGUsCj4gPj4+ID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgJnhnZW5lX21zaV9kb21haW5faW5mbywKPiA+Pj4gPj4gICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2ktPmlubmVyX2RvbWFp -bik7Cj4gPj4+ID4+Cj4gPj4+ID4+IEBAIC0yNjUsNiArMjczLDkgQEAgc3RhdGljIGludCB4Z2Vu -ZV9hbGxvY2F0ZV9kb21haW5zKHN0cnVjdCB4Z2VuZV9tc2kgKm1zaSkKPiA+Pj4gPj4gICAgICAg -ICAgICAgICByZXR1cm4gLUVOT01FTTsKPiA+Pj4gPj4gICAgICAgfQo+ID4+PiA+Pgo+ID4+PiA+ -PiArI2lmZGVmIENPTkZJR19BQ1BJCj4gPj4+ID4+ICsgICAgIHBjaV9tc2lfcmVnaXN0ZXJfZndu -b2RlX3Byb3ZpZGVyKCZ4Z2VuZV9tc2lfZ2V0X2Z3bm9kZSk7Cj4gPj4+ID4+ICsjZW5kaWYKPiA+ -Pj4gPj4gICAgICAgcmV0dXJuIDA7Cj4gPj4+ID4+ICB9Cj4gPj4+ID4+Cj4gPj4+ID4+IEBAIC00 -NDksNiArNDYwLDEzIEBAIHN0YXRpYyBpbnQgeGdlbmVfbXNpX2h3aXJxX2ZyZWUodW5zaWduZWQg -aW50IGNwdSkKPiA+Pj4gPj4gICAgICAge30sCj4gPj4+ID4+ICB9Owo+ID4+PiA+Pgo+ID4+PiA+ -PiArI2lmZGVmIENPTkZJR19BQ1BJCj4gPj4+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlf -ZGV2aWNlX2lkIHhnZW5lX21zaV9hY3BpX2lkc1tdID0gewo+ID4+PiA+PiArICAgICB7IkFQTUMw -RDBFIiwgMH0sCj4gPj4+ID4+ICsgICAgIHsgfSwKPiA+Pj4gPj4gK307Cj4gPj4+ID4+ICsjZW5k -aWYKPiA+Pj4gPj4gKwo+ID4+PiA+PiAgc3RhdGljIGludCB4Z2VuZV9tc2lfcHJvYmUoc3RydWN0 -IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+Pj4gPj4gIHsKPiA+Pj4gPj4gICAgICAgc3RydWN0 -IHJlc291cmNlICpyZXM7Cj4gPj4+ID4+IEBAIC00NjksNyArNDg3LDE3IEBAIHN0YXRpYyBpbnQg -eGdlbmVfbXNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPj4+ID4+ICAg -ICAgICAgICAgICAgZ290byBlcnJvcjsKPiA+Pj4gPj4gICAgICAgfQo+ID4+PiA+PiAgICAgICB4 -Z2VuZV9tc2ktPm1zaV9hZGRyID0gcmVzLT5zdGFydDsKPiA+Pj4gPj4gLSAgICAgeGdlbmVfbXNp -LT5ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7Cj4gPj4+ID4+ICsKPiA+Pj4gPj4gKyAgICAgeGdl -bmVfbXNpLT5md25vZGUgPSBvZl9ub2RlX3RvX2Z3bm9kZShwZGV2LT5kZXYub2Zfbm9kZSk7Cj4g -Pj4+ID4+ICsgICAgIGlmICgheGdlbmVfbXNpLT5md25vZGUpIHsKPiA+Pj4gPj4gKyAgICAgICAg -ICAgICB4Z2VuZV9tc2ktPmZ3bm9kZSA9IGlycV9kb21haW5fYWxsb2NfZndub2RlKE5VTEwpOwo+ -ID4+PiA+Cj4gPj4+ID4gUGxlYXNlIHByb3ZpZGUgc29tZXRoaW5nIG90aGVyIHRoYW4gTlVMTCwg -c3VjaCBhcyB0aGUgYmFzZSBhZGRyZXNzIGlmCj4gPj4+ID4gdGhlIGRldmljZS4gVGhhdCdzIHF1 -aXRlIHVzZWZ1bCBmb3IgZGVidWdnaW5nLgo+ID4+PiA+Cj4gPj4+ID4+ICsgICAgICAgICAgICAg -aWYgKCF4Z2VuZV9tc2ktPmZ3bm9kZSkgewo+ID4+PiA+PiArICAgICAgICAgICAgICAgICAgICAg -ZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBmd25vZGVcbiIpOwo+ID4+PiA+ -PiArICAgICAgICAgICAgICAgICAgICAgcmMgPSBFTk9NRU07Cj4gPj4+ID4+ICsgICAgICAgICAg -ICAgICAgICAgICBnb3RvIGVycm9yOwo+ID4+PiA+PiArICAgICAgICAgICAgIH0KPiA+Pj4gPj4g -KyAgICAgfQo+ID4+PiA+PiArCj4gPj4+ID4+ICAgICAgIHhnZW5lX21zaS0+bnVtX2NwdXMgPSBu -dW1fcG9zc2libGVfY3B1cygpOwo+ID4+PiA+Pgo+ID4+PiA+PiAgICAgICByYyA9IHhnZW5lX21z -aV9pbml0X2FsbG9jYXRvcih4Z2VuZV9tc2kpOwo+ID4+PiA+PiBAQCAtNTQwLDYgKzU2OCw3IEBA -IHN0YXRpYyBpbnQgeGdlbmVfbXNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYp -Cj4gPj4+ID4+ICAgICAgIC5kcml2ZXIgPSB7Cj4gPj4+ID4+ICAgICAgICAgICAgICAgLm5hbWUg -PSAieGdlbmUtbXNpIiwKPiA+Pj4gPj4gICAgICAgICAgICAgICAub2ZfbWF0Y2hfdGFibGUgPSB4 -Z2VuZV9tc2lfbWF0Y2hfdGFibGUsCj4gPj4+ID4+ICsgICAgICAgICAgICAgLmFjcGlfbWF0Y2hf -dGFibGUgPSBBQ1BJX1BUUih4Z2VuZV9tc2lfYWNwaV9pZHMpLAo+ID4+PiA+PiAgICAgICB9LAo+ -ID4+PiA+PiAgICAgICAucHJvYmUgPSB4Z2VuZV9tc2lfcHJvYmUsCj4gPj4+ID4+ICAgICAgIC5y -ZW1vdmUgPSB4Z2VuZV9tc2lfcmVtb3ZlLAo+ID4+PiA+Pgo+ID4+PiA+Cj4gPj4+ID4gVGhlIGNv -ZGUgaXMgdHJpdmlhbCwgYnV0IHJlbGllcyBvbiB0aGUgTVNJIGNvbnRyb2xsZXIgdG8gcHJvYmUg -YmVmb3JlCj4gPj4+ID4gdGhlIFBDSSBidXMuIFdoYXQgZW5mb3JjZXMgdGhpcz8gSG93IGlzIGl0 -IG1ha2luZyBzdXJlIHRoYXQgdGhpcyBpcyBub3QKPiA+Pj4gPiBnb2luZyB0byBicmVhayBpbiB0 -aGUgbmV4dCBrZXJuZWwgcmVsZWFzZT8gQXMgZmFyIGFzIEkgY2FuIHRlbGwsIHRoZXJlCj4gPj4+ -ID4gaXMgbm8gZXhwbGljaXQgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSB0d28sIG1ha2luZyBpdCB0 -aGUgd2hvbGUgdGhpbmcKPiA+Pj4gPiBleHRyZW1lbHkgZnJhZ2lsZS4KPiA+Pj4gPgo+ID4+PiA+ -IFRoYW5rcywKPiA+Pj4gPgo+ID4+PiA+ICAgICAgICAgTS4KPiA+Pj4gPiAtLQo+ID4+PiA+IEph -enogaXMgbm90IGRlYWQuIEl0IGp1c3Qgc21lbGxzIGZ1bm55Li4uCj4gPj4+Cj4gPj4+IC0tCgpf -X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0t -a2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcK -aHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2Vy -bmVsCg== +On Tue, Jun 06, 2017 at 09:44:15AM -0700, Khuong Dinh wrote: +> Hi Lorenzo, +> +> On Tue, May 9, 2017 at 3:55 PM, Khuong Dinh <kdinh@apm.com> wrote: +> > Hi Lorenzo, +> > +> > On Fri, May 5, 2017 at 9:51 AM, Lorenzo Pieralisi +> > <lorenzo.pieralisi@arm.com> wrote: +> >> On Thu, May 04, 2017 at 05:36:06PM -0700, Khuong Dinh wrote: +> >>> Hi Marc, +> >>> There's no explicit dependency between pcie driver and msi +> >>> controller. The current solution that we did is relying on the +> >>> node ordering in BIOS. ACPI 5.0 introduced _DEP method to assign a +> >>> higher priority in start ordering. This method could be applied in +> >>> case of msi and pcie are the same level of subsys_init (in ACPI +> >>> boot). However, PCIe driver has not supported for this dependency +> >>> check yet. How do you think about this solution. +> >> +> >> First off, you can't post emails with confidentiality notices on +> >> mailing lists so remove it from now onwards. +> > +> > Fixed +> > +> >> Secondly, I commented on this before, so you know what my opinion is. +> > +> > I got your opinion. I'll implement as your suggestion. +> > +> +> Regarding to your previous suggestion to add a hook walking the ACPI +> namespace before acpi_bus_scan() in acpi_scan_init() to make MSI +> controllers must be probed before PCI. I have a concern that the +> MSI namespace “ _SB.MSIX” is not a unique name and how can we walk +> the ACPI namespace and use this name to make MSI probed before PCI. +> May you have little bit more information for this or do you have +> another suggestion for this? +> +> There’s another solution which makes this simpler and I’d like to +> ask your opinion about this. +> The solution is to make an hierarchy between MSI and PCI nodes as below: +> Device(\_SB.MSIX) { +> Device(\_SB.PCI0) +> Device(\_SB.PCI1) +> …… +> } +> In other word, MSIX node is a parent node of PCI nodes in ACPI +> table. In this sense, there’s an explicit dependency between MSI +> and PCI, MSI controller must be probed before PCI and it will +> guarantee not breaking next kernel releases. How do you think about +> this solution. + +I think that's a plaster as ineffective as reordering nodes, in short +it is not a solution and you still rely on kernel link ordering, you +can fiddle with ACPI tables as much as you want but that does not change. + +> I also tried to use _DEP method to describe the dependency of PCIe +> nodes, but it looks that it does not work as PCI and MSI are handed +> by acpi_bus_scan and still having issue when we re-probe PCI. + +That's a tad vague to be frank, anyway it is pretty clear to me that we +have hit a wall. In ACPI there is no way to describe probe dependencies +like the one you have, it is as simple as that, and this MSI issue you +are facing is just an example, there are more eg: + +https://www.spinics.net/lists/arm-kernel/msg585825.html + +At the end of the day the choice is simple either we accept (and we +maintain because that's the problem) these hacks - and I am not willing +to do that - or we find a way to solve this from a general perspective not +as a point hack. + +I can have a look at solving the whole issue but it won't happen +tomorrow. + +Thanks, +Lorenzo + +> Thanks, +> Khuong Dinh +> +> >> Finally, please execute this command on the vmlinux that "works" +> >> for you: +> >> +> >> nm vmlinux | grep -E '__initcall_(xgene_pcie_msi_init|acpi_init)' +> > +> > $ nm vmlinux | grep -E '__initcall_(xgene_pcie_msi_init|acpi_init)' +> > ffff000008dab2d8 t __initcall_acpi_init4 +> > ffff000008dab2c8 t __initcall_xgene_pcie_msi_init4 +> > +> > Best regards, +> > Khuong Dinh +> > +> >> Even by ordering devices in the ACPI tables (that I abhor) I still do +> >> not understand how this works (I mean without relying on kernel link +> >> order to ensure that the MSI driver is probed before PCI devices are +> >> enumerated in acpi_init()). +> >> +> >> Thanks, +> >> Lorenzo +> >> +> >>> Best regards, +> >>> Khuong +> >>> +> >>> On Fri, Apr 28, 2017 at 2:27 AM, Marc Zyngier <marc.zyngier@arm.com> wrote: +> >>> > On 28/04/17 01:54, Khuong Dinh wrote: +> >>> >> From: Khuong Dinh <kdinh@apm.com> +> >>> >> +> >>> >> This patch makes pci-xgene-msi driver ACPI-aware and provides +> >>> >> MSI capability for X-Gene v1 PCIe controllers in ACPI boot mode. +> >>> >> +> >>> >> Signed-off-by: Khuong Dinh <kdinh@apm.com> +> >>> >> Signed-off-by: Duc Dang <dhdang@apm.com> +> >>> >> Acked-by: Marc Zyngier <marc.zyngier@arm.com> +> >>> >> --- +> >>> >> v2: +> >>> >> - Verify with BIOS version 3.06.25 and 3.07.09 +> >>> >> v1: +> >>> >> - Initial version +> >>> >> --- +> >>> >> drivers/pci/host/pci-xgene-msi.c | 35 ++++++++++++++++++++++++++++++++--- +> >>> >> 1 files changed, 32 insertions(+), 3 deletions(-) +> >>> >> +> >>> >> diff --git a/drivers/pci/host/pci-xgene-msi.c b/drivers/pci/host/pci-xgene-msi.c +> >>> >> index f1b633b..00aaa3d 100644 +> >>> >> --- a/drivers/pci/host/pci-xgene-msi.c +> >>> >> +++ b/drivers/pci/host/pci-xgene-msi.c +> >>> >> @@ -24,6 +24,7 @@ +> >>> >> #include <linux/pci.h> +> >>> >> #include <linux/platform_device.h> +> >>> >> #include <linux/of_pci.h> +> >>> >> +#include <linux/acpi.h> +> >>> >> +> >>> >> #define MSI_IR0 0x000000 +> >>> >> #define MSI_INT0 0x800000 +> >>> >> @@ -39,7 +40,7 @@ struct xgene_msi_group { +> >>> >> }; +> >>> >> +> >>> >> struct xgene_msi { +> >>> >> - struct device_node *node; +> >>> >> + struct fwnode_handle *fwnode; +> >>> >> struct irq_domain *inner_domain; +> >>> >> struct irq_domain *msi_domain; +> >>> >> u64 msi_addr; +> >>> >> @@ -249,6 +250,13 @@ static void xgene_irq_domain_free(struct irq_domain *domain, +> >>> >> .free = xgene_irq_domain_free, +> >>> >> }; +> >>> >> +> >>> >> +#ifdef CONFIG_ACPI +> >>> >> +static struct fwnode_handle *xgene_msi_get_fwnode(struct device *dev) +> >>> >> +{ +> >>> >> + return xgene_msi_ctrl.fwnode; +> >>> >> +} +> >>> >> +#endif +> >>> >> + +> >>> >> static int xgene_allocate_domains(struct xgene_msi *msi) +> >>> >> { +> >>> >> msi->inner_domain = irq_domain_add_linear(NULL, NR_MSI_VEC, +> >>> >> @@ -256,7 +264,7 @@ static int xgene_allocate_domains(struct xgene_msi *msi) +> >>> >> if (!msi->inner_domain) +> >>> >> return -ENOMEM; +> >>> >> +> >>> >> - msi->msi_domain = pci_msi_create_irq_domain(of_node_to_fwnode(msi->node), +> >>> >> + msi->msi_domain = pci_msi_create_irq_domain(msi->fwnode, +> >>> >> &xgene_msi_domain_info, +> >>> >> msi->inner_domain); +> >>> >> +> >>> >> @@ -265,6 +273,9 @@ static int xgene_allocate_domains(struct xgene_msi *msi) +> >>> >> return -ENOMEM; +> >>> >> } +> >>> >> +> >>> >> +#ifdef CONFIG_ACPI +> >>> >> + pci_msi_register_fwnode_provider(&xgene_msi_get_fwnode); +> >>> >> +#endif +> >>> >> return 0; +> >>> >> } +> >>> >> +> >>> >> @@ -449,6 +460,13 @@ static int xgene_msi_hwirq_free(unsigned int cpu) +> >>> >> {}, +> >>> >> }; +> >>> >> +> >>> >> +#ifdef CONFIG_ACPI +> >>> >> +static const struct acpi_device_id xgene_msi_acpi_ids[] = { +> >>> >> + {"APMC0D0E", 0}, +> >>> >> + { }, +> >>> >> +}; +> >>> >> +#endif +> >>> >> + +> >>> >> static int xgene_msi_probe(struct platform_device *pdev) +> >>> >> { +> >>> >> struct resource *res; +> >>> >> @@ -469,7 +487,17 @@ static int xgene_msi_probe(struct platform_device *pdev) +> >>> >> goto error; +> >>> >> } +> >>> >> xgene_msi->msi_addr = res->start; +> >>> >> - xgene_msi->node = pdev->dev.of_node; +> >>> >> + +> >>> >> + xgene_msi->fwnode = of_node_to_fwnode(pdev->dev.of_node); +> >>> >> + if (!xgene_msi->fwnode) { +> >>> >> + xgene_msi->fwnode = irq_domain_alloc_fwnode(NULL); +> >>> > +> >>> > Please provide something other than NULL, such as the base address if +> >>> > the device. That's quite useful for debugging. +> >>> > +> >>> >> + if (!xgene_msi->fwnode) { +> >>> >> + dev_err(&pdev->dev, "Failed to create fwnode\n"); +> >>> >> + rc = ENOMEM; +> >>> >> + goto error; +> >>> >> + } +> >>> >> + } +> >>> >> + +> >>> >> xgene_msi->num_cpus = num_possible_cpus(); +> >>> >> +> >>> >> rc = xgene_msi_init_allocator(xgene_msi); +> >>> >> @@ -540,6 +568,7 @@ static int xgene_msi_probe(struct platform_device *pdev) +> >>> >> .driver = { +> >>> >> .name = "xgene-msi", +> >>> >> .of_match_table = xgene_msi_match_table, +> >>> >> + .acpi_match_table = ACPI_PTR(xgene_msi_acpi_ids), +> >>> >> }, +> >>> >> .probe = xgene_msi_probe, +> >>> >> .remove = xgene_msi_remove, +> >>> >> +> >>> > +> >>> > The code is trivial, but relies on the MSI controller to probe before +> >>> > the PCI bus. What enforces this? How is it making sure that this is not +> >>> > going to break in the next kernel release? As far as I can tell, there +> >>> > is no explicit dependency between the two, making it the whole thing +> >>> > extremely fragile. +> >>> > +> >>> > Thanks, +> >>> > +> >>> > M. +> >>> > -- +> >>> > Jazz is not dead. It just smells funny... +> >>> +> >>> -- diff --git a/a/content_digest b/N2/content_digest index 638c708..e527698 100644 --- a/a/content_digest +++ b/N2/content_digest @@ -8,183 +8,252 @@ "Subject\0Re: [PATCH v2 pci] PCI/MSI: pci-xgene-msi: Enable MSI support in ACPI boot for X-Gene v1\0" "Date\0Thu, 8 Jun 2017 11:39:56 +0100\0" "To\0Khuong Dinh <kdinh@apm.com>\0" - "Cc\0rjw@rjwysocki.net" - Duc Dang <dhdang@apm.com> - Marc Zyngier <marc.zyngier@arm.com> - linux-pci@vger.kernel.org + "Cc\0Marc Zyngier <marc.zyngier@arm.com>" msalter@redhat.com + Bjorn Helgaas <bhelgaas@google.com> + linux-pci@vger.kernel.org + jcm@redhat.com patches@apm.com linux-kernel@vger.kernel.org - jcm@redhat.com - Bjorn Helgaas <bhelgaas@google.com> - " linux-arm-kernel@lists.infradead.org\0" + linux-arm-kernel@lists.infradead.org + rjw@rjwysocki.net + " Duc Dang <dhdang@apm.com>\0" "\00:1\0" "b\0" - "T24gVHVlLCBKdW4gMDYsIDIwMTcgYXQgMDk6NDQ6MTVBTSAtMDcwMCwgS2h1b25nIERpbmggd3Jv\n" - "dGU6Cj4gSGkgTG9yZW56bywKPiAKPiBPbiBUdWUsIE1heSA5LCAyMDE3IGF0IDM6NTUgUE0sIEto\n" - "dW9uZyBEaW5oIDxrZGluaEBhcG0uY29tPiB3cm90ZToKPiA+IEhpIExvcmVuem8sCj4gPgo+ID4g\n" - "T24gRnJpLCBNYXkgNSwgMjAxNyBhdCA5OjUxIEFNLCBMb3JlbnpvIFBpZXJhbGlzaQo+ID4gPGxv\n" - "cmVuem8ucGllcmFsaXNpQGFybS5jb20+IHdyb3RlOgo+ID4+IE9uIFRodSwgTWF5IDA0LCAyMDE3\n" - "IGF0IDA1OjM2OjA2UE0gLTA3MDAsIEtodW9uZyBEaW5oIHdyb3RlOgo+ID4+PiBIaSBNYXJjLAo+\n" - "ID4+PiBUaGVyZSdzIG5vIGV4cGxpY2l0IGRlcGVuZGVuY3kgYmV0d2VlbiBwY2llIGRyaXZlciBh\n" - "bmQgbXNpCj4gPj4+IGNvbnRyb2xsZXIuICBUaGUgY3VycmVudCBzb2x1dGlvbiB0aGF0IHdlIGRp\n" - "ZCBpcyByZWx5aW5nIG9uIHRoZQo+ID4+PiBub2RlIG9yZGVyaW5nIGluIEJJT1MuICBBQ1BJIDUu\n" - "MCBpbnRyb2R1Y2VkIF9ERVAgbWV0aG9kIHRvIGFzc2lnbiBhCj4gPj4+IGhpZ2hlciBwcmlvcml0\n" - "eSBpbiBzdGFydCBvcmRlcmluZy4gIFRoaXMgbWV0aG9kIGNvdWxkIGJlIGFwcGxpZWQgaW4KPiA+\n" - "Pj4gY2FzZSBvZiBtc2kgYW5kIHBjaWUgYXJlIHRoZSBzYW1lIGxldmVsIG9mIHN1YnN5c19pbml0\n" - "IChpbiBBQ1BJCj4gPj4+IGJvb3QpLiAgSG93ZXZlciwgUENJZSBkcml2ZXIgaGFzIG5vdCBzdXBw\n" - "b3J0ZWQgZm9yIHRoaXMgZGVwZW5kZW5jeQo+ID4+PiBjaGVjayB5ZXQuICBIb3cgZG8geW91IHRo\n" - "aW5rIGFib3V0IHRoaXMgc29sdXRpb24uCj4gPj4KPiA+PiBGaXJzdCBvZmYsIHlvdSBjYW4ndCBw\n" - "b3N0IGVtYWlscyB3aXRoIGNvbmZpZGVudGlhbGl0eSBub3RpY2VzIG9uCj4gPj4gbWFpbGluZyBs\n" - "aXN0cyBzbyByZW1vdmUgaXQgZnJvbSBub3cgb253YXJkcy4KPiA+Cj4gPiBGaXhlZAo+ID4KPiA+\n" - "PiBTZWNvbmRseSwgSSBjb21tZW50ZWQgb24gdGhpcyBiZWZvcmUsIHNvIHlvdSBrbm93IHdoYXQg\n" - "bXkgb3BpbmlvbiBpcy4KPiA+Cj4gPiBJIGdvdCB5b3VyIG9waW5pb24uIEknbGwgaW1wbGVtZW50\n" - "IGFzIHlvdXIgc3VnZ2VzdGlvbi4KPiA+Cj4gCj4gICBSZWdhcmRpbmcgdG8geW91ciBwcmV2aW91\n" - "cyBzdWdnZXN0aW9uIHRvIGFkZCBhIGhvb2sgd2Fsa2luZyB0aGUgQUNQSQo+ICAgbmFtZXNwYWNl\n" - "IGJlZm9yZSBhY3BpX2J1c19zY2FuKCkgaW4gYWNwaV9zY2FuX2luaXQoKSB0byBtYWtlIE1TSQo+\n" - "ICAgY29udHJvbGxlcnMgbXVzdCBiZSBwcm9iZWQgYmVmb3JlIFBDSS4gIEkgaGF2ZSBhIGNvbmNl\n" - "cm4gdGhhdCB0aGUKPiAgIE1TSSBuYW1lc3BhY2Ug4oCcIF9TQi5NU0lY4oCdIGlzIG5vdCBhIHVu\n" - "aXF1ZSBuYW1lIGFuZCBob3cgY2FuIHdlIHdhbGsKPiAgIHRoZSBBQ1BJIG5hbWVzcGFjZSBhbmQg\n" - "dXNlIHRoaXMgbmFtZSB0byBtYWtlIE1TSSBwcm9iZWQgYmVmb3JlIFBDSS4KPiAgIE1heSB5b3Ug\n" - "aGF2ZSBsaXR0bGUgYml0IG1vcmUgaW5mb3JtYXRpb24gZm9yIHRoaXMgb3IgZG8geW91IGhhdmUK\n" - "PiAgIGFub3RoZXIgc3VnZ2VzdGlvbiBmb3IgdGhpcz8KPiAKPiAgICBUaGVyZeKAmXMgYW5vdGhl\n" - "ciBzb2x1dGlvbiB3aGljaCBtYWtlcyB0aGlzIHNpbXBsZXIgYW5kIEnigJlkIGxpa2UgdG8KPiAg\n" - "ICBhc2sgeW91ciBvcGluaW9uIGFib3V0IHRoaXMuCj4gICAgVGhlIHNvbHV0aW9uIGlzIHRvIG1h\n" - "a2UgYW4gaGllcmFyY2h5IGJldHdlZW4gTVNJIGFuZCBQQ0kgbm9kZXMgIGFzIGJlbG93Ogo+IERl\n" - "dmljZShcX1NCLk1TSVgpIHsKPiAgICBEZXZpY2UoXF9TQi5QQ0kwKQo+ICAgIERldmljZShcX1NC\n" - "LlBDSTEpCj4gICAg4oCm4oCmCj4gfQo+ICAgSW4gb3RoZXIgd29yZCwgTVNJWCBub2RlIGlzIGEg\n" - "cGFyZW50IG5vZGUgb2YgUENJIG5vZGVzIGluIEFDUEkKPiAgIHRhYmxlLiAgSW4gdGhpcyBzZW5z\n" - "ZSwgdGhlcmXigJlzIGFuIGV4cGxpY2l0IGRlcGVuZGVuY3kgYmV0d2VlbiBNU0kKPiAgIGFuZCBQ\n" - "Q0ksIE1TSSBjb250cm9sbGVyIG11c3QgYmUgcHJvYmVkIGJlZm9yZSBQQ0kgYW5kIGl0IHdpbGwK\n" - "PiAgIGd1YXJhbnRlZSBub3QgYnJlYWtpbmcgbmV4dCBrZXJuZWwgcmVsZWFzZXMuICBIb3cgZG8g\n" - "eW91IHRoaW5rIGFib3V0Cj4gICB0aGlzIHNvbHV0aW9uLgoKSSB0aGluayB0aGF0J3MgYSBwbGFz\n" - "dGVyIGFzIGluZWZmZWN0aXZlIGFzIHJlb3JkZXJpbmcgbm9kZXMsIGluIHNob3J0Cml0IGlzIG5v\n" - "dCBhIHNvbHV0aW9uIGFuZCB5b3Ugc3RpbGwgcmVseSBvbiBrZXJuZWwgbGluayBvcmRlcmluZywg\n" - "eW91CmNhbiBmaWRkbGUgd2l0aCBBQ1BJIHRhYmxlcyBhcyBtdWNoIGFzIHlvdSB3YW50IGJ1dCB0\n" - "aGF0IGRvZXMgbm90IGNoYW5nZS4KCj4gIEkgYWxzbyB0cmllZCB0byB1c2UgX0RFUCBtZXRob2Qg\n" - "dG8gZGVzY3JpYmUgdGhlIGRlcGVuZGVuY3kgb2YgUENJZQo+ICBub2RlcywgYnV0IGl0IGxvb2tz\n" - "IHRoYXQgaXQgZG9lcyBub3Qgd29yayBhcyBQQ0kgYW5kIE1TSSBhcmUgaGFuZGVkCj4gIGJ5IGFj\n" - "cGlfYnVzX3NjYW4gYW5kIHN0aWxsIGhhdmluZyBpc3N1ZSB3aGVuIHdlIHJlLXByb2JlIFBDSS4K\n" - "ClRoYXQncyBhIHRhZCB2YWd1ZSB0byBiZSBmcmFuaywgYW55d2F5IGl0IGlzIHByZXR0eSBjbGVh\n" - "ciB0byBtZSB0aGF0IHdlCmhhdmUgaGl0IGEgd2FsbC4gSW4gQUNQSSB0aGVyZSBpcyBubyB3YXkg\n" - "dG8gZGVzY3JpYmUgcHJvYmUgZGVwZW5kZW5jaWVzCmxpa2UgdGhlIG9uZSB5b3UgaGF2ZSwgaXQg\n" - "aXMgYXMgc2ltcGxlIGFzIHRoYXQsIGFuZCB0aGlzIE1TSSBpc3N1ZSB5b3UKYXJlIGZhY2luZyBp\n" - "cyBqdXN0IGFuIGV4YW1wbGUsIHRoZXJlIGFyZSBtb3JlIGVnOgoKaHR0cHM6Ly93d3cuc3Bpbmlj\n" - "cy5uZXQvbGlzdHMvYXJtLWtlcm5lbC9tc2c1ODU4MjUuaHRtbAoKQXQgdGhlIGVuZCBvZiB0aGUg\n" - "ZGF5IHRoZSBjaG9pY2UgaXMgc2ltcGxlIGVpdGhlciB3ZSBhY2NlcHQgKGFuZCB3ZQptYWludGFp\n" - "biBiZWNhdXNlIHRoYXQncyB0aGUgcHJvYmxlbSkgdGhlc2UgaGFja3MgLSBhbmQgSSBhbSBub3Qg\n" - "d2lsbGluZwp0byBkbyB0aGF0IC0gb3Igd2UgZmluZCBhIHdheSB0byBzb2x2ZSB0aGlzIGZyb20g\n" - "YSBnZW5lcmFsIHBlcnNwZWN0aXZlIG5vdAphcyBhIHBvaW50IGhhY2suCgpJIGNhbiBoYXZlIGEg\n" - "bG9vayBhdCBzb2x2aW5nIHRoZSB3aG9sZSBpc3N1ZSBidXQgaXQgd29uJ3QgaGFwcGVuCnRvbW9y\n" - "cm93LgoKVGhhbmtzLApMb3JlbnpvCgo+IFRoYW5rcywKPiBLaHVvbmcgRGluaAo+IAo+ID4+IEZp\n" - "bmFsbHksIHBsZWFzZSBleGVjdXRlIHRoaXMgY29tbWFuZCBvbiB0aGUgdm1saW51eCB0aGF0ICJ3\n" - "b3JrcyIKPiA+PiBmb3IgeW91Ogo+ID4+Cj4gPj4gbm0gdm1saW51eCB8IGdyZXAgLUUgJ19faW5p\n" - "dGNhbGxfKHhnZW5lX3BjaWVfbXNpX2luaXR8YWNwaV9pbml0KScKPiA+Cj4gPiAkIG5tIHZtbGlu\n" - "dXggfCBncmVwIC1FICdfX2luaXRjYWxsXyh4Z2VuZV9wY2llX21zaV9pbml0fGFjcGlfaW5pdCkn\n" - "Cj4gPiBmZmZmMDAwMDA4ZGFiMmQ4IHQgX19pbml0Y2FsbF9hY3BpX2luaXQ0Cj4gPiBmZmZmMDAw\n" - "MDA4ZGFiMmM4IHQgX19pbml0Y2FsbF94Z2VuZV9wY2llX21zaV9pbml0NAo+ID4KPiA+IEJlc3Qg\n" - "cmVnYXJkcywKPiA+IEtodW9uZyBEaW5oCj4gPgo+ID4+IEV2ZW4gYnkgb3JkZXJpbmcgZGV2aWNl\n" - "cyBpbiB0aGUgQUNQSSB0YWJsZXMgKHRoYXQgSSBhYmhvcikgSSBzdGlsbCBkbwo+ID4+IG5vdCB1\n" - "bmRlcnN0YW5kIGhvdyB0aGlzIHdvcmtzIChJIG1lYW4gd2l0aG91dCByZWx5aW5nIG9uIGtlcm5l\n" - "bCBsaW5rCj4gPj4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIE1TSSBkcml2ZXIgaXMgcHJvYmVk\n" - "IGJlZm9yZSBQQ0kgZGV2aWNlcyBhcmUKPiA+PiBlbnVtZXJhdGVkIGluIGFjcGlfaW5pdCgpKS4K\n" - "PiA+Pgo+ID4+IFRoYW5rcywKPiA+PiBMb3JlbnpvCj4gPj4KPiA+Pj4gQmVzdCByZWdhcmRzLAo+\n" - "ID4+PiBLaHVvbmcKPiA+Pj4KPiA+Pj4gT24gRnJpLCBBcHIgMjgsIDIwMTcgYXQgMjoyNyBBTSwg\n" - "TWFyYyBaeW5naWVyIDxtYXJjLnp5bmdpZXJAYXJtLmNvbT4gd3JvdGU6Cj4gPj4+ID4gT24gMjgv\n" - "MDQvMTcgMDE6NTQsIEtodW9uZyBEaW5oIHdyb3RlOgo+ID4+PiA+PiBGcm9tOiBLaHVvbmcgRGlu\n" - "aCA8a2RpbmhAYXBtLmNvbT4KPiA+Pj4gPj4KPiA+Pj4gPj4gVGhpcyBwYXRjaCBtYWtlcyBwY2kt\n" - "eGdlbmUtbXNpIGRyaXZlciBBQ1BJLWF3YXJlIGFuZCBwcm92aWRlcwo+ID4+PiA+PiBNU0kgY2Fw\n" - "YWJpbGl0eSBmb3IgWC1HZW5lIHYxIFBDSWUgY29udHJvbGxlcnMgaW4gQUNQSSBib290IG1vZGUu\n" - "Cj4gPj4+ID4+Cj4gPj4+ID4+IFNpZ25lZC1vZmYtYnk6IEtodW9uZyBEaW5oIDxrZGluaEBhcG0u\n" - "Y29tPgo+ID4+PiA+PiBTaWduZWQtb2ZmLWJ5OiBEdWMgRGFuZyA8ZGhkYW5nQGFwbS5jb20+Cj4g\n" - "Pj4+ID4+IEFja2VkLWJ5OiBNYXJjIFp5bmdpZXIgPG1hcmMuenluZ2llckBhcm0uY29tPgo+ID4+\n" - "PiA+PiAtLS0KPiA+Pj4gPj4gdjI6Cj4gPj4+ID4+ICAtIFZlcmlmeSB3aXRoIEJJT1MgdmVyc2lv\n" - "biAzLjA2LjI1IGFuZCAzLjA3LjA5Cj4gPj4+ID4+IHYxOgo+ID4+PiA+PiAgLSBJbml0aWFsIHZl\n" - "cnNpb24KPiA+Pj4gPj4gLS0tCj4gPj4+ID4+ICBkcml2ZXJzL3BjaS9ob3N0L3BjaS14Z2VuZS1t\n" - "c2kuYyB8ICAgMzUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0KPiA+Pj4gPj4g\n" - "IDEgZmlsZXMgY2hhbmdlZCwgMzIgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKPiA+Pj4g\n" - "Pj4KPiA+Pj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLXhnZW5lLW1zaS5j\n" - "IGIvZHJpdmVycy9wY2kvaG9zdC9wY2kteGdlbmUtbXNpLmMKPiA+Pj4gPj4gaW5kZXggZjFiNjMz\n" - "Yi4uMDBhYWEzZCAxMDA2NDQKPiA+Pj4gPj4gLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2kteGdl\n" - "bmUtbXNpLmMKPiA+Pj4gPj4gKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2kteGdlbmUtbXNpLmMK\n" - "PiA+Pj4gPj4gQEAgLTI0LDYgKzI0LDcgQEAKPiA+Pj4gPj4gICNpbmNsdWRlIDxsaW51eC9wY2ku\n" - "aD4KPiA+Pj4gPj4gICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiA+Pj4gPj4g\n" - "ICNpbmNsdWRlIDxsaW51eC9vZl9wY2kuaD4KPiA+Pj4gPj4gKyNpbmNsdWRlIDxsaW51eC9hY3Bp\n" - "Lmg+Cj4gPj4+ID4+Cj4gPj4+ID4+ICAjZGVmaW5lIE1TSV9JUjAgICAgICAgICAgICAgICAgICAg\n" - "ICAgMHgwMDAwMDAKPiA+Pj4gPj4gICNkZWZpbmUgTVNJX0lOVDAgICAgICAgICAgICAgMHg4MDAw\n" - "MDAKPiA+Pj4gPj4gQEAgLTM5LDcgKzQwLDcgQEAgc3RydWN0IHhnZW5lX21zaV9ncm91cCB7Cj4g\n" - "Pj4+ID4+ICB9Owo+ID4+PiA+Pgo+ID4+PiA+PiAgc3RydWN0IHhnZW5lX21zaSB7Cj4gPj4+ID4+\n" - "IC0gICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAgICAgICpub2RlOwo+ID4+PiA+PiArICAgICBzdHJ1\n" - "Y3QgZndub2RlX2hhbmRsZSAgICAqZndub2RlOwo+ID4+PiA+PiAgICAgICBzdHJ1Y3QgaXJxX2Rv\n" - "bWFpbiAgICAgICAqaW5uZXJfZG9tYWluOwo+ID4+PiA+PiAgICAgICBzdHJ1Y3QgaXJxX2RvbWFp\n" - "biAgICAgICAqbXNpX2RvbWFpbjsKPiA+Pj4gPj4gICAgICAgdTY0ICAgICAgICAgICAgICAgICAg\n" - "ICAgbXNpX2FkZHI7Cj4gPj4+ID4+IEBAIC0yNDksNiArMjUwLDEzIEBAIHN0YXRpYyB2b2lkIHhn\n" - "ZW5lX2lycV9kb21haW5fZnJlZShzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLAo+ID4+PiA+PiAg\n" - "ICAgICAuZnJlZSAgID0geGdlbmVfaXJxX2RvbWFpbl9mcmVlLAo+ID4+PiA+PiAgfTsKPiA+Pj4g\n" - "Pj4KPiA+Pj4gPj4gKyNpZmRlZiBDT05GSUdfQUNQSQo+ID4+PiA+PiArc3RhdGljIHN0cnVjdCBm\n" - "d25vZGVfaGFuZGxlICp4Z2VuZV9tc2lfZ2V0X2Z3bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4g\n" - "Pj4+ID4+ICt7Cj4gPj4+ID4+ICsgICAgIHJldHVybiB4Z2VuZV9tc2lfY3RybC5md25vZGU7Cj4g\n" - "Pj4+ID4+ICt9Cj4gPj4+ID4+ICsjZW5kaWYKPiA+Pj4gPj4gKwo+ID4+PiA+PiAgc3RhdGljIGlu\n" - "dCB4Z2VuZV9hbGxvY2F0ZV9kb21haW5zKHN0cnVjdCB4Z2VuZV9tc2kgKm1zaSkKPiA+Pj4gPj4g\n" - "IHsKPiA+Pj4gPj4gICAgICAgbXNpLT5pbm5lcl9kb21haW4gPSBpcnFfZG9tYWluX2FkZF9saW5l\n" - "YXIoTlVMTCwgTlJfTVNJX1ZFQywKPiA+Pj4gPj4gQEAgLTI1Niw3ICsyNjQsNyBAQCBzdGF0aWMg\n" - "aW50IHhnZW5lX2FsbG9jYXRlX2RvbWFpbnMoc3RydWN0IHhnZW5lX21zaSAqbXNpKQo+ID4+PiA+\n" - "PiAgICAgICBpZiAoIW1zaS0+aW5uZXJfZG9tYWluKQo+ID4+PiA+PiAgICAgICAgICAgICAgIHJl\n" - "dHVybiAtRU5PTUVNOwo+ID4+PiA+Pgo+ID4+PiA+PiAtICAgICBtc2ktPm1zaV9kb21haW4gPSBw\n" - "Y2lfbXNpX2NyZWF0ZV9pcnFfZG9tYWluKG9mX25vZGVfdG9fZndub2RlKG1zaS0+bm9kZSksCj4g\n" - "Pj4+ID4+ICsgICAgIG1zaS0+bXNpX2RvbWFpbiA9IHBjaV9tc2lfY3JlYXRlX2lycV9kb21haW4o\n" - "bXNpLT5md25vZGUsCj4gPj4+ID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgJnhnZW5lX21zaV9kb21haW5faW5mbywKPiA+Pj4gPj4gICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2ktPmlubmVyX2RvbWFp\n" - "bik7Cj4gPj4+ID4+Cj4gPj4+ID4+IEBAIC0yNjUsNiArMjczLDkgQEAgc3RhdGljIGludCB4Z2Vu\n" - "ZV9hbGxvY2F0ZV9kb21haW5zKHN0cnVjdCB4Z2VuZV9tc2kgKm1zaSkKPiA+Pj4gPj4gICAgICAg\n" - "ICAgICAgICByZXR1cm4gLUVOT01FTTsKPiA+Pj4gPj4gICAgICAgfQo+ID4+PiA+Pgo+ID4+PiA+\n" - "PiArI2lmZGVmIENPTkZJR19BQ1BJCj4gPj4+ID4+ICsgICAgIHBjaV9tc2lfcmVnaXN0ZXJfZndu\n" - "b2RlX3Byb3ZpZGVyKCZ4Z2VuZV9tc2lfZ2V0X2Z3bm9kZSk7Cj4gPj4+ID4+ICsjZW5kaWYKPiA+\n" - "Pj4gPj4gICAgICAgcmV0dXJuIDA7Cj4gPj4+ID4+ICB9Cj4gPj4+ID4+Cj4gPj4+ID4+IEBAIC00\n" - "NDksNiArNDYwLDEzIEBAIHN0YXRpYyBpbnQgeGdlbmVfbXNpX2h3aXJxX2ZyZWUodW5zaWduZWQg\n" - "aW50IGNwdSkKPiA+Pj4gPj4gICAgICAge30sCj4gPj4+ID4+ICB9Owo+ID4+PiA+Pgo+ID4+PiA+\n" - "PiArI2lmZGVmIENPTkZJR19BQ1BJCj4gPj4+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlf\n" - "ZGV2aWNlX2lkIHhnZW5lX21zaV9hY3BpX2lkc1tdID0gewo+ID4+PiA+PiArICAgICB7IkFQTUMw\n" - "RDBFIiwgMH0sCj4gPj4+ID4+ICsgICAgIHsgfSwKPiA+Pj4gPj4gK307Cj4gPj4+ID4+ICsjZW5k\n" - "aWYKPiA+Pj4gPj4gKwo+ID4+PiA+PiAgc3RhdGljIGludCB4Z2VuZV9tc2lfcHJvYmUoc3RydWN0\n" - "IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+Pj4gPj4gIHsKPiA+Pj4gPj4gICAgICAgc3RydWN0\n" - "IHJlc291cmNlICpyZXM7Cj4gPj4+ID4+IEBAIC00NjksNyArNDg3LDE3IEBAIHN0YXRpYyBpbnQg\n" - "eGdlbmVfbXNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPj4+ID4+ICAg\n" - "ICAgICAgICAgICAgZ290byBlcnJvcjsKPiA+Pj4gPj4gICAgICAgfQo+ID4+PiA+PiAgICAgICB4\n" - "Z2VuZV9tc2ktPm1zaV9hZGRyID0gcmVzLT5zdGFydDsKPiA+Pj4gPj4gLSAgICAgeGdlbmVfbXNp\n" - "LT5ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7Cj4gPj4+ID4+ICsKPiA+Pj4gPj4gKyAgICAgeGdl\n" - "bmVfbXNpLT5md25vZGUgPSBvZl9ub2RlX3RvX2Z3bm9kZShwZGV2LT5kZXYub2Zfbm9kZSk7Cj4g\n" - "Pj4+ID4+ICsgICAgIGlmICgheGdlbmVfbXNpLT5md25vZGUpIHsKPiA+Pj4gPj4gKyAgICAgICAg\n" - "ICAgICB4Z2VuZV9tc2ktPmZ3bm9kZSA9IGlycV9kb21haW5fYWxsb2NfZndub2RlKE5VTEwpOwo+\n" - "ID4+PiA+Cj4gPj4+ID4gUGxlYXNlIHByb3ZpZGUgc29tZXRoaW5nIG90aGVyIHRoYW4gTlVMTCwg\n" - "c3VjaCBhcyB0aGUgYmFzZSBhZGRyZXNzIGlmCj4gPj4+ID4gdGhlIGRldmljZS4gVGhhdCdzIHF1\n" - "aXRlIHVzZWZ1bCBmb3IgZGVidWdnaW5nLgo+ID4+PiA+Cj4gPj4+ID4+ICsgICAgICAgICAgICAg\n" - "aWYgKCF4Z2VuZV9tc2ktPmZ3bm9kZSkgewo+ID4+PiA+PiArICAgICAgICAgICAgICAgICAgICAg\n" - "ZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBmd25vZGVcbiIpOwo+ID4+PiA+\n" - "PiArICAgICAgICAgICAgICAgICAgICAgcmMgPSBFTk9NRU07Cj4gPj4+ID4+ICsgICAgICAgICAg\n" - "ICAgICAgICAgICBnb3RvIGVycm9yOwo+ID4+PiA+PiArICAgICAgICAgICAgIH0KPiA+Pj4gPj4g\n" - "KyAgICAgfQo+ID4+PiA+PiArCj4gPj4+ID4+ICAgICAgIHhnZW5lX21zaS0+bnVtX2NwdXMgPSBu\n" - "dW1fcG9zc2libGVfY3B1cygpOwo+ID4+PiA+Pgo+ID4+PiA+PiAgICAgICByYyA9IHhnZW5lX21z\n" - "aV9pbml0X2FsbG9jYXRvcih4Z2VuZV9tc2kpOwo+ID4+PiA+PiBAQCAtNTQwLDYgKzU2OCw3IEBA\n" - "IHN0YXRpYyBpbnQgeGdlbmVfbXNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYp\n" - "Cj4gPj4+ID4+ICAgICAgIC5kcml2ZXIgPSB7Cj4gPj4+ID4+ICAgICAgICAgICAgICAgLm5hbWUg\n" - "PSAieGdlbmUtbXNpIiwKPiA+Pj4gPj4gICAgICAgICAgICAgICAub2ZfbWF0Y2hfdGFibGUgPSB4\n" - "Z2VuZV9tc2lfbWF0Y2hfdGFibGUsCj4gPj4+ID4+ICsgICAgICAgICAgICAgLmFjcGlfbWF0Y2hf\n" - "dGFibGUgPSBBQ1BJX1BUUih4Z2VuZV9tc2lfYWNwaV9pZHMpLAo+ID4+PiA+PiAgICAgICB9LAo+\n" - "ID4+PiA+PiAgICAgICAucHJvYmUgPSB4Z2VuZV9tc2lfcHJvYmUsCj4gPj4+ID4+ICAgICAgIC5y\n" - "ZW1vdmUgPSB4Z2VuZV9tc2lfcmVtb3ZlLAo+ID4+PiA+Pgo+ID4+PiA+Cj4gPj4+ID4gVGhlIGNv\n" - "ZGUgaXMgdHJpdmlhbCwgYnV0IHJlbGllcyBvbiB0aGUgTVNJIGNvbnRyb2xsZXIgdG8gcHJvYmUg\n" - "YmVmb3JlCj4gPj4+ID4gdGhlIFBDSSBidXMuIFdoYXQgZW5mb3JjZXMgdGhpcz8gSG93IGlzIGl0\n" - "IG1ha2luZyBzdXJlIHRoYXQgdGhpcyBpcyBub3QKPiA+Pj4gPiBnb2luZyB0byBicmVhayBpbiB0\n" - "aGUgbmV4dCBrZXJuZWwgcmVsZWFzZT8gQXMgZmFyIGFzIEkgY2FuIHRlbGwsIHRoZXJlCj4gPj4+\n" - "ID4gaXMgbm8gZXhwbGljaXQgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSB0d28sIG1ha2luZyBpdCB0\n" - "aGUgd2hvbGUgdGhpbmcKPiA+Pj4gPiBleHRyZW1lbHkgZnJhZ2lsZS4KPiA+Pj4gPgo+ID4+PiA+\n" - "IFRoYW5rcywKPiA+Pj4gPgo+ID4+PiA+ICAgICAgICAgTS4KPiA+Pj4gPiAtLQo+ID4+PiA+IEph\n" - "enogaXMgbm90IGRlYWQuIEl0IGp1c3Qgc21lbGxzIGZ1bm55Li4uCj4gPj4+Cj4gPj4+IC0tCgpf\n" - "X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0t\n" - "a2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcK\n" - "aHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2Vy\n" - bmVsCg== + "On Tue, Jun 06, 2017 at 09:44:15AM -0700, Khuong Dinh wrote:\n" + "> Hi Lorenzo,\n" + "> \n" + "> On Tue, May 9, 2017 at 3:55 PM, Khuong Dinh <kdinh@apm.com> wrote:\n" + "> > Hi Lorenzo,\n" + "> >\n" + "> > On Fri, May 5, 2017 at 9:51 AM, Lorenzo Pieralisi\n" + "> > <lorenzo.pieralisi@arm.com> wrote:\n" + "> >> On Thu, May 04, 2017 at 05:36:06PM -0700, Khuong Dinh wrote:\n" + "> >>> Hi Marc,\n" + "> >>> There's no explicit dependency between pcie driver and msi\n" + "> >>> controller. The current solution that we did is relying on the\n" + "> >>> node ordering in BIOS. ACPI 5.0 introduced _DEP method to assign a\n" + "> >>> higher priority in start ordering. This method could be applied in\n" + "> >>> case of msi and pcie are the same level of subsys_init (in ACPI\n" + "> >>> boot). However, PCIe driver has not supported for this dependency\n" + "> >>> check yet. How do you think about this solution.\n" + "> >>\n" + "> >> First off, you can't post emails with confidentiality notices on\n" + "> >> mailing lists so remove it from now onwards.\n" + "> >\n" + "> > Fixed\n" + "> >\n" + "> >> Secondly, I commented on this before, so you know what my opinion is.\n" + "> >\n" + "> > I got your opinion. I'll implement as your suggestion.\n" + "> >\n" + "> \n" + "> Regarding to your previous suggestion to add a hook walking the ACPI\n" + "> namespace before acpi_bus_scan() in acpi_scan_init() to make MSI\n" + "> controllers must be probed before PCI. I have a concern that the\n" + "> MSI namespace \342\200\234 _SB.MSIX\342\200\235 is not a unique name and how can we walk\n" + "> the ACPI namespace and use this name to make MSI probed before PCI.\n" + "> May you have little bit more information for this or do you have\n" + "> another suggestion for this?\n" + "> \n" + "> There\342\200\231s another solution which makes this simpler and I\342\200\231d like to\n" + "> ask your opinion about this.\n" + "> The solution is to make an hierarchy between MSI and PCI nodes as below:\n" + "> Device(\\_SB.MSIX) {\n" + "> Device(\\_SB.PCI0)\n" + "> Device(\\_SB.PCI1)\n" + "> \342\200\246\342\200\246\n" + "> }\n" + "> In other word, MSIX node is a parent node of PCI nodes in ACPI\n" + "> table. In this sense, there\342\200\231s an explicit dependency between MSI\n" + "> and PCI, MSI controller must be probed before PCI and it will\n" + "> guarantee not breaking next kernel releases. How do you think about\n" + "> this solution.\n" + "\n" + "I think that's a plaster as ineffective as reordering nodes, in short\n" + "it is not a solution and you still rely on kernel link ordering, you\n" + "can fiddle with ACPI tables as much as you want but that does not change.\n" + "\n" + "> I also tried to use _DEP method to describe the dependency of PCIe\n" + "> nodes, but it looks that it does not work as PCI and MSI are handed\n" + "> by acpi_bus_scan and still having issue when we re-probe PCI.\n" + "\n" + "That's a tad vague to be frank, anyway it is pretty clear to me that we\n" + "have hit a wall. In ACPI there is no way to describe probe dependencies\n" + "like the one you have, it is as simple as that, and this MSI issue you\n" + "are facing is just an example, there are more eg:\n" + "\n" + "https://www.spinics.net/lists/arm-kernel/msg585825.html\n" + "\n" + "At the end of the day the choice is simple either we accept (and we\n" + "maintain because that's the problem) these hacks - and I am not willing\n" + "to do that - or we find a way to solve this from a general perspective not\n" + "as a point hack.\n" + "\n" + "I can have a look at solving the whole issue but it won't happen\n" + "tomorrow.\n" + "\n" + "Thanks,\n" + "Lorenzo\n" + "\n" + "> Thanks,\n" + "> Khuong Dinh\n" + "> \n" + "> >> Finally, please execute this command on the vmlinux that \"works\"\n" + "> >> for you:\n" + "> >>\n" + "> >> nm vmlinux | grep -E '__initcall_(xgene_pcie_msi_init|acpi_init)'\n" + "> >\n" + "> > $ nm vmlinux | grep -E '__initcall_(xgene_pcie_msi_init|acpi_init)'\n" + "> > ffff000008dab2d8 t __initcall_acpi_init4\n" + "> > ffff000008dab2c8 t __initcall_xgene_pcie_msi_init4\n" + "> >\n" + "> > Best regards,\n" + "> > Khuong Dinh\n" + "> >\n" + "> >> Even by ordering devices in the ACPI tables (that I abhor) I still do\n" + "> >> not understand how this works (I mean without relying on kernel link\n" + "> >> order to ensure that the MSI driver is probed before PCI devices are\n" + "> >> enumerated in acpi_init()).\n" + "> >>\n" + "> >> Thanks,\n" + "> >> Lorenzo\n" + "> >>\n" + "> >>> Best regards,\n" + "> >>> Khuong\n" + "> >>>\n" + "> >>> On Fri, Apr 28, 2017 at 2:27 AM, Marc Zyngier <marc.zyngier@arm.com> wrote:\n" + "> >>> > On 28/04/17 01:54, Khuong Dinh wrote:\n" + "> >>> >> From: Khuong Dinh <kdinh@apm.com>\n" + "> >>> >>\n" + "> >>> >> This patch makes pci-xgene-msi driver ACPI-aware and provides\n" + "> >>> >> MSI capability for X-Gene v1 PCIe controllers in ACPI boot mode.\n" + "> >>> >>\n" + "> >>> >> Signed-off-by: Khuong Dinh <kdinh@apm.com>\n" + "> >>> >> Signed-off-by: Duc Dang <dhdang@apm.com>\n" + "> >>> >> Acked-by: Marc Zyngier <marc.zyngier@arm.com>\n" + "> >>> >> ---\n" + "> >>> >> v2:\n" + "> >>> >> - Verify with BIOS version 3.06.25 and 3.07.09\n" + "> >>> >> v1:\n" + "> >>> >> - Initial version\n" + "> >>> >> ---\n" + "> >>> >> drivers/pci/host/pci-xgene-msi.c | 35 ++++++++++++++++++++++++++++++++---\n" + "> >>> >> 1 files changed, 32 insertions(+), 3 deletions(-)\n" + "> >>> >>\n" + "> >>> >> diff --git a/drivers/pci/host/pci-xgene-msi.c b/drivers/pci/host/pci-xgene-msi.c\n" + "> >>> >> index f1b633b..00aaa3d 100644\n" + "> >>> >> --- a/drivers/pci/host/pci-xgene-msi.c\n" + "> >>> >> +++ b/drivers/pci/host/pci-xgene-msi.c\n" + "> >>> >> @@ -24,6 +24,7 @@\n" + "> >>> >> #include <linux/pci.h>\n" + "> >>> >> #include <linux/platform_device.h>\n" + "> >>> >> #include <linux/of_pci.h>\n" + "> >>> >> +#include <linux/acpi.h>\n" + "> >>> >>\n" + "> >>> >> #define MSI_IR0 0x000000\n" + "> >>> >> #define MSI_INT0 0x800000\n" + "> >>> >> @@ -39,7 +40,7 @@ struct xgene_msi_group {\n" + "> >>> >> };\n" + "> >>> >>\n" + "> >>> >> struct xgene_msi {\n" + "> >>> >> - struct device_node *node;\n" + "> >>> >> + struct fwnode_handle *fwnode;\n" + "> >>> >> struct irq_domain *inner_domain;\n" + "> >>> >> struct irq_domain *msi_domain;\n" + "> >>> >> u64 msi_addr;\n" + "> >>> >> @@ -249,6 +250,13 @@ static void xgene_irq_domain_free(struct irq_domain *domain,\n" + "> >>> >> .free = xgene_irq_domain_free,\n" + "> >>> >> };\n" + "> >>> >>\n" + "> >>> >> +#ifdef CONFIG_ACPI\n" + "> >>> >> +static struct fwnode_handle *xgene_msi_get_fwnode(struct device *dev)\n" + "> >>> >> +{\n" + "> >>> >> + return xgene_msi_ctrl.fwnode;\n" + "> >>> >> +}\n" + "> >>> >> +#endif\n" + "> >>> >> +\n" + "> >>> >> static int xgene_allocate_domains(struct xgene_msi *msi)\n" + "> >>> >> {\n" + "> >>> >> msi->inner_domain = irq_domain_add_linear(NULL, NR_MSI_VEC,\n" + "> >>> >> @@ -256,7 +264,7 @@ static int xgene_allocate_domains(struct xgene_msi *msi)\n" + "> >>> >> if (!msi->inner_domain)\n" + "> >>> >> return -ENOMEM;\n" + "> >>> >>\n" + "> >>> >> - msi->msi_domain = pci_msi_create_irq_domain(of_node_to_fwnode(msi->node),\n" + "> >>> >> + msi->msi_domain = pci_msi_create_irq_domain(msi->fwnode,\n" + "> >>> >> &xgene_msi_domain_info,\n" + "> >>> >> msi->inner_domain);\n" + "> >>> >>\n" + "> >>> >> @@ -265,6 +273,9 @@ static int xgene_allocate_domains(struct xgene_msi *msi)\n" + "> >>> >> return -ENOMEM;\n" + "> >>> >> }\n" + "> >>> >>\n" + "> >>> >> +#ifdef CONFIG_ACPI\n" + "> >>> >> + pci_msi_register_fwnode_provider(&xgene_msi_get_fwnode);\n" + "> >>> >> +#endif\n" + "> >>> >> return 0;\n" + "> >>> >> }\n" + "> >>> >>\n" + "> >>> >> @@ -449,6 +460,13 @@ static int xgene_msi_hwirq_free(unsigned int cpu)\n" + "> >>> >> {},\n" + "> >>> >> };\n" + "> >>> >>\n" + "> >>> >> +#ifdef CONFIG_ACPI\n" + "> >>> >> +static const struct acpi_device_id xgene_msi_acpi_ids[] = {\n" + "> >>> >> + {\"APMC0D0E\", 0},\n" + "> >>> >> + { },\n" + "> >>> >> +};\n" + "> >>> >> +#endif\n" + "> >>> >> +\n" + "> >>> >> static int xgene_msi_probe(struct platform_device *pdev)\n" + "> >>> >> {\n" + "> >>> >> struct resource *res;\n" + "> >>> >> @@ -469,7 +487,17 @@ static int xgene_msi_probe(struct platform_device *pdev)\n" + "> >>> >> goto error;\n" + "> >>> >> }\n" + "> >>> >> xgene_msi->msi_addr = res->start;\n" + "> >>> >> - xgene_msi->node = pdev->dev.of_node;\n" + "> >>> >> +\n" + "> >>> >> + xgene_msi->fwnode = of_node_to_fwnode(pdev->dev.of_node);\n" + "> >>> >> + if (!xgene_msi->fwnode) {\n" + "> >>> >> + xgene_msi->fwnode = irq_domain_alloc_fwnode(NULL);\n" + "> >>> >\n" + "> >>> > Please provide something other than NULL, such as the base address if\n" + "> >>> > the device. That's quite useful for debugging.\n" + "> >>> >\n" + "> >>> >> + if (!xgene_msi->fwnode) {\n" + "> >>> >> + dev_err(&pdev->dev, \"Failed to create fwnode\\n\");\n" + "> >>> >> + rc = ENOMEM;\n" + "> >>> >> + goto error;\n" + "> >>> >> + }\n" + "> >>> >> + }\n" + "> >>> >> +\n" + "> >>> >> xgene_msi->num_cpus = num_possible_cpus();\n" + "> >>> >>\n" + "> >>> >> rc = xgene_msi_init_allocator(xgene_msi);\n" + "> >>> >> @@ -540,6 +568,7 @@ static int xgene_msi_probe(struct platform_device *pdev)\n" + "> >>> >> .driver = {\n" + "> >>> >> .name = \"xgene-msi\",\n" + "> >>> >> .of_match_table = xgene_msi_match_table,\n" + "> >>> >> + .acpi_match_table = ACPI_PTR(xgene_msi_acpi_ids),\n" + "> >>> >> },\n" + "> >>> >> .probe = xgene_msi_probe,\n" + "> >>> >> .remove = xgene_msi_remove,\n" + "> >>> >>\n" + "> >>> >\n" + "> >>> > The code is trivial, but relies on the MSI controller to probe before\n" + "> >>> > the PCI bus. What enforces this? How is it making sure that this is not\n" + "> >>> > going to break in the next kernel release? As far as I can tell, there\n" + "> >>> > is no explicit dependency between the two, making it the whole thing\n" + "> >>> > extremely fragile.\n" + "> >>> >\n" + "> >>> > Thanks,\n" + "> >>> >\n" + "> >>> > M.\n" + "> >>> > --\n" + "> >>> > Jazz is not dead. It just smells funny...\n" + "> >>>\n" + > >>> -- -8a64b8f259c3b7e5d6c679eb012febb7bc95c1e9ccf4d97d3b58169197701ef6 +1551c9b01fc7bb865e9a5d71160f28db82bc584e2da28b567f4981e1c7c62dda
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.