All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <20170614125902.GA29762@red-moon>

diff --git a/a/1.txt b/N1/1.txt
index 8919372..97d01af 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,216 +1,284 @@
-T24gVHVlLCBKdW4gMTMsIDIwMTcgYXQgMDE6NTY6NDRQTSAtMDcwMCwgS2h1b25nIERpbmggd3Jv
-dGU6Cj4gSGkgTG9yZW56bywKPiAKPiBPbiBUaHUsIEp1biA4LCAyMDE3IGF0IDM6MzkgQU0sIExv
-cmVuem8gUGllcmFsaXNpCj4gPGxvcmVuem8ucGllcmFsaXNpQGFybS5jb20+IHdyb3RlOgo+ID4g
-T24gVHVlLCBKdW4gMDYsIDIwMTcgYXQgMDk6NDQ6MTVBTSAtMDcwMCwgS2h1b25nIERpbmggd3Jv
-dGU6Cj4gPj4gSGkgTG9yZW56bywKPiA+Pgo+ID4+IE9uIFR1ZSwgTWF5IDksIDIwMTcgYXQgMzo1
-NSBQTSwgS2h1b25nIERpbmggPGtkaW5oQGFwbS5jb20+IHdyb3RlOgo+ID4+ID4gSGkgTG9yZW56
-bywKPiA+PiA+Cj4gPj4gPiBPbiBGcmksIE1heSA1LCAyMDE3IGF0IDk6NTEgQU0sIExvcmVuem8g
-UGllcmFsaXNpCj4gPj4gPiA8bG9yZW56by5waWVyYWxpc2lAYXJtLmNvbT4gd3JvdGU6Cj4gPj4g
-Pj4gT24gVGh1LCBNYXkgMDQsIDIwMTcgYXQgMDU6MzY6MDZQTSAtMDcwMCwgS2h1b25nIERpbmgg
-d3JvdGU6Cj4gPj4gPj4+IEhpIE1hcmMsCj4gPj4gPj4+IFRoZXJlJ3Mgbm8gZXhwbGljaXQgZGVw
-ZW5kZW5jeSBiZXR3ZWVuIHBjaWUgZHJpdmVyIGFuZCBtc2kKPiA+PiA+Pj4gY29udHJvbGxlci4g
-IFRoZSBjdXJyZW50IHNvbHV0aW9uIHRoYXQgd2UgZGlkIGlzIHJlbHlpbmcgb24gdGhlCj4gPj4g
-Pj4+IG5vZGUgb3JkZXJpbmcgaW4gQklPUy4gIEFDUEkgNS4wIGludHJvZHVjZWQgX0RFUCBtZXRo
-b2QgdG8gYXNzaWduIGEKPiA+PiA+Pj4gaGlnaGVyIHByaW9yaXR5IGluIHN0YXJ0IG9yZGVyaW5n
-LiAgVGhpcyBtZXRob2QgY291bGQgYmUgYXBwbGllZCBpbgo+ID4+ID4+PiBjYXNlIG9mIG1zaSBh
-bmQgcGNpZSBhcmUgdGhlIHNhbWUgbGV2ZWwgb2Ygc3Vic3lzX2luaXQgKGluIEFDUEkKPiA+PiA+
-Pj4gYm9vdCkuICBIb3dldmVyLCBQQ0llIGRyaXZlciBoYXMgbm90IHN1cHBvcnRlZCBmb3IgdGhp
-cyBkZXBlbmRlbmN5Cj4gPj4gPj4+IGNoZWNrIHlldC4gIEhvdyBkbyB5b3UgdGhpbmsgYWJvdXQg
-dGhpcyBzb2x1dGlvbi4KPiA+PiA+Pgo+ID4+ID4+IEZpcnN0IG9mZiwgeW91IGNhbid0IHBvc3Qg
-ZW1haWxzIHdpdGggY29uZmlkZW50aWFsaXR5IG5vdGljZXMgb24KPiA+PiA+PiBtYWlsaW5nIGxp
-c3RzIHNvIHJlbW92ZSBpdCBmcm9tIG5vdyBvbndhcmRzLgo+ID4+ID4KPiA+PiA+IEZpeGVkCj4g
-Pj4gPgo+ID4+ID4+IFNlY29uZGx5LCBJIGNvbW1lbnRlZCBvbiB0aGlzIGJlZm9yZSwgc28geW91
-IGtub3cgd2hhdCBteSBvcGluaW9uIGlzLgo+ID4+ID4KPiA+PiA+IEkgZ290IHlvdXIgb3Bpbmlv
-bi4gSSdsbCBpbXBsZW1lbnQgYXMgeW91ciBzdWdnZXN0aW9uLgo+ID4+ID4KPiA+Pgo+ID4+ICAg
-UmVnYXJkaW5nIHRvIHlvdXIgcHJldmlvdXMgc3VnZ2VzdGlvbiB0byBhZGQgYSBob29rIHdhbGtp
-bmcgdGhlIEFDUEkKPiA+PiAgIG5hbWVzcGFjZSBiZWZvcmUgYWNwaV9idXNfc2NhbigpIGluIGFj
-cGlfc2Nhbl9pbml0KCkgdG8gbWFrZSBNU0kKPiA+PiAgIGNvbnRyb2xsZXJzIG11c3QgYmUgcHJv
-YmVkIGJlZm9yZSBQQ0kuICBJIGhhdmUgYSBjb25jZXJuIHRoYXQgdGhlCj4gPj4gICBNU0kgbmFt
-ZXNwYWNlIOKAnCBfU0IuTVNJWOKAnSBpcyBub3QgYSB1bmlxdWUgbmFtZSBhbmQgaG93IGNhbiB3
-ZSB3YWxrCj4gPj4gICB0aGUgQUNQSSBuYW1lc3BhY2UgYW5kIHVzZSB0aGlzIG5hbWUgdG8gbWFr
-ZSBNU0kgcHJvYmVkIGJlZm9yZSBQQ0kuCj4gPj4gICBNYXkgeW91IGhhdmUgbGl0dGxlIGJpdCBt
-b3JlIGluZm9ybWF0aW9uIGZvciB0aGlzIG9yIGRvIHlvdSBoYXZlCj4gPj4gICBhbm90aGVyIHN1
-Z2dlc3Rpb24gZm9yIHRoaXM/Cj4gPj4KPiA+PiAgICBUaGVyZeKAmXMgYW5vdGhlciBzb2x1dGlv
-biB3aGljaCBtYWtlcyB0aGlzIHNpbXBsZXIgYW5kIEnigJlkIGxpa2UgdG8KPiA+PiAgICBhc2sg
-eW91ciBvcGluaW9uIGFib3V0IHRoaXMuCj4gPj4gICAgVGhlIHNvbHV0aW9uIGlzIHRvIG1ha2Ug
-YW4gaGllcmFyY2h5IGJldHdlZW4gTVNJIGFuZCBQQ0kgbm9kZXMgIGFzIGJlbG93Ogo+ID4+IERl
-dmljZShcX1NCLk1TSVgpIHsKPiA+PiAgICBEZXZpY2UoXF9TQi5QQ0kwKQo+ID4+ICAgIERldmlj
-ZShcX1NCLlBDSTEpCj4gPj4gICAg4oCm4oCmCj4gPj4gfQo+ID4+ICAgSW4gb3RoZXIgd29yZCwg
-TVNJWCBub2RlIGlzIGEgcGFyZW50IG5vZGUgb2YgUENJIG5vZGVzIGluIEFDUEkKPiA+PiAgIHRh
-YmxlLiAgSW4gdGhpcyBzZW5zZSwgdGhlcmXigJlzIGFuIGV4cGxpY2l0IGRlcGVuZGVuY3kgYmV0
-d2VlbiBNU0kKPiA+PiAgIGFuZCBQQ0ksIE1TSSBjb250cm9sbGVyIG11c3QgYmUgcHJvYmVkIGJl
-Zm9yZSBQQ0kgYW5kIGl0IHdpbGwKPiA+PiAgIGd1YXJhbnRlZSBub3QgYnJlYWtpbmcgbmV4dCBr
-ZXJuZWwgcmVsZWFzZXMuICBIb3cgZG8geW91IHRoaW5rIGFib3V0Cj4gPj4gICB0aGlzIHNvbHV0
-aW9uLgo+ID4KPiA+IEkgdGhpbmsgdGhhdCdzIGEgcGxhc3RlciBhcyBpbmVmZmVjdGl2ZSBhcyBy
-ZW9yZGVyaW5nIG5vZGVzLCBpbiBzaG9ydAo+ID4gaXQgaXMgbm90IGEgc29sdXRpb24gYW5kIHlv
-dSBzdGlsbCByZWx5IG9uIGtlcm5lbCBsaW5rIG9yZGVyaW5nLCB5b3UKPiA+IGNhbiBmaWRkbGUg
-d2l0aCBBQ1BJIHRhYmxlcyBhcyBtdWNoIGFzIHlvdSB3YW50IGJ1dCB0aGF0IGRvZXMgbm90IGNo
-YW5nZS4KPiA+Cj4gPj4gIEkgYWxzbyB0cmllZCB0byB1c2UgX0RFUCBtZXRob2QgdG8gZGVzY3Jp
-YmUgdGhlIGRlcGVuZGVuY3kgb2YgUENJZQo+ID4+ICBub2RlcywgYnV0IGl0IGxvb2tzIHRoYXQg
-aXQgZG9lcyBub3Qgd29yayBhcyBQQ0kgYW5kIE1TSSBhcmUgaGFuZGVkCj4gPj4gIGJ5IGFjcGlf
-YnVzX3NjYW4gYW5kIHN0aWxsIGhhdmluZyBpc3N1ZSB3aGVuIHdlIHJlLXByb2JlIFBDSS4KPiA+
-Cj4gPiBUaGF0J3MgYSB0YWQgdmFndWUgdG8gYmUgZnJhbmssIGFueXdheSBpdCBpcyBwcmV0dHkg
-Y2xlYXIgdG8gbWUgdGhhdCB3ZQo+ID4gaGF2ZSBoaXQgYSB3YWxsLiBJbiBBQ1BJIHRoZXJlIGlz
-IG5vIHdheSB0byBkZXNjcmliZSBwcm9iZSBkZXBlbmRlbmNpZXMKPiA+IGxpa2UgdGhlIG9uZSB5
-b3UgaGF2ZSwgaXQgaXMgYXMgc2ltcGxlIGFzIHRoYXQsIGFuZCB0aGlzIE1TSSBpc3N1ZSB5b3UK
-PiA+IGFyZSBmYWNpbmcgaXMganVzdCBhbiBleGFtcGxlLCB0aGVyZSBhcmUgbW9yZSBlZzoKPiA+
-Cj4gPiBodHRwczovL3d3dy5zcGluaWNzLm5ldC9saXN0cy9hcm0ta2VybmVsL21zZzU4NTgyNS5o
-dG1sCj4gPgo+ID4gQXQgdGhlIGVuZCBvZiB0aGUgZGF5IHRoZSBjaG9pY2UgaXMgc2ltcGxlIGVp
-dGhlciB3ZSBhY2NlcHQgKGFuZCB3ZQo+ID4gbWFpbnRhaW4gYmVjYXVzZSB0aGF0J3MgdGhlIHBy
-b2JsZW0pIHRoZXNlIGhhY2tzIC0gYW5kIEkgYW0gbm90IHdpbGxpbmcKPiA+IHRvIGRvIHRoYXQg
-LSBvciB3ZSBmaW5kIGEgd2F5IHRvIHNvbHZlIHRoaXMgZnJvbSBhIGdlbmVyYWwgcGVyc3BlY3Rp
-dmUgbm90Cj4gPiBhcyBhIHBvaW50IGhhY2suCj4gPgo+ID4gSSBjYW4gaGF2ZSBhIGxvb2sgYXQg
-c29sdmluZyB0aGUgd2hvbGUgaXNzdWUgYnV0IGl0IHdvbid0IGhhcHBlbgo+ID4gdG9tb3Jyb3cu
-Cj4gCj4gVGhhbmtzIGZvciBoZWxwaW5nIHRvIHJlc29sdmUgdGhpcyBnZW5lcmFsIEFDUEkgZGVw
-ZW5kZW5jZSBpc3N1ZS4KPiBJIGxvb2sgZm9yd2FyZCBmb3IgYSB2ZXJzaW9uIHRvIHRlc3Qgd2l0
-aC4KPiAKPiBDYW4gd2Ugc2VwYXJhdGUgdGhlIGdlbmVyYWwgZGVwZW5kZW5jZSBwYXRjaCBmcm9t
-IHRoZSBYLUdlbmUgTVNJIEFDUEkKPiBlbmFibGUgcGF0Y2guCj4gVGhpcyBvcmlnaW5hbCBwYXRj
-aCB3YXMgdG8gZW5hYmxlIEFDUEkgc3VwcG9ydCBmb3IgUENJZSBNU0kuCj4gVGhlIGRlcGVuZGVu
-Y2UgaXNzdWUgY2FuIGJlIHJlc29sdmVkIHNlcGFyYXRlbHkuCj4gQ2FuIHlvdSBoZWxwIHRvIHB1
-bGwgaW4gdGhlIHBhdGNoLgoKT2ssIHByYWdtYXRpY2FsbHkgdGhlIG9ubHkgc2FuZSB0aGluZyB5
-b3UgY2FuIGRvIGlzOgoKKDEpICBBZGQgYW4gWC1nZW5lIHNwZWNpZmljIGhvb2sgaW4gZHJpdmVy
-cy9hY3BpL3NjYW4uYyAoYWNwaV9zY2FuX2luaXQoKSkKICAgICB0aGF0IGNhcnJpZXMgb3V0IGZ3
-bm9kZSByZWdpc3RyYXRpb24gKGllIHJlZ2lzdGVyIHRoZSBmd25vZGUgYnkKICAgICBzZWFyY2hp
-bmcgdGhlIE1TSSBISUQgb2JqZWN0IC0gdGhpcyBkb2VzIG5vdCBkZXBlbmQgb24gQUNQSSBkZXZp
-Y2UKICAgICBub2RlcyBvcmRlciAtIHlvdSBlbmZvcmNlIHRoZSBvcmRlciBieSBwYXJzaW5nIHRo
-ZSBuYW1lc3BhY2UgYmVmb3JlCiAgICAgQUNQSSBjb3JlIGRvZXMgaXQsIGF0IHRoYXQgcG9pbnQg
-aW4gdGltZSBBQ1BJIG9iamVjdHMgYXJlIGNyZWF0ZWQpLgogICAgIE5vdCBzdXJlIFJhZmFlbCB3
-aWxsIGJlIGhhcHB5IHRvIHNlZSB0aGlzIGNvZGUgYnV0IHRoYXQncyB0aGUgb25seQogICAgIHNv
-bHV0aW9uIHRoYXQgZG9lcyBub3QgcmVseSBvbiBBQ1BJIGRldmljZSBub2RlcyBvcmRlcmluZyBh
-bmQga2VybmVsCiAgICAgbGluayBvcmRlcmluZy4gWW91IG1heSBhY2hpZXZlIHRoZSBzYW1lIGJ5
-IGV4dGVuZGluZyB0aGUgQUNQSSBBUEQKICAgICBjb2RlIChkcml2ZXJzL2FjcGkvYWNwaV9hcGQu
-Yykgd2hldGhlciB0aGF0J3MgdGhlIGJlc3Qgd2F5IGZvcndhcmQgaXMKICAgICB0byBiZSBzZWVu
-LgoKKDIpICBZb3UgY2FuIGFsc28gYWRkIGFuIHhnZW5lIHNwZWNpZmljIHNjYW4gaGFuZGxlciBh
-dCBhcmNoX2luaXRfY2FsbCgpCiAgICAgYnV0IGdpdmVuIHRoYXQgUENJIHJvb3QgYnJpZGdlIGlz
-IG1hbmFnZWQgdGhyb3VnaCBhIHNjYW4gaGFuZGxlciB0b28geW91CiAgICAgd291bGQgcmVseSBv
-biBBQ1BJIGRldmljZXMgbm9kZXMgb3JkZXJpbmcgaW4gdGhlIERTRFQuIExldCBtZSBleHBsYWlu
-CiAgICAgc29tZXRoaW5nIGZvciB0aGUgYmVuZWZpdCBvZiBldmVyeW9uZSByZWFkaW5nIHRoaXMg
-dGhyZWFkOiBJIGRvIG5vdCB3YW50CiAgICAgWC1nZW5lIEFDUEkgdGFibGVzIHRvIGZvcmNlIHRo
-ZSBrZXJuZWwgdG8gc2NhbiBkZXZpY2VzIGluIGFueSBvcmRlcgogICAgIHdoYXRzb3ZlciBiZWNh
-dXNlIHRoaXMgd291bGQgbWVhbiB3ZSB3aWxsIF9uZXZlcl8gYmUgYWJsZSB0byBjaGFuZ2UgdGhl
-CiAgICAgc2NhbiBvcmRlciBpZiB3ZSB3YW50ZWQgdG8gbGVzdCB3ZSB0cmlnZ2VyIHJlZ3Jlc3Np
-b25zLiBTbyB0aGlzIGlzCiAgICAgYSBub24tb3B0aW9uIGluIG15IG9waW5pb24uCgooMykgTGFz
-dCBvcHRpb24gaXMgdG8gcmVnaXN0ZXIgdGhlIE1TSSBmd25vZGUgZWl0aGVyIGluIFBDSSBFQ0FN
-IHF1aXJrCiAgICBoYW5kbGluZyBvciBpbiBhcm02NCBiZWZvcmUgcHJvYmluZyB0aGUgUENJIHJv
-b3QgYnVzLgoKSSBhbSBub3Qga2VlbiBvbiAoMikgYW5kICgzKSBhdCBhbGwsIHNvIF9pZl8gd2Ug
-aGF2ZSB0byBmaW5kIGEgc29sdXRpb24KdG8gdGhpcyBwcm9ibGVtICgxKSBpcyB0aGUgb25seSBv
-cHRpb24geW91IGhhdmUgZm9yIHRoZSB0aW1lIGJlaW5nIGFzCmZhciBhcyBJIGFtIGNvbmNlcm5l
-ZC4KCkxvcmVuem8KCj4gCj4gQmVzdCByZWdhcmRzLAo+IEtodW9uZyBEaW5oCj4gCj4gPiBUaGFu
-a3MsCj4gPiBMb3JlbnpvCj4gPgo+ID4+IFRoYW5rcywKPiA+PiBLaHVvbmcgRGluaAo+ID4+Cj4g
-Pj4gPj4gRmluYWxseSwgcGxlYXNlIGV4ZWN1dGUgdGhpcyBjb21tYW5kIG9uIHRoZSB2bWxpbnV4
-IHRoYXQgIndvcmtzIgo+ID4+ID4+IGZvciB5b3U6Cj4gPj4gPj4KPiA+PiA+PiBubSB2bWxpbnV4
-IHwgZ3JlcCAtRSAnX19pbml0Y2FsbF8oeGdlbmVfcGNpZV9tc2lfaW5pdHxhY3BpX2luaXQpJwo+
-ID4+ID4KPiA+PiA+ICQgbm0gdm1saW51eCB8IGdyZXAgLUUgJ19faW5pdGNhbGxfKHhnZW5lX3Bj
-aWVfbXNpX2luaXR8YWNwaV9pbml0KScKPiA+PiA+IGZmZmYwMDAwMDhkYWIyZDggdCBfX2luaXRj
-YWxsX2FjcGlfaW5pdDQKPiA+PiA+IGZmZmYwMDAwMDhkYWIyYzggdCBfX2luaXRjYWxsX3hnZW5l
-X3BjaWVfbXNpX2luaXQ0Cj4gPj4gPgo+ID4+ID4gQmVzdCByZWdhcmRzLAo+ID4+ID4gS2h1b25n
-IERpbmgKPiA+PiA+Cj4gPj4gPj4gRXZlbiBieSBvcmRlcmluZyBkZXZpY2VzIGluIHRoZSBBQ1BJ
-IHRhYmxlcyAodGhhdCBJIGFiaG9yKSBJIHN0aWxsIGRvCj4gPj4gPj4gbm90IHVuZGVyc3RhbmQg
-aG93IHRoaXMgd29ya3MgKEkgbWVhbiB3aXRob3V0IHJlbHlpbmcgb24ga2VybmVsIGxpbmsKPiA+
-PiA+PiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgTVNJIGRyaXZlciBpcyBwcm9iZWQgYmVmb3Jl
-IFBDSSBkZXZpY2VzIGFyZQo+ID4+ID4+IGVudW1lcmF0ZWQgaW4gYWNwaV9pbml0KCkpLgo+ID4+
-ID4+Cj4gPj4gPj4gVGhhbmtzLAo+ID4+ID4+IExvcmVuem8KPiA+PiA+Pgo+ID4+ID4+PiBCZXN0
-IHJlZ2FyZHMsCj4gPj4gPj4+IEtodW9uZwo+ID4+ID4+Pgo+ID4+ID4+PiBPbiBGcmksIEFwciAy
-OCwgMjAxNyBhdCAyOjI3IEFNLCBNYXJjIFp5bmdpZXIgPG1hcmMuenluZ2llckBhcm0uY29tPiB3
-cm90ZToKPiA+PiA+Pj4gPiBPbiAyOC8wNC8xNyAwMTo1NCwgS2h1b25nIERpbmggd3JvdGU6Cj4g
-Pj4gPj4+ID4+IEZyb206IEtodW9uZyBEaW5oIDxrZGluaEBhcG0uY29tPgo+ID4+ID4+PiA+Pgo+
-ID4+ID4+PiA+PiBUaGlzIHBhdGNoIG1ha2VzIHBjaS14Z2VuZS1tc2kgZHJpdmVyIEFDUEktYXdh
-cmUgYW5kIHByb3ZpZGVzCj4gPj4gPj4+ID4+IE1TSSBjYXBhYmlsaXR5IGZvciBYLUdlbmUgdjEg
-UENJZSBjb250cm9sbGVycyBpbiBBQ1BJIGJvb3QgbW9kZS4KPiA+PiA+Pj4gPj4KPiA+PiA+Pj4g
-Pj4gU2lnbmVkLW9mZi1ieTogS2h1b25nIERpbmggPGtkaW5oQGFwbS5jb20+Cj4gPj4gPj4+ID4+
-IFNpZ25lZC1vZmYtYnk6IER1YyBEYW5nIDxkaGRhbmdAYXBtLmNvbT4KPiA+PiA+Pj4gPj4gQWNr
-ZWQtYnk6IE1hcmMgWnluZ2llciA8bWFyYy56eW5naWVyQGFybS5jb20+Cj4gPj4gPj4+ID4+IC0t
-LQo+ID4+ID4+PiA+PiB2MjoKPiA+PiA+Pj4gPj4gIC0gVmVyaWZ5IHdpdGggQklPUyB2ZXJzaW9u
-IDMuMDYuMjUgYW5kIDMuMDcuMDkKPiA+PiA+Pj4gPj4gdjE6Cj4gPj4gPj4+ID4+ICAtIEluaXRp
-YWwgdmVyc2lvbgo+ID4+ID4+PiA+PiAtLS0KPiA+PiA+Pj4gPj4gIGRyaXZlcnMvcGNpL2hvc3Qv
-cGNpLXhnZW5lLW1zaS5jIHwgICAzNSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0t
-LQo+ID4+ID4+PiA+PiAgMSBmaWxlcyBjaGFuZ2VkLCAzMiBpbnNlcnRpb25zKCspLCAzIGRlbGV0
-aW9ucygtKQo+ID4+ID4+PiA+Pgo+ID4+ID4+PiA+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kv
-aG9zdC9wY2kteGdlbmUtbXNpLmMgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS14Z2VuZS1tc2kuYwo+
-ID4+ID4+PiA+PiBpbmRleCBmMWI2MzNiLi4wMGFhYTNkIDEwMDY0NAo+ID4+ID4+PiA+PiAtLS0g
-YS9kcml2ZXJzL3BjaS9ob3N0L3BjaS14Z2VuZS1tc2kuYwo+ID4+ID4+PiA+PiArKysgYi9kcml2
-ZXJzL3BjaS9ob3N0L3BjaS14Z2VuZS1tc2kuYwo+ID4+ID4+PiA+PiBAQCAtMjQsNiArMjQsNyBA
-QAo+ID4+ID4+PiA+PiAgI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgo+ID4+ID4+PiA+PiAgI2luY2x1
-ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ID4+ID4+PiA+PiAgI2luY2x1ZGUgPGxpbnV4
-L29mX3BjaS5oPgo+ID4+ID4+PiA+PiArI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KPiA+PiA+Pj4g
-Pj4KPiA+PiA+Pj4gPj4gICNkZWZpbmUgTVNJX0lSMCAgICAgICAgICAgICAgICAgICAgICAweDAw
-MDAwMAo+ID4+ID4+PiA+PiAgI2RlZmluZSBNU0lfSU5UMCAgICAgICAgICAgICAweDgwMDAwMAo+
-ID4+ID4+PiA+PiBAQCAtMzksNyArNDAsNyBAQCBzdHJ1Y3QgeGdlbmVfbXNpX2dyb3VwIHsKPiA+
-PiA+Pj4gPj4gIH07Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+ICBzdHJ1Y3QgeGdlbmVfbXNpIHsK
-PiA+PiA+Pj4gPj4gLSAgICAgc3RydWN0IGRldmljZV9ub2RlICAgICAgKm5vZGU7Cj4gPj4gPj4+
-ID4+ICsgICAgIHN0cnVjdCBmd25vZGVfaGFuZGxlICAgICpmd25vZGU7Cj4gPj4gPj4+ID4+ICAg
-ICAgIHN0cnVjdCBpcnFfZG9tYWluICAgICAgICppbm5lcl9kb21haW47Cj4gPj4gPj4+ID4+ICAg
-ICAgIHN0cnVjdCBpcnFfZG9tYWluICAgICAgICptc2lfZG9tYWluOwo+ID4+ID4+PiA+PiAgICAg
-ICB1NjQgICAgICAgICAgICAgICAgICAgICBtc2lfYWRkcjsKPiA+PiA+Pj4gPj4gQEAgLTI0OSw2
-ICsyNTAsMTMgQEAgc3RhdGljIHZvaWQgeGdlbmVfaXJxX2RvbWFpbl9mcmVlKHN0cnVjdCBpcnFf
-ZG9tYWluICpkb21haW4sCj4gPj4gPj4+ID4+ICAgICAgIC5mcmVlICAgPSB4Z2VuZV9pcnFfZG9t
-YWluX2ZyZWUsCj4gPj4gPj4+ID4+ICB9Owo+ID4+ID4+PiA+Pgo+ID4+ID4+PiA+PiArI2lmZGVm
-IENPTkZJR19BQ1BJCj4gPj4gPj4+ID4+ICtzdGF0aWMgc3RydWN0IGZ3bm9kZV9oYW5kbGUgKnhn
-ZW5lX21zaV9nZXRfZndub2RlKHN0cnVjdCBkZXZpY2UgKmRldikKPiA+PiA+Pj4gPj4gK3sKPiA+
-PiA+Pj4gPj4gKyAgICAgcmV0dXJuIHhnZW5lX21zaV9jdHJsLmZ3bm9kZTsKPiA+PiA+Pj4gPj4g
-K30KPiA+PiA+Pj4gPj4gKyNlbmRpZgo+ID4+ID4+PiA+PiArCj4gPj4gPj4+ID4+ICBzdGF0aWMg
-aW50IHhnZW5lX2FsbG9jYXRlX2RvbWFpbnMoc3RydWN0IHhnZW5lX21zaSAqbXNpKQo+ID4+ID4+
-PiA+PiAgewo+ID4+ID4+PiA+PiAgICAgICBtc2ktPmlubmVyX2RvbWFpbiA9IGlycV9kb21haW5f
-YWRkX2xpbmVhcihOVUxMLCBOUl9NU0lfVkVDLAo+ID4+ID4+PiA+PiBAQCAtMjU2LDcgKzI2NCw3
-IEBAIHN0YXRpYyBpbnQgeGdlbmVfYWxsb2NhdGVfZG9tYWlucyhzdHJ1Y3QgeGdlbmVfbXNpICpt
-c2kpCj4gPj4gPj4+ID4+ICAgICAgIGlmICghbXNpLT5pbm5lcl9kb21haW4pCj4gPj4gPj4+ID4+
-ICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+IC0g
-ICAgIG1zaS0+bXNpX2RvbWFpbiA9IHBjaV9tc2lfY3JlYXRlX2lycV9kb21haW4ob2Zfbm9kZV90
-b19md25vZGUobXNpLT5ub2RlKSwKPiA+PiA+Pj4gPj4gKyAgICAgbXNpLT5tc2lfZG9tYWluID0g
-cGNpX21zaV9jcmVhdGVfaXJxX2RvbWFpbihtc2ktPmZ3bm9kZSwKPiA+PiA+Pj4gPj4gICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGdlbmVfbXNpX2Rv
-bWFpbl9pbmZvLAo+ID4+ID4+PiA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgIG1zaS0+aW5uZXJfZG9tYWluKTsKPiA+PiA+Pj4gPj4KPiA+PiA+Pj4g
-Pj4gQEAgLTI2NSw2ICsyNzMsOSBAQCBzdGF0aWMgaW50IHhnZW5lX2FsbG9jYXRlX2RvbWFpbnMo
-c3RydWN0IHhnZW5lX21zaSAqbXNpKQo+ID4+ID4+PiA+PiAgICAgICAgICAgICAgIHJldHVybiAt
-RU5PTUVNOwo+ID4+ID4+PiA+PiAgICAgICB9Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+ICsjaWZk
-ZWYgQ09ORklHX0FDUEkKPiA+PiA+Pj4gPj4gKyAgICAgcGNpX21zaV9yZWdpc3Rlcl9md25vZGVf
-cHJvdmlkZXIoJnhnZW5lX21zaV9nZXRfZndub2RlKTsKPiA+PiA+Pj4gPj4gKyNlbmRpZgo+ID4+
-ID4+PiA+PiAgICAgICByZXR1cm4gMDsKPiA+PiA+Pj4gPj4gIH0KPiA+PiA+Pj4gPj4KPiA+PiA+
-Pj4gPj4gQEAgLTQ0OSw2ICs0NjAsMTMgQEAgc3RhdGljIGludCB4Z2VuZV9tc2lfaHdpcnFfZnJl
-ZSh1bnNpZ25lZCBpbnQgY3B1KQo+ID4+ID4+PiA+PiAgICAgICB7fSwKPiA+PiA+Pj4gPj4gIH07
-Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+ICsjaWZkZWYgQ09ORklHX0FDUEkKPiA+PiA+Pj4gPj4g
-K3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgeGdlbmVfbXNpX2FjcGlfaWRzW10g
-PSB7Cj4gPj4gPj4+ID4+ICsgICAgIHsiQVBNQzBEMEUiLCAwfSwKPiA+PiA+Pj4gPj4gKyAgICAg
-eyB9LAo+ID4+ID4+PiA+PiArfTsKPiA+PiA+Pj4gPj4gKyNlbmRpZgo+ID4+ID4+PiA+PiArCj4g
-Pj4gPj4+ID4+ICBzdGF0aWMgaW50IHhnZW5lX21zaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2
-aWNlICpwZGV2KQo+ID4+ID4+PiA+PiAgewo+ID4+ID4+PiA+PiAgICAgICBzdHJ1Y3QgcmVzb3Vy
-Y2UgKnJlczsKPiA+PiA+Pj4gPj4gQEAgLTQ2OSw3ICs0ODcsMTcgQEAgc3RhdGljIGludCB4Z2Vu
-ZV9tc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+PiA+Pj4gPj4gICAg
-ICAgICAgICAgICBnb3RvIGVycm9yOwo+ID4+ID4+PiA+PiAgICAgICB9Cj4gPj4gPj4+ID4+ICAg
-ICAgIHhnZW5lX21zaS0+bXNpX2FkZHIgPSByZXMtPnN0YXJ0Owo+ID4+ID4+PiA+PiAtICAgICB4
-Z2VuZV9tc2ktPm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKPiA+PiA+Pj4gPj4gKwo+ID4+ID4+
-PiA+PiArICAgICB4Z2VuZV9tc2ktPmZ3bm9kZSA9IG9mX25vZGVfdG9fZndub2RlKHBkZXYtPmRl
-di5vZl9ub2RlKTsKPiA+PiA+Pj4gPj4gKyAgICAgaWYgKCF4Z2VuZV9tc2ktPmZ3bm9kZSkgewo+
-ID4+ID4+PiA+PiArICAgICAgICAgICAgIHhnZW5lX21zaS0+Zndub2RlID0gaXJxX2RvbWFpbl9h
-bGxvY19md25vZGUoTlVMTCk7Cj4gPj4gPj4+ID4KPiA+PiA+Pj4gPiBQbGVhc2UgcHJvdmlkZSBz
-b21ldGhpbmcgb3RoZXIgdGhhbiBOVUxMLCBzdWNoIGFzIHRoZSBiYXNlIGFkZHJlc3MgaWYKPiA+
-PiA+Pj4gPiB0aGUgZGV2aWNlLiBUaGF0J3MgcXVpdGUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCj4g
-Pj4gPj4+ID4KPiA+PiA+Pj4gPj4gKyAgICAgICAgICAgICBpZiAoIXhnZW5lX21zaS0+Zndub2Rl
-KSB7Cj4gPj4gPj4+ID4+ICsgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZwZGV2LT5kZXYs
-ICJGYWlsZWQgdG8gY3JlYXRlIGZ3bm9kZVxuIik7Cj4gPj4gPj4+ID4+ICsgICAgICAgICAgICAg
-ICAgICAgICByYyA9IEVOT01FTTsKPiA+PiA+Pj4gPj4gKyAgICAgICAgICAgICAgICAgICAgIGdv
-dG8gZXJyb3I7Cj4gPj4gPj4+ID4+ICsgICAgICAgICAgICAgfQo+ID4+ID4+PiA+PiArICAgICB9
-Cj4gPj4gPj4+ID4+ICsKPiA+PiA+Pj4gPj4gICAgICAgeGdlbmVfbXNpLT5udW1fY3B1cyA9IG51
-bV9wb3NzaWJsZV9jcHVzKCk7Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+ICAgICAgIHJjID0geGdl
-bmVfbXNpX2luaXRfYWxsb2NhdG9yKHhnZW5lX21zaSk7Cj4gPj4gPj4+ID4+IEBAIC01NDAsNiAr
-NTY4LDcgQEAgc3RhdGljIGludCB4Z2VuZV9tc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj
-ZSAqcGRldikKPiA+PiA+Pj4gPj4gICAgICAgLmRyaXZlciA9IHsKPiA+PiA+Pj4gPj4gICAgICAg
-ICAgICAgICAubmFtZSA9ICJ4Z2VuZS1tc2kiLAo+ID4+ID4+PiA+PiAgICAgICAgICAgICAgIC5v
-Zl9tYXRjaF90YWJsZSA9IHhnZW5lX21zaV9tYXRjaF90YWJsZSwKPiA+PiA+Pj4gPj4gKyAgICAg
-ICAgICAgICAuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKHhnZW5lX21zaV9hY3BpX2lkcyks
-Cj4gPj4gPj4+ID4+ICAgICAgIH0sCj4gPj4gPj4+ID4+ICAgICAgIC5wcm9iZSA9IHhnZW5lX21z
-aV9wcm9iZSwKPiA+PiA+Pj4gPj4gICAgICAgLnJlbW92ZSA9IHhnZW5lX21zaV9yZW1vdmUsCj4g
-Pj4gPj4+ID4+Cj4gPj4gPj4+ID4KPiA+PiA+Pj4gPiBUaGUgY29kZSBpcyB0cml2aWFsLCBidXQg
-cmVsaWVzIG9uIHRoZSBNU0kgY29udHJvbGxlciB0byBwcm9iZSBiZWZvcmUKPiA+PiA+Pj4gPiB0
-aGUgUENJIGJ1cy4gV2hhdCBlbmZvcmNlcyB0aGlzPyBIb3cgaXMgaXQgbWFraW5nIHN1cmUgdGhh
-dCB0aGlzIGlzIG5vdAo+ID4+ID4+PiA+IGdvaW5nIHRvIGJyZWFrIGluIHRoZSBuZXh0IGtlcm5l
-bCByZWxlYXNlPyBBcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGhlcmUKPiA+PiA+Pj4gPiBpcyBubyBl
-eHBsaWNpdCBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIHR3bywgbWFraW5nIGl0IHRoZSB3aG9sZSB0
-aGluZwo+ID4+ID4+PiA+IGV4dHJlbWVseSBmcmFnaWxlLgo+ID4+ID4+PiA+Cj4gPj4gPj4+ID4g
-VGhhbmtzLAo+ID4+ID4+PiA+Cj4gPj4gPj4+ID4gICAgICAgICBNLgo+ID4+ID4+PiA+IC0tCj4g
-Pj4gPj4+ID4gSmF6eiBpcyBub3QgZGVhZC4gSXQganVzdCBzbWVsbHMgZnVubnkuLi4KPiA+PiA+
-Pj4KPiA+PiA+Pj4gLS0KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
-X19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlz
-dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp
-bmZvL2xpbnV4LWFybS1rZXJuZWwK
+On Tue, Jun 13, 2017 at 01:56:44PM -0700, Khuong Dinh wrote:
+> Hi Lorenzo,
+> 
+> On Thu, Jun 8, 2017 at 3:39 AM, Lorenzo Pieralisi
+> <lorenzo.pieralisi@arm.com> wrote:
+> > 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 for helping to resolve this general ACPI dependence issue.
+> I look forward for a version to test with.
+> 
+> Can we separate the general dependence patch from the X-Gene MSI ACPI
+> enable patch.
+> This original patch was to enable ACPI support for PCIe MSI.
+> The dependence issue can be resolved separately.
+> Can you help to pull in the patch.
+
+Ok, pragmatically the only sane thing you can do is:
+
+(1)  Add an X-gene specific hook in drivers/acpi/scan.c (acpi_scan_init())
+     that carries out fwnode registration (ie register the fwnode by
+     searching the MSI HID object - this does not depend on ACPI device
+     nodes order - you enforce the order by parsing the namespace before
+     ACPI core does it, at that point in time ACPI objects are created).
+     Not sure Rafael will be happy to see this code but that's the only
+     solution that does not rely on ACPI device nodes ordering and kernel
+     link ordering. You may achieve the same by extending the ACPI APD
+     code (drivers/acpi/acpi_apd.c) whether that's the best way forward is
+     to be seen.
+
+(2)  You can also add an xgene specific scan handler at arch_init_call()
+     but given that PCI root bridge is managed through a scan handler too you
+     would rely on ACPI devices nodes ordering in the DSDT. Let me explain
+     something for the benefit of everyone reading this thread: I do not want
+     X-gene ACPI tables to force the kernel to scan devices in any order
+     whatsover because this would mean we will _never_ be able to change the
+     scan order if we wanted to lest we trigger regressions. So this is
+     a non-option in my opinion.
+
+(3) Last option is to register the MSI fwnode either in PCI ECAM quirk
+    handling or in arm64 before probing the PCI root bus.
+
+I am not keen on (2) and (3) at all, so _if_ we have to find a solution
+to this problem (1) is the only option you have for the time being as
+far as I am concerned.
+
+Lorenzo
+
+> 
+> Best regards,
+> Khuong Dinh
+> 
+> > 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 a4dfb1a..6ed3075 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -6,237 +6,295 @@
  "ref\0CAAsHzqvnGWkG_KN6m_+HzGFaNOHU-m2FocTxy3pyM7Hhd9rz7w@mail.gmail.com\0"
  "ref\020170608103956.GB8644@red-moon\0"
  "ref\0CAAsHzqv=mjd_k1K+uOSjfZmnrFeidpjg4DdqUtQeLvAYeCOC-w@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\0Wed, 14 Jun 2017 13:59:02 +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"
- "T24gVHVlLCBKdW4gMTMsIDIwMTcgYXQgMDE6NTY6NDRQTSAtMDcwMCwgS2h1b25nIERpbmggd3Jv\n"
- "dGU6Cj4gSGkgTG9yZW56bywKPiAKPiBPbiBUaHUsIEp1biA4LCAyMDE3IGF0IDM6MzkgQU0sIExv\n"
- "cmVuem8gUGllcmFsaXNpCj4gPGxvcmVuem8ucGllcmFsaXNpQGFybS5jb20+IHdyb3RlOgo+ID4g\n"
- "T24gVHVlLCBKdW4gMDYsIDIwMTcgYXQgMDk6NDQ6MTVBTSAtMDcwMCwgS2h1b25nIERpbmggd3Jv\n"
- "dGU6Cj4gPj4gSGkgTG9yZW56bywKPiA+Pgo+ID4+IE9uIFR1ZSwgTWF5IDksIDIwMTcgYXQgMzo1\n"
- "NSBQTSwgS2h1b25nIERpbmggPGtkaW5oQGFwbS5jb20+IHdyb3RlOgo+ID4+ID4gSGkgTG9yZW56\n"
- "bywKPiA+PiA+Cj4gPj4gPiBPbiBGcmksIE1heSA1LCAyMDE3IGF0IDk6NTEgQU0sIExvcmVuem8g\n"
- "UGllcmFsaXNpCj4gPj4gPiA8bG9yZW56by5waWVyYWxpc2lAYXJtLmNvbT4gd3JvdGU6Cj4gPj4g\n"
- "Pj4gT24gVGh1LCBNYXkgMDQsIDIwMTcgYXQgMDU6MzY6MDZQTSAtMDcwMCwgS2h1b25nIERpbmgg\n"
- "d3JvdGU6Cj4gPj4gPj4+IEhpIE1hcmMsCj4gPj4gPj4+IFRoZXJlJ3Mgbm8gZXhwbGljaXQgZGVw\n"
- "ZW5kZW5jeSBiZXR3ZWVuIHBjaWUgZHJpdmVyIGFuZCBtc2kKPiA+PiA+Pj4gY29udHJvbGxlci4g\n"
- "IFRoZSBjdXJyZW50IHNvbHV0aW9uIHRoYXQgd2UgZGlkIGlzIHJlbHlpbmcgb24gdGhlCj4gPj4g\n"
- "Pj4+IG5vZGUgb3JkZXJpbmcgaW4gQklPUy4gIEFDUEkgNS4wIGludHJvZHVjZWQgX0RFUCBtZXRo\n"
- "b2QgdG8gYXNzaWduIGEKPiA+PiA+Pj4gaGlnaGVyIHByaW9yaXR5IGluIHN0YXJ0IG9yZGVyaW5n\n"
- "LiAgVGhpcyBtZXRob2QgY291bGQgYmUgYXBwbGllZCBpbgo+ID4+ID4+PiBjYXNlIG9mIG1zaSBh\n"
- "bmQgcGNpZSBhcmUgdGhlIHNhbWUgbGV2ZWwgb2Ygc3Vic3lzX2luaXQgKGluIEFDUEkKPiA+PiA+\n"
- "Pj4gYm9vdCkuICBIb3dldmVyLCBQQ0llIGRyaXZlciBoYXMgbm90IHN1cHBvcnRlZCBmb3IgdGhp\n"
- "cyBkZXBlbmRlbmN5Cj4gPj4gPj4+IGNoZWNrIHlldC4gIEhvdyBkbyB5b3UgdGhpbmsgYWJvdXQg\n"
- "dGhpcyBzb2x1dGlvbi4KPiA+PiA+Pgo+ID4+ID4+IEZpcnN0IG9mZiwgeW91IGNhbid0IHBvc3Qg\n"
- "ZW1haWxzIHdpdGggY29uZmlkZW50aWFsaXR5IG5vdGljZXMgb24KPiA+PiA+PiBtYWlsaW5nIGxp\n"
- "c3RzIHNvIHJlbW92ZSBpdCBmcm9tIG5vdyBvbndhcmRzLgo+ID4+ID4KPiA+PiA+IEZpeGVkCj4g\n"
- "Pj4gPgo+ID4+ID4+IFNlY29uZGx5LCBJIGNvbW1lbnRlZCBvbiB0aGlzIGJlZm9yZSwgc28geW91\n"
- "IGtub3cgd2hhdCBteSBvcGluaW9uIGlzLgo+ID4+ID4KPiA+PiA+IEkgZ290IHlvdXIgb3Bpbmlv\n"
- "bi4gSSdsbCBpbXBsZW1lbnQgYXMgeW91ciBzdWdnZXN0aW9uLgo+ID4+ID4KPiA+Pgo+ID4+ICAg\n"
- "UmVnYXJkaW5nIHRvIHlvdXIgcHJldmlvdXMgc3VnZ2VzdGlvbiB0byBhZGQgYSBob29rIHdhbGtp\n"
- "bmcgdGhlIEFDUEkKPiA+PiAgIG5hbWVzcGFjZSBiZWZvcmUgYWNwaV9idXNfc2NhbigpIGluIGFj\n"
- "cGlfc2Nhbl9pbml0KCkgdG8gbWFrZSBNU0kKPiA+PiAgIGNvbnRyb2xsZXJzIG11c3QgYmUgcHJv\n"
- "YmVkIGJlZm9yZSBQQ0kuICBJIGhhdmUgYSBjb25jZXJuIHRoYXQgdGhlCj4gPj4gICBNU0kgbmFt\n"
- "ZXNwYWNlIOKAnCBfU0IuTVNJWOKAnSBpcyBub3QgYSB1bmlxdWUgbmFtZSBhbmQgaG93IGNhbiB3\n"
- "ZSB3YWxrCj4gPj4gICB0aGUgQUNQSSBuYW1lc3BhY2UgYW5kIHVzZSB0aGlzIG5hbWUgdG8gbWFr\n"
- "ZSBNU0kgcHJvYmVkIGJlZm9yZSBQQ0kuCj4gPj4gICBNYXkgeW91IGhhdmUgbGl0dGxlIGJpdCBt\n"
- "b3JlIGluZm9ybWF0aW9uIGZvciB0aGlzIG9yIGRvIHlvdSBoYXZlCj4gPj4gICBhbm90aGVyIHN1\n"
- "Z2dlc3Rpb24gZm9yIHRoaXM/Cj4gPj4KPiA+PiAgICBUaGVyZeKAmXMgYW5vdGhlciBzb2x1dGlv\n"
- "biB3aGljaCBtYWtlcyB0aGlzIHNpbXBsZXIgYW5kIEnigJlkIGxpa2UgdG8KPiA+PiAgICBhc2sg\n"
- "eW91ciBvcGluaW9uIGFib3V0IHRoaXMuCj4gPj4gICAgVGhlIHNvbHV0aW9uIGlzIHRvIG1ha2Ug\n"
- "YW4gaGllcmFyY2h5IGJldHdlZW4gTVNJIGFuZCBQQ0kgbm9kZXMgIGFzIGJlbG93Ogo+ID4+IERl\n"
- "dmljZShcX1NCLk1TSVgpIHsKPiA+PiAgICBEZXZpY2UoXF9TQi5QQ0kwKQo+ID4+ICAgIERldmlj\n"
- "ZShcX1NCLlBDSTEpCj4gPj4gICAg4oCm4oCmCj4gPj4gfQo+ID4+ICAgSW4gb3RoZXIgd29yZCwg\n"
- "TVNJWCBub2RlIGlzIGEgcGFyZW50IG5vZGUgb2YgUENJIG5vZGVzIGluIEFDUEkKPiA+PiAgIHRh\n"
- "YmxlLiAgSW4gdGhpcyBzZW5zZSwgdGhlcmXigJlzIGFuIGV4cGxpY2l0IGRlcGVuZGVuY3kgYmV0\n"
- "d2VlbiBNU0kKPiA+PiAgIGFuZCBQQ0ksIE1TSSBjb250cm9sbGVyIG11c3QgYmUgcHJvYmVkIGJl\n"
- "Zm9yZSBQQ0kgYW5kIGl0IHdpbGwKPiA+PiAgIGd1YXJhbnRlZSBub3QgYnJlYWtpbmcgbmV4dCBr\n"
- "ZXJuZWwgcmVsZWFzZXMuICBIb3cgZG8geW91IHRoaW5rIGFib3V0Cj4gPj4gICB0aGlzIHNvbHV0\n"
- "aW9uLgo+ID4KPiA+IEkgdGhpbmsgdGhhdCdzIGEgcGxhc3RlciBhcyBpbmVmZmVjdGl2ZSBhcyBy\n"
- "ZW9yZGVyaW5nIG5vZGVzLCBpbiBzaG9ydAo+ID4gaXQgaXMgbm90IGEgc29sdXRpb24gYW5kIHlv\n"
- "dSBzdGlsbCByZWx5IG9uIGtlcm5lbCBsaW5rIG9yZGVyaW5nLCB5b3UKPiA+IGNhbiBmaWRkbGUg\n"
- "d2l0aCBBQ1BJIHRhYmxlcyBhcyBtdWNoIGFzIHlvdSB3YW50IGJ1dCB0aGF0IGRvZXMgbm90IGNo\n"
- "YW5nZS4KPiA+Cj4gPj4gIEkgYWxzbyB0cmllZCB0byB1c2UgX0RFUCBtZXRob2QgdG8gZGVzY3Jp\n"
- "YmUgdGhlIGRlcGVuZGVuY3kgb2YgUENJZQo+ID4+ICBub2RlcywgYnV0IGl0IGxvb2tzIHRoYXQg\n"
- "aXQgZG9lcyBub3Qgd29yayBhcyBQQ0kgYW5kIE1TSSBhcmUgaGFuZGVkCj4gPj4gIGJ5IGFjcGlf\n"
- "YnVzX3NjYW4gYW5kIHN0aWxsIGhhdmluZyBpc3N1ZSB3aGVuIHdlIHJlLXByb2JlIFBDSS4KPiA+\n"
- "Cj4gPiBUaGF0J3MgYSB0YWQgdmFndWUgdG8gYmUgZnJhbmssIGFueXdheSBpdCBpcyBwcmV0dHkg\n"
- "Y2xlYXIgdG8gbWUgdGhhdCB3ZQo+ID4gaGF2ZSBoaXQgYSB3YWxsLiBJbiBBQ1BJIHRoZXJlIGlz\n"
- "IG5vIHdheSB0byBkZXNjcmliZSBwcm9iZSBkZXBlbmRlbmNpZXMKPiA+IGxpa2UgdGhlIG9uZSB5\n"
- "b3UgaGF2ZSwgaXQgaXMgYXMgc2ltcGxlIGFzIHRoYXQsIGFuZCB0aGlzIE1TSSBpc3N1ZSB5b3UK\n"
- "PiA+IGFyZSBmYWNpbmcgaXMganVzdCBhbiBleGFtcGxlLCB0aGVyZSBhcmUgbW9yZSBlZzoKPiA+\n"
- "Cj4gPiBodHRwczovL3d3dy5zcGluaWNzLm5ldC9saXN0cy9hcm0ta2VybmVsL21zZzU4NTgyNS5o\n"
- "dG1sCj4gPgo+ID4gQXQgdGhlIGVuZCBvZiB0aGUgZGF5IHRoZSBjaG9pY2UgaXMgc2ltcGxlIGVp\n"
- "dGhlciB3ZSBhY2NlcHQgKGFuZCB3ZQo+ID4gbWFpbnRhaW4gYmVjYXVzZSB0aGF0J3MgdGhlIHBy\n"
- "b2JsZW0pIHRoZXNlIGhhY2tzIC0gYW5kIEkgYW0gbm90IHdpbGxpbmcKPiA+IHRvIGRvIHRoYXQg\n"
- "LSBvciB3ZSBmaW5kIGEgd2F5IHRvIHNvbHZlIHRoaXMgZnJvbSBhIGdlbmVyYWwgcGVyc3BlY3Rp\n"
- "dmUgbm90Cj4gPiBhcyBhIHBvaW50IGhhY2suCj4gPgo+ID4gSSBjYW4gaGF2ZSBhIGxvb2sgYXQg\n"
- "c29sdmluZyB0aGUgd2hvbGUgaXNzdWUgYnV0IGl0IHdvbid0IGhhcHBlbgo+ID4gdG9tb3Jyb3cu\n"
- "Cj4gCj4gVGhhbmtzIGZvciBoZWxwaW5nIHRvIHJlc29sdmUgdGhpcyBnZW5lcmFsIEFDUEkgZGVw\n"
- "ZW5kZW5jZSBpc3N1ZS4KPiBJIGxvb2sgZm9yd2FyZCBmb3IgYSB2ZXJzaW9uIHRvIHRlc3Qgd2l0\n"
- "aC4KPiAKPiBDYW4gd2Ugc2VwYXJhdGUgdGhlIGdlbmVyYWwgZGVwZW5kZW5jZSBwYXRjaCBmcm9t\n"
- "IHRoZSBYLUdlbmUgTVNJIEFDUEkKPiBlbmFibGUgcGF0Y2guCj4gVGhpcyBvcmlnaW5hbCBwYXRj\n"
- "aCB3YXMgdG8gZW5hYmxlIEFDUEkgc3VwcG9ydCBmb3IgUENJZSBNU0kuCj4gVGhlIGRlcGVuZGVu\n"
- "Y2UgaXNzdWUgY2FuIGJlIHJlc29sdmVkIHNlcGFyYXRlbHkuCj4gQ2FuIHlvdSBoZWxwIHRvIHB1\n"
- "bGwgaW4gdGhlIHBhdGNoLgoKT2ssIHByYWdtYXRpY2FsbHkgdGhlIG9ubHkgc2FuZSB0aGluZyB5\n"
- "b3UgY2FuIGRvIGlzOgoKKDEpICBBZGQgYW4gWC1nZW5lIHNwZWNpZmljIGhvb2sgaW4gZHJpdmVy\n"
- "cy9hY3BpL3NjYW4uYyAoYWNwaV9zY2FuX2luaXQoKSkKICAgICB0aGF0IGNhcnJpZXMgb3V0IGZ3\n"
- "bm9kZSByZWdpc3RyYXRpb24gKGllIHJlZ2lzdGVyIHRoZSBmd25vZGUgYnkKICAgICBzZWFyY2hp\n"
- "bmcgdGhlIE1TSSBISUQgb2JqZWN0IC0gdGhpcyBkb2VzIG5vdCBkZXBlbmQgb24gQUNQSSBkZXZp\n"
- "Y2UKICAgICBub2RlcyBvcmRlciAtIHlvdSBlbmZvcmNlIHRoZSBvcmRlciBieSBwYXJzaW5nIHRo\n"
- "ZSBuYW1lc3BhY2UgYmVmb3JlCiAgICAgQUNQSSBjb3JlIGRvZXMgaXQsIGF0IHRoYXQgcG9pbnQg\n"
- "aW4gdGltZSBBQ1BJIG9iamVjdHMgYXJlIGNyZWF0ZWQpLgogICAgIE5vdCBzdXJlIFJhZmFlbCB3\n"
- "aWxsIGJlIGhhcHB5IHRvIHNlZSB0aGlzIGNvZGUgYnV0IHRoYXQncyB0aGUgb25seQogICAgIHNv\n"
- "bHV0aW9uIHRoYXQgZG9lcyBub3QgcmVseSBvbiBBQ1BJIGRldmljZSBub2RlcyBvcmRlcmluZyBh\n"
- "bmQga2VybmVsCiAgICAgbGluayBvcmRlcmluZy4gWW91IG1heSBhY2hpZXZlIHRoZSBzYW1lIGJ5\n"
- "IGV4dGVuZGluZyB0aGUgQUNQSSBBUEQKICAgICBjb2RlIChkcml2ZXJzL2FjcGkvYWNwaV9hcGQu\n"
- "Yykgd2hldGhlciB0aGF0J3MgdGhlIGJlc3Qgd2F5IGZvcndhcmQgaXMKICAgICB0byBiZSBzZWVu\n"
- "LgoKKDIpICBZb3UgY2FuIGFsc28gYWRkIGFuIHhnZW5lIHNwZWNpZmljIHNjYW4gaGFuZGxlciBh\n"
- "dCBhcmNoX2luaXRfY2FsbCgpCiAgICAgYnV0IGdpdmVuIHRoYXQgUENJIHJvb3QgYnJpZGdlIGlz\n"
- "IG1hbmFnZWQgdGhyb3VnaCBhIHNjYW4gaGFuZGxlciB0b28geW91CiAgICAgd291bGQgcmVseSBv\n"
- "biBBQ1BJIGRldmljZXMgbm9kZXMgb3JkZXJpbmcgaW4gdGhlIERTRFQuIExldCBtZSBleHBsYWlu\n"
- "CiAgICAgc29tZXRoaW5nIGZvciB0aGUgYmVuZWZpdCBvZiBldmVyeW9uZSByZWFkaW5nIHRoaXMg\n"
- "dGhyZWFkOiBJIGRvIG5vdCB3YW50CiAgICAgWC1nZW5lIEFDUEkgdGFibGVzIHRvIGZvcmNlIHRo\n"
- "ZSBrZXJuZWwgdG8gc2NhbiBkZXZpY2VzIGluIGFueSBvcmRlcgogICAgIHdoYXRzb3ZlciBiZWNh\n"
- "dXNlIHRoaXMgd291bGQgbWVhbiB3ZSB3aWxsIF9uZXZlcl8gYmUgYWJsZSB0byBjaGFuZ2UgdGhl\n"
- "CiAgICAgc2NhbiBvcmRlciBpZiB3ZSB3YW50ZWQgdG8gbGVzdCB3ZSB0cmlnZ2VyIHJlZ3Jlc3Np\n"
- "b25zLiBTbyB0aGlzIGlzCiAgICAgYSBub24tb3B0aW9uIGluIG15IG9waW5pb24uCgooMykgTGFz\n"
- "dCBvcHRpb24gaXMgdG8gcmVnaXN0ZXIgdGhlIE1TSSBmd25vZGUgZWl0aGVyIGluIFBDSSBFQ0FN\n"
- "IHF1aXJrCiAgICBoYW5kbGluZyBvciBpbiBhcm02NCBiZWZvcmUgcHJvYmluZyB0aGUgUENJIHJv\n"
- "b3QgYnVzLgoKSSBhbSBub3Qga2VlbiBvbiAoMikgYW5kICgzKSBhdCBhbGwsIHNvIF9pZl8gd2Ug\n"
- "aGF2ZSB0byBmaW5kIGEgc29sdXRpb24KdG8gdGhpcyBwcm9ibGVtICgxKSBpcyB0aGUgb25seSBv\n"
- "cHRpb24geW91IGhhdmUgZm9yIHRoZSB0aW1lIGJlaW5nIGFzCmZhciBhcyBJIGFtIGNvbmNlcm5l\n"
- "ZC4KCkxvcmVuem8KCj4gCj4gQmVzdCByZWdhcmRzLAo+IEtodW9uZyBEaW5oCj4gCj4gPiBUaGFu\n"
- "a3MsCj4gPiBMb3JlbnpvCj4gPgo+ID4+IFRoYW5rcywKPiA+PiBLaHVvbmcgRGluaAo+ID4+Cj4g\n"
- "Pj4gPj4gRmluYWxseSwgcGxlYXNlIGV4ZWN1dGUgdGhpcyBjb21tYW5kIG9uIHRoZSB2bWxpbnV4\n"
- "IHRoYXQgIndvcmtzIgo+ID4+ID4+IGZvciB5b3U6Cj4gPj4gPj4KPiA+PiA+PiBubSB2bWxpbnV4\n"
- "IHwgZ3JlcCAtRSAnX19pbml0Y2FsbF8oeGdlbmVfcGNpZV9tc2lfaW5pdHxhY3BpX2luaXQpJwo+\n"
- "ID4+ID4KPiA+PiA+ICQgbm0gdm1saW51eCB8IGdyZXAgLUUgJ19faW5pdGNhbGxfKHhnZW5lX3Bj\n"
- "aWVfbXNpX2luaXR8YWNwaV9pbml0KScKPiA+PiA+IGZmZmYwMDAwMDhkYWIyZDggdCBfX2luaXRj\n"
- "YWxsX2FjcGlfaW5pdDQKPiA+PiA+IGZmZmYwMDAwMDhkYWIyYzggdCBfX2luaXRjYWxsX3hnZW5l\n"
- "X3BjaWVfbXNpX2luaXQ0Cj4gPj4gPgo+ID4+ID4gQmVzdCByZWdhcmRzLAo+ID4+ID4gS2h1b25n\n"
- "IERpbmgKPiA+PiA+Cj4gPj4gPj4gRXZlbiBieSBvcmRlcmluZyBkZXZpY2VzIGluIHRoZSBBQ1BJ\n"
- "IHRhYmxlcyAodGhhdCBJIGFiaG9yKSBJIHN0aWxsIGRvCj4gPj4gPj4gbm90IHVuZGVyc3RhbmQg\n"
- "aG93IHRoaXMgd29ya3MgKEkgbWVhbiB3aXRob3V0IHJlbHlpbmcgb24ga2VybmVsIGxpbmsKPiA+\n"
- "PiA+PiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgTVNJIGRyaXZlciBpcyBwcm9iZWQgYmVmb3Jl\n"
- "IFBDSSBkZXZpY2VzIGFyZQo+ID4+ID4+IGVudW1lcmF0ZWQgaW4gYWNwaV9pbml0KCkpLgo+ID4+\n"
- "ID4+Cj4gPj4gPj4gVGhhbmtzLAo+ID4+ID4+IExvcmVuem8KPiA+PiA+Pgo+ID4+ID4+PiBCZXN0\n"
- "IHJlZ2FyZHMsCj4gPj4gPj4+IEtodW9uZwo+ID4+ID4+Pgo+ID4+ID4+PiBPbiBGcmksIEFwciAy\n"
- "OCwgMjAxNyBhdCAyOjI3IEFNLCBNYXJjIFp5bmdpZXIgPG1hcmMuenluZ2llckBhcm0uY29tPiB3\n"
- "cm90ZToKPiA+PiA+Pj4gPiBPbiAyOC8wNC8xNyAwMTo1NCwgS2h1b25nIERpbmggd3JvdGU6Cj4g\n"
- "Pj4gPj4+ID4+IEZyb206IEtodW9uZyBEaW5oIDxrZGluaEBhcG0uY29tPgo+ID4+ID4+PiA+Pgo+\n"
- "ID4+ID4+PiA+PiBUaGlzIHBhdGNoIG1ha2VzIHBjaS14Z2VuZS1tc2kgZHJpdmVyIEFDUEktYXdh\n"
- "cmUgYW5kIHByb3ZpZGVzCj4gPj4gPj4+ID4+IE1TSSBjYXBhYmlsaXR5IGZvciBYLUdlbmUgdjEg\n"
- "UENJZSBjb250cm9sbGVycyBpbiBBQ1BJIGJvb3QgbW9kZS4KPiA+PiA+Pj4gPj4KPiA+PiA+Pj4g\n"
- "Pj4gU2lnbmVkLW9mZi1ieTogS2h1b25nIERpbmggPGtkaW5oQGFwbS5jb20+Cj4gPj4gPj4+ID4+\n"
- "IFNpZ25lZC1vZmYtYnk6IER1YyBEYW5nIDxkaGRhbmdAYXBtLmNvbT4KPiA+PiA+Pj4gPj4gQWNr\n"
- "ZWQtYnk6IE1hcmMgWnluZ2llciA8bWFyYy56eW5naWVyQGFybS5jb20+Cj4gPj4gPj4+ID4+IC0t\n"
- "LQo+ID4+ID4+PiA+PiB2MjoKPiA+PiA+Pj4gPj4gIC0gVmVyaWZ5IHdpdGggQklPUyB2ZXJzaW9u\n"
- "IDMuMDYuMjUgYW5kIDMuMDcuMDkKPiA+PiA+Pj4gPj4gdjE6Cj4gPj4gPj4+ID4+ICAtIEluaXRp\n"
- "YWwgdmVyc2lvbgo+ID4+ID4+PiA+PiAtLS0KPiA+PiA+Pj4gPj4gIGRyaXZlcnMvcGNpL2hvc3Qv\n"
- "cGNpLXhnZW5lLW1zaS5jIHwgICAzNSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0t\n"
- "LQo+ID4+ID4+PiA+PiAgMSBmaWxlcyBjaGFuZ2VkLCAzMiBpbnNlcnRpb25zKCspLCAzIGRlbGV0\n"
- "aW9ucygtKQo+ID4+ID4+PiA+Pgo+ID4+ID4+PiA+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kv\n"
- "aG9zdC9wY2kteGdlbmUtbXNpLmMgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS14Z2VuZS1tc2kuYwo+\n"
- "ID4+ID4+PiA+PiBpbmRleCBmMWI2MzNiLi4wMGFhYTNkIDEwMDY0NAo+ID4+ID4+PiA+PiAtLS0g\n"
- "YS9kcml2ZXJzL3BjaS9ob3N0L3BjaS14Z2VuZS1tc2kuYwo+ID4+ID4+PiA+PiArKysgYi9kcml2\n"
- "ZXJzL3BjaS9ob3N0L3BjaS14Z2VuZS1tc2kuYwo+ID4+ID4+PiA+PiBAQCAtMjQsNiArMjQsNyBA\n"
- "QAo+ID4+ID4+PiA+PiAgI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgo+ID4+ID4+PiA+PiAgI2luY2x1\n"
- "ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ID4+ID4+PiA+PiAgI2luY2x1ZGUgPGxpbnV4\n"
- "L29mX3BjaS5oPgo+ID4+ID4+PiA+PiArI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KPiA+PiA+Pj4g\n"
- "Pj4KPiA+PiA+Pj4gPj4gICNkZWZpbmUgTVNJX0lSMCAgICAgICAgICAgICAgICAgICAgICAweDAw\n"
- "MDAwMAo+ID4+ID4+PiA+PiAgI2RlZmluZSBNU0lfSU5UMCAgICAgICAgICAgICAweDgwMDAwMAo+\n"
- "ID4+ID4+PiA+PiBAQCAtMzksNyArNDAsNyBAQCBzdHJ1Y3QgeGdlbmVfbXNpX2dyb3VwIHsKPiA+\n"
- "PiA+Pj4gPj4gIH07Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+ICBzdHJ1Y3QgeGdlbmVfbXNpIHsK\n"
- "PiA+PiA+Pj4gPj4gLSAgICAgc3RydWN0IGRldmljZV9ub2RlICAgICAgKm5vZGU7Cj4gPj4gPj4+\n"
- "ID4+ICsgICAgIHN0cnVjdCBmd25vZGVfaGFuZGxlICAgICpmd25vZGU7Cj4gPj4gPj4+ID4+ICAg\n"
- "ICAgIHN0cnVjdCBpcnFfZG9tYWluICAgICAgICppbm5lcl9kb21haW47Cj4gPj4gPj4+ID4+ICAg\n"
- "ICAgIHN0cnVjdCBpcnFfZG9tYWluICAgICAgICptc2lfZG9tYWluOwo+ID4+ID4+PiA+PiAgICAg\n"
- "ICB1NjQgICAgICAgICAgICAgICAgICAgICBtc2lfYWRkcjsKPiA+PiA+Pj4gPj4gQEAgLTI0OSw2\n"
- "ICsyNTAsMTMgQEAgc3RhdGljIHZvaWQgeGdlbmVfaXJxX2RvbWFpbl9mcmVlKHN0cnVjdCBpcnFf\n"
- "ZG9tYWluICpkb21haW4sCj4gPj4gPj4+ID4+ICAgICAgIC5mcmVlICAgPSB4Z2VuZV9pcnFfZG9t\n"
- "YWluX2ZyZWUsCj4gPj4gPj4+ID4+ICB9Owo+ID4+ID4+PiA+Pgo+ID4+ID4+PiA+PiArI2lmZGVm\n"
- "IENPTkZJR19BQ1BJCj4gPj4gPj4+ID4+ICtzdGF0aWMgc3RydWN0IGZ3bm9kZV9oYW5kbGUgKnhn\n"
- "ZW5lX21zaV9nZXRfZndub2RlKHN0cnVjdCBkZXZpY2UgKmRldikKPiA+PiA+Pj4gPj4gK3sKPiA+\n"
- "PiA+Pj4gPj4gKyAgICAgcmV0dXJuIHhnZW5lX21zaV9jdHJsLmZ3bm9kZTsKPiA+PiA+Pj4gPj4g\n"
- "K30KPiA+PiA+Pj4gPj4gKyNlbmRpZgo+ID4+ID4+PiA+PiArCj4gPj4gPj4+ID4+ICBzdGF0aWMg\n"
- "aW50IHhnZW5lX2FsbG9jYXRlX2RvbWFpbnMoc3RydWN0IHhnZW5lX21zaSAqbXNpKQo+ID4+ID4+\n"
- "PiA+PiAgewo+ID4+ID4+PiA+PiAgICAgICBtc2ktPmlubmVyX2RvbWFpbiA9IGlycV9kb21haW5f\n"
- "YWRkX2xpbmVhcihOVUxMLCBOUl9NU0lfVkVDLAo+ID4+ID4+PiA+PiBAQCAtMjU2LDcgKzI2NCw3\n"
- "IEBAIHN0YXRpYyBpbnQgeGdlbmVfYWxsb2NhdGVfZG9tYWlucyhzdHJ1Y3QgeGdlbmVfbXNpICpt\n"
- "c2kpCj4gPj4gPj4+ID4+ICAgICAgIGlmICghbXNpLT5pbm5lcl9kb21haW4pCj4gPj4gPj4+ID4+\n"
- "ICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+IC0g\n"
- "ICAgIG1zaS0+bXNpX2RvbWFpbiA9IHBjaV9tc2lfY3JlYXRlX2lycV9kb21haW4ob2Zfbm9kZV90\n"
- "b19md25vZGUobXNpLT5ub2RlKSwKPiA+PiA+Pj4gPj4gKyAgICAgbXNpLT5tc2lfZG9tYWluID0g\n"
- "cGNpX21zaV9jcmVhdGVfaXJxX2RvbWFpbihtc2ktPmZ3bm9kZSwKPiA+PiA+Pj4gPj4gICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGdlbmVfbXNpX2Rv\n"
- "bWFpbl9pbmZvLAo+ID4+ID4+PiA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgIG1zaS0+aW5uZXJfZG9tYWluKTsKPiA+PiA+Pj4gPj4KPiA+PiA+Pj4g\n"
- "Pj4gQEAgLTI2NSw2ICsyNzMsOSBAQCBzdGF0aWMgaW50IHhnZW5lX2FsbG9jYXRlX2RvbWFpbnMo\n"
- "c3RydWN0IHhnZW5lX21zaSAqbXNpKQo+ID4+ID4+PiA+PiAgICAgICAgICAgICAgIHJldHVybiAt\n"
- "RU5PTUVNOwo+ID4+ID4+PiA+PiAgICAgICB9Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+ICsjaWZk\n"
- "ZWYgQ09ORklHX0FDUEkKPiA+PiA+Pj4gPj4gKyAgICAgcGNpX21zaV9yZWdpc3Rlcl9md25vZGVf\n"
- "cHJvdmlkZXIoJnhnZW5lX21zaV9nZXRfZndub2RlKTsKPiA+PiA+Pj4gPj4gKyNlbmRpZgo+ID4+\n"
- "ID4+PiA+PiAgICAgICByZXR1cm4gMDsKPiA+PiA+Pj4gPj4gIH0KPiA+PiA+Pj4gPj4KPiA+PiA+\n"
- "Pj4gPj4gQEAgLTQ0OSw2ICs0NjAsMTMgQEAgc3RhdGljIGludCB4Z2VuZV9tc2lfaHdpcnFfZnJl\n"
- "ZSh1bnNpZ25lZCBpbnQgY3B1KQo+ID4+ID4+PiA+PiAgICAgICB7fSwKPiA+PiA+Pj4gPj4gIH07\n"
- "Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+ICsjaWZkZWYgQ09ORklHX0FDUEkKPiA+PiA+Pj4gPj4g\n"
- "K3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgeGdlbmVfbXNpX2FjcGlfaWRzW10g\n"
- "PSB7Cj4gPj4gPj4+ID4+ICsgICAgIHsiQVBNQzBEMEUiLCAwfSwKPiA+PiA+Pj4gPj4gKyAgICAg\n"
- "eyB9LAo+ID4+ID4+PiA+PiArfTsKPiA+PiA+Pj4gPj4gKyNlbmRpZgo+ID4+ID4+PiA+PiArCj4g\n"
- "Pj4gPj4+ID4+ICBzdGF0aWMgaW50IHhnZW5lX21zaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2\n"
- "aWNlICpwZGV2KQo+ID4+ID4+PiA+PiAgewo+ID4+ID4+PiA+PiAgICAgICBzdHJ1Y3QgcmVzb3Vy\n"
- "Y2UgKnJlczsKPiA+PiA+Pj4gPj4gQEAgLTQ2OSw3ICs0ODcsMTcgQEAgc3RhdGljIGludCB4Z2Vu\n"
- "ZV9tc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+PiA+Pj4gPj4gICAg\n"
- "ICAgICAgICAgICBnb3RvIGVycm9yOwo+ID4+ID4+PiA+PiAgICAgICB9Cj4gPj4gPj4+ID4+ICAg\n"
- "ICAgIHhnZW5lX21zaS0+bXNpX2FkZHIgPSByZXMtPnN0YXJ0Owo+ID4+ID4+PiA+PiAtICAgICB4\n"
- "Z2VuZV9tc2ktPm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKPiA+PiA+Pj4gPj4gKwo+ID4+ID4+\n"
- "PiA+PiArICAgICB4Z2VuZV9tc2ktPmZ3bm9kZSA9IG9mX25vZGVfdG9fZndub2RlKHBkZXYtPmRl\n"
- "di5vZl9ub2RlKTsKPiA+PiA+Pj4gPj4gKyAgICAgaWYgKCF4Z2VuZV9tc2ktPmZ3bm9kZSkgewo+\n"
- "ID4+ID4+PiA+PiArICAgICAgICAgICAgIHhnZW5lX21zaS0+Zndub2RlID0gaXJxX2RvbWFpbl9h\n"
- "bGxvY19md25vZGUoTlVMTCk7Cj4gPj4gPj4+ID4KPiA+PiA+Pj4gPiBQbGVhc2UgcHJvdmlkZSBz\n"
- "b21ldGhpbmcgb3RoZXIgdGhhbiBOVUxMLCBzdWNoIGFzIHRoZSBiYXNlIGFkZHJlc3MgaWYKPiA+\n"
- "PiA+Pj4gPiB0aGUgZGV2aWNlLiBUaGF0J3MgcXVpdGUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCj4g\n"
- "Pj4gPj4+ID4KPiA+PiA+Pj4gPj4gKyAgICAgICAgICAgICBpZiAoIXhnZW5lX21zaS0+Zndub2Rl\n"
- "KSB7Cj4gPj4gPj4+ID4+ICsgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZwZGV2LT5kZXYs\n"
- "ICJGYWlsZWQgdG8gY3JlYXRlIGZ3bm9kZVxuIik7Cj4gPj4gPj4+ID4+ICsgICAgICAgICAgICAg\n"
- "ICAgICAgICByYyA9IEVOT01FTTsKPiA+PiA+Pj4gPj4gKyAgICAgICAgICAgICAgICAgICAgIGdv\n"
- "dG8gZXJyb3I7Cj4gPj4gPj4+ID4+ICsgICAgICAgICAgICAgfQo+ID4+ID4+PiA+PiArICAgICB9\n"
- "Cj4gPj4gPj4+ID4+ICsKPiA+PiA+Pj4gPj4gICAgICAgeGdlbmVfbXNpLT5udW1fY3B1cyA9IG51\n"
- "bV9wb3NzaWJsZV9jcHVzKCk7Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+ICAgICAgIHJjID0geGdl\n"
- "bmVfbXNpX2luaXRfYWxsb2NhdG9yKHhnZW5lX21zaSk7Cj4gPj4gPj4+ID4+IEBAIC01NDAsNiAr\n"
- "NTY4LDcgQEAgc3RhdGljIGludCB4Z2VuZV9tc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj\n"
- "ZSAqcGRldikKPiA+PiA+Pj4gPj4gICAgICAgLmRyaXZlciA9IHsKPiA+PiA+Pj4gPj4gICAgICAg\n"
- "ICAgICAgICAubmFtZSA9ICJ4Z2VuZS1tc2kiLAo+ID4+ID4+PiA+PiAgICAgICAgICAgICAgIC5v\n"
- "Zl9tYXRjaF90YWJsZSA9IHhnZW5lX21zaV9tYXRjaF90YWJsZSwKPiA+PiA+Pj4gPj4gKyAgICAg\n"
- "ICAgICAgICAuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKHhnZW5lX21zaV9hY3BpX2lkcyks\n"
- "Cj4gPj4gPj4+ID4+ICAgICAgIH0sCj4gPj4gPj4+ID4+ICAgICAgIC5wcm9iZSA9IHhnZW5lX21z\n"
- "aV9wcm9iZSwKPiA+PiA+Pj4gPj4gICAgICAgLnJlbW92ZSA9IHhnZW5lX21zaV9yZW1vdmUsCj4g\n"
- "Pj4gPj4+ID4+Cj4gPj4gPj4+ID4KPiA+PiA+Pj4gPiBUaGUgY29kZSBpcyB0cml2aWFsLCBidXQg\n"
- "cmVsaWVzIG9uIHRoZSBNU0kgY29udHJvbGxlciB0byBwcm9iZSBiZWZvcmUKPiA+PiA+Pj4gPiB0\n"
- "aGUgUENJIGJ1cy4gV2hhdCBlbmZvcmNlcyB0aGlzPyBIb3cgaXMgaXQgbWFraW5nIHN1cmUgdGhh\n"
- "dCB0aGlzIGlzIG5vdAo+ID4+ID4+PiA+IGdvaW5nIHRvIGJyZWFrIGluIHRoZSBuZXh0IGtlcm5l\n"
- "bCByZWxlYXNlPyBBcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGhlcmUKPiA+PiA+Pj4gPiBpcyBubyBl\n"
- "eHBsaWNpdCBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIHR3bywgbWFraW5nIGl0IHRoZSB3aG9sZSB0\n"
- "aGluZwo+ID4+ID4+PiA+IGV4dHJlbWVseSBmcmFnaWxlLgo+ID4+ID4+PiA+Cj4gPj4gPj4+ID4g\n"
- "VGhhbmtzLAo+ID4+ID4+PiA+Cj4gPj4gPj4+ID4gICAgICAgICBNLgo+ID4+ID4+PiA+IC0tCj4g\n"
- "Pj4gPj4+ID4gSmF6eiBpcyBub3QgZGVhZC4gSXQganVzdCBzbWVsbHMgZnVubnkuLi4KPiA+PiA+\n"
- "Pj4KPiA+PiA+Pj4gLS0KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f\n"
- "X19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlz\n"
- "dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp\n"
- bmZvL2xpbnV4LWFybS1rZXJuZWwK
+ "On Tue, Jun 13, 2017 at 01:56:44PM -0700, Khuong Dinh wrote:\n"
+ "> Hi Lorenzo,\n"
+ "> \n"
+ "> On Thu, Jun 8, 2017 at 3:39 AM, Lorenzo Pieralisi\n"
+ "> <lorenzo.pieralisi@arm.com> wrote:\n"
+ "> > 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 for helping to resolve this general ACPI dependence issue.\n"
+ "> I look forward for a version to test with.\n"
+ "> \n"
+ "> Can we separate the general dependence patch from the X-Gene MSI ACPI\n"
+ "> enable patch.\n"
+ "> This original patch was to enable ACPI support for PCIe MSI.\n"
+ "> The dependence issue can be resolved separately.\n"
+ "> Can you help to pull in the patch.\n"
+ "\n"
+ "Ok, pragmatically the only sane thing you can do is:\n"
+ "\n"
+ "(1)  Add an X-gene specific hook in drivers/acpi/scan.c (acpi_scan_init())\n"
+ "     that carries out fwnode registration (ie register the fwnode by\n"
+ "     searching the MSI HID object - this does not depend on ACPI device\n"
+ "     nodes order - you enforce the order by parsing the namespace before\n"
+ "     ACPI core does it, at that point in time ACPI objects are created).\n"
+ "     Not sure Rafael will be happy to see this code but that's the only\n"
+ "     solution that does not rely on ACPI device nodes ordering and kernel\n"
+ "     link ordering. You may achieve the same by extending the ACPI APD\n"
+ "     code (drivers/acpi/acpi_apd.c) whether that's the best way forward is\n"
+ "     to be seen.\n"
+ "\n"
+ "(2)  You can also add an xgene specific scan handler at arch_init_call()\n"
+ "     but given that PCI root bridge is managed through a scan handler too you\n"
+ "     would rely on ACPI devices nodes ordering in the DSDT. Let me explain\n"
+ "     something for the benefit of everyone reading this thread: I do not want\n"
+ "     X-gene ACPI tables to force the kernel to scan devices in any order\n"
+ "     whatsover because this would mean we will _never_ be able to change the\n"
+ "     scan order if we wanted to lest we trigger regressions. So this is\n"
+ "     a non-option in my opinion.\n"
+ "\n"
+ "(3) Last option is to register the MSI fwnode either in PCI ECAM quirk\n"
+ "    handling or in arm64 before probing the PCI root bus.\n"
+ "\n"
+ "I am not keen on (2) and (3) at all, so _if_ we have to find a solution\n"
+ "to this problem (1) is the only option you have for the time being as\n"
+ "far as I am concerned.\n"
+ "\n"
+ "Lorenzo\n"
+ "\n"
+ "> \n"
+ "> Best regards,\n"
+ "> Khuong Dinh\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"
+ > >> >>> --
 
-62f65ce8dfab3089e42d79c7f06a13fcbe45e6a6967764201998925935138264
+5373d31c90d566d0670e3132736e88a39c8f11a6ad581e73f38c2f867b49d48b

diff --git a/a/1.txt b/N2/1.txt
index 8919372..6c1a820 100644
--- a/a/1.txt
+++ b/N2/1.txt
@@ -1,216 +1,284 @@
-T24gVHVlLCBKdW4gMTMsIDIwMTcgYXQgMDE6NTY6NDRQTSAtMDcwMCwgS2h1b25nIERpbmggd3Jv
-dGU6Cj4gSGkgTG9yZW56bywKPiAKPiBPbiBUaHUsIEp1biA4LCAyMDE3IGF0IDM6MzkgQU0sIExv
-cmVuem8gUGllcmFsaXNpCj4gPGxvcmVuem8ucGllcmFsaXNpQGFybS5jb20+IHdyb3RlOgo+ID4g
-T24gVHVlLCBKdW4gMDYsIDIwMTcgYXQgMDk6NDQ6MTVBTSAtMDcwMCwgS2h1b25nIERpbmggd3Jv
-dGU6Cj4gPj4gSGkgTG9yZW56bywKPiA+Pgo+ID4+IE9uIFR1ZSwgTWF5IDksIDIwMTcgYXQgMzo1
-NSBQTSwgS2h1b25nIERpbmggPGtkaW5oQGFwbS5jb20+IHdyb3RlOgo+ID4+ID4gSGkgTG9yZW56
-bywKPiA+PiA+Cj4gPj4gPiBPbiBGcmksIE1heSA1LCAyMDE3IGF0IDk6NTEgQU0sIExvcmVuem8g
-UGllcmFsaXNpCj4gPj4gPiA8bG9yZW56by5waWVyYWxpc2lAYXJtLmNvbT4gd3JvdGU6Cj4gPj4g
-Pj4gT24gVGh1LCBNYXkgMDQsIDIwMTcgYXQgMDU6MzY6MDZQTSAtMDcwMCwgS2h1b25nIERpbmgg
-d3JvdGU6Cj4gPj4gPj4+IEhpIE1hcmMsCj4gPj4gPj4+IFRoZXJlJ3Mgbm8gZXhwbGljaXQgZGVw
-ZW5kZW5jeSBiZXR3ZWVuIHBjaWUgZHJpdmVyIGFuZCBtc2kKPiA+PiA+Pj4gY29udHJvbGxlci4g
-IFRoZSBjdXJyZW50IHNvbHV0aW9uIHRoYXQgd2UgZGlkIGlzIHJlbHlpbmcgb24gdGhlCj4gPj4g
-Pj4+IG5vZGUgb3JkZXJpbmcgaW4gQklPUy4gIEFDUEkgNS4wIGludHJvZHVjZWQgX0RFUCBtZXRo
-b2QgdG8gYXNzaWduIGEKPiA+PiA+Pj4gaGlnaGVyIHByaW9yaXR5IGluIHN0YXJ0IG9yZGVyaW5n
-LiAgVGhpcyBtZXRob2QgY291bGQgYmUgYXBwbGllZCBpbgo+ID4+ID4+PiBjYXNlIG9mIG1zaSBh
-bmQgcGNpZSBhcmUgdGhlIHNhbWUgbGV2ZWwgb2Ygc3Vic3lzX2luaXQgKGluIEFDUEkKPiA+PiA+
-Pj4gYm9vdCkuICBIb3dldmVyLCBQQ0llIGRyaXZlciBoYXMgbm90IHN1cHBvcnRlZCBmb3IgdGhp
-cyBkZXBlbmRlbmN5Cj4gPj4gPj4+IGNoZWNrIHlldC4gIEhvdyBkbyB5b3UgdGhpbmsgYWJvdXQg
-dGhpcyBzb2x1dGlvbi4KPiA+PiA+Pgo+ID4+ID4+IEZpcnN0IG9mZiwgeW91IGNhbid0IHBvc3Qg
-ZW1haWxzIHdpdGggY29uZmlkZW50aWFsaXR5IG5vdGljZXMgb24KPiA+PiA+PiBtYWlsaW5nIGxp
-c3RzIHNvIHJlbW92ZSBpdCBmcm9tIG5vdyBvbndhcmRzLgo+ID4+ID4KPiA+PiA+IEZpeGVkCj4g
-Pj4gPgo+ID4+ID4+IFNlY29uZGx5LCBJIGNvbW1lbnRlZCBvbiB0aGlzIGJlZm9yZSwgc28geW91
-IGtub3cgd2hhdCBteSBvcGluaW9uIGlzLgo+ID4+ID4KPiA+PiA+IEkgZ290IHlvdXIgb3Bpbmlv
-bi4gSSdsbCBpbXBsZW1lbnQgYXMgeW91ciBzdWdnZXN0aW9uLgo+ID4+ID4KPiA+Pgo+ID4+ICAg
-UmVnYXJkaW5nIHRvIHlvdXIgcHJldmlvdXMgc3VnZ2VzdGlvbiB0byBhZGQgYSBob29rIHdhbGtp
-bmcgdGhlIEFDUEkKPiA+PiAgIG5hbWVzcGFjZSBiZWZvcmUgYWNwaV9idXNfc2NhbigpIGluIGFj
-cGlfc2Nhbl9pbml0KCkgdG8gbWFrZSBNU0kKPiA+PiAgIGNvbnRyb2xsZXJzIG11c3QgYmUgcHJv
-YmVkIGJlZm9yZSBQQ0kuICBJIGhhdmUgYSBjb25jZXJuIHRoYXQgdGhlCj4gPj4gICBNU0kgbmFt
-ZXNwYWNlIOKAnCBfU0IuTVNJWOKAnSBpcyBub3QgYSB1bmlxdWUgbmFtZSBhbmQgaG93IGNhbiB3
-ZSB3YWxrCj4gPj4gICB0aGUgQUNQSSBuYW1lc3BhY2UgYW5kIHVzZSB0aGlzIG5hbWUgdG8gbWFr
-ZSBNU0kgcHJvYmVkIGJlZm9yZSBQQ0kuCj4gPj4gICBNYXkgeW91IGhhdmUgbGl0dGxlIGJpdCBt
-b3JlIGluZm9ybWF0aW9uIGZvciB0aGlzIG9yIGRvIHlvdSBoYXZlCj4gPj4gICBhbm90aGVyIHN1
-Z2dlc3Rpb24gZm9yIHRoaXM/Cj4gPj4KPiA+PiAgICBUaGVyZeKAmXMgYW5vdGhlciBzb2x1dGlv
-biB3aGljaCBtYWtlcyB0aGlzIHNpbXBsZXIgYW5kIEnigJlkIGxpa2UgdG8KPiA+PiAgICBhc2sg
-eW91ciBvcGluaW9uIGFib3V0IHRoaXMuCj4gPj4gICAgVGhlIHNvbHV0aW9uIGlzIHRvIG1ha2Ug
-YW4gaGllcmFyY2h5IGJldHdlZW4gTVNJIGFuZCBQQ0kgbm9kZXMgIGFzIGJlbG93Ogo+ID4+IERl
-dmljZShcX1NCLk1TSVgpIHsKPiA+PiAgICBEZXZpY2UoXF9TQi5QQ0kwKQo+ID4+ICAgIERldmlj
-ZShcX1NCLlBDSTEpCj4gPj4gICAg4oCm4oCmCj4gPj4gfQo+ID4+ICAgSW4gb3RoZXIgd29yZCwg
-TVNJWCBub2RlIGlzIGEgcGFyZW50IG5vZGUgb2YgUENJIG5vZGVzIGluIEFDUEkKPiA+PiAgIHRh
-YmxlLiAgSW4gdGhpcyBzZW5zZSwgdGhlcmXigJlzIGFuIGV4cGxpY2l0IGRlcGVuZGVuY3kgYmV0
-d2VlbiBNU0kKPiA+PiAgIGFuZCBQQ0ksIE1TSSBjb250cm9sbGVyIG11c3QgYmUgcHJvYmVkIGJl
-Zm9yZSBQQ0kgYW5kIGl0IHdpbGwKPiA+PiAgIGd1YXJhbnRlZSBub3QgYnJlYWtpbmcgbmV4dCBr
-ZXJuZWwgcmVsZWFzZXMuICBIb3cgZG8geW91IHRoaW5rIGFib3V0Cj4gPj4gICB0aGlzIHNvbHV0
-aW9uLgo+ID4KPiA+IEkgdGhpbmsgdGhhdCdzIGEgcGxhc3RlciBhcyBpbmVmZmVjdGl2ZSBhcyBy
-ZW9yZGVyaW5nIG5vZGVzLCBpbiBzaG9ydAo+ID4gaXQgaXMgbm90IGEgc29sdXRpb24gYW5kIHlv
-dSBzdGlsbCByZWx5IG9uIGtlcm5lbCBsaW5rIG9yZGVyaW5nLCB5b3UKPiA+IGNhbiBmaWRkbGUg
-d2l0aCBBQ1BJIHRhYmxlcyBhcyBtdWNoIGFzIHlvdSB3YW50IGJ1dCB0aGF0IGRvZXMgbm90IGNo
-YW5nZS4KPiA+Cj4gPj4gIEkgYWxzbyB0cmllZCB0byB1c2UgX0RFUCBtZXRob2QgdG8gZGVzY3Jp
-YmUgdGhlIGRlcGVuZGVuY3kgb2YgUENJZQo+ID4+ICBub2RlcywgYnV0IGl0IGxvb2tzIHRoYXQg
-aXQgZG9lcyBub3Qgd29yayBhcyBQQ0kgYW5kIE1TSSBhcmUgaGFuZGVkCj4gPj4gIGJ5IGFjcGlf
-YnVzX3NjYW4gYW5kIHN0aWxsIGhhdmluZyBpc3N1ZSB3aGVuIHdlIHJlLXByb2JlIFBDSS4KPiA+
-Cj4gPiBUaGF0J3MgYSB0YWQgdmFndWUgdG8gYmUgZnJhbmssIGFueXdheSBpdCBpcyBwcmV0dHkg
-Y2xlYXIgdG8gbWUgdGhhdCB3ZQo+ID4gaGF2ZSBoaXQgYSB3YWxsLiBJbiBBQ1BJIHRoZXJlIGlz
-IG5vIHdheSB0byBkZXNjcmliZSBwcm9iZSBkZXBlbmRlbmNpZXMKPiA+IGxpa2UgdGhlIG9uZSB5
-b3UgaGF2ZSwgaXQgaXMgYXMgc2ltcGxlIGFzIHRoYXQsIGFuZCB0aGlzIE1TSSBpc3N1ZSB5b3UK
-PiA+IGFyZSBmYWNpbmcgaXMganVzdCBhbiBleGFtcGxlLCB0aGVyZSBhcmUgbW9yZSBlZzoKPiA+
-Cj4gPiBodHRwczovL3d3dy5zcGluaWNzLm5ldC9saXN0cy9hcm0ta2VybmVsL21zZzU4NTgyNS5o
-dG1sCj4gPgo+ID4gQXQgdGhlIGVuZCBvZiB0aGUgZGF5IHRoZSBjaG9pY2UgaXMgc2ltcGxlIGVp
-dGhlciB3ZSBhY2NlcHQgKGFuZCB3ZQo+ID4gbWFpbnRhaW4gYmVjYXVzZSB0aGF0J3MgdGhlIHBy
-b2JsZW0pIHRoZXNlIGhhY2tzIC0gYW5kIEkgYW0gbm90IHdpbGxpbmcKPiA+IHRvIGRvIHRoYXQg
-LSBvciB3ZSBmaW5kIGEgd2F5IHRvIHNvbHZlIHRoaXMgZnJvbSBhIGdlbmVyYWwgcGVyc3BlY3Rp
-dmUgbm90Cj4gPiBhcyBhIHBvaW50IGhhY2suCj4gPgo+ID4gSSBjYW4gaGF2ZSBhIGxvb2sgYXQg
-c29sdmluZyB0aGUgd2hvbGUgaXNzdWUgYnV0IGl0IHdvbid0IGhhcHBlbgo+ID4gdG9tb3Jyb3cu
-Cj4gCj4gVGhhbmtzIGZvciBoZWxwaW5nIHRvIHJlc29sdmUgdGhpcyBnZW5lcmFsIEFDUEkgZGVw
-ZW5kZW5jZSBpc3N1ZS4KPiBJIGxvb2sgZm9yd2FyZCBmb3IgYSB2ZXJzaW9uIHRvIHRlc3Qgd2l0
-aC4KPiAKPiBDYW4gd2Ugc2VwYXJhdGUgdGhlIGdlbmVyYWwgZGVwZW5kZW5jZSBwYXRjaCBmcm9t
-IHRoZSBYLUdlbmUgTVNJIEFDUEkKPiBlbmFibGUgcGF0Y2guCj4gVGhpcyBvcmlnaW5hbCBwYXRj
-aCB3YXMgdG8gZW5hYmxlIEFDUEkgc3VwcG9ydCBmb3IgUENJZSBNU0kuCj4gVGhlIGRlcGVuZGVu
-Y2UgaXNzdWUgY2FuIGJlIHJlc29sdmVkIHNlcGFyYXRlbHkuCj4gQ2FuIHlvdSBoZWxwIHRvIHB1
-bGwgaW4gdGhlIHBhdGNoLgoKT2ssIHByYWdtYXRpY2FsbHkgdGhlIG9ubHkgc2FuZSB0aGluZyB5
-b3UgY2FuIGRvIGlzOgoKKDEpICBBZGQgYW4gWC1nZW5lIHNwZWNpZmljIGhvb2sgaW4gZHJpdmVy
-cy9hY3BpL3NjYW4uYyAoYWNwaV9zY2FuX2luaXQoKSkKICAgICB0aGF0IGNhcnJpZXMgb3V0IGZ3
-bm9kZSByZWdpc3RyYXRpb24gKGllIHJlZ2lzdGVyIHRoZSBmd25vZGUgYnkKICAgICBzZWFyY2hp
-bmcgdGhlIE1TSSBISUQgb2JqZWN0IC0gdGhpcyBkb2VzIG5vdCBkZXBlbmQgb24gQUNQSSBkZXZp
-Y2UKICAgICBub2RlcyBvcmRlciAtIHlvdSBlbmZvcmNlIHRoZSBvcmRlciBieSBwYXJzaW5nIHRo
-ZSBuYW1lc3BhY2UgYmVmb3JlCiAgICAgQUNQSSBjb3JlIGRvZXMgaXQsIGF0IHRoYXQgcG9pbnQg
-aW4gdGltZSBBQ1BJIG9iamVjdHMgYXJlIGNyZWF0ZWQpLgogICAgIE5vdCBzdXJlIFJhZmFlbCB3
-aWxsIGJlIGhhcHB5IHRvIHNlZSB0aGlzIGNvZGUgYnV0IHRoYXQncyB0aGUgb25seQogICAgIHNv
-bHV0aW9uIHRoYXQgZG9lcyBub3QgcmVseSBvbiBBQ1BJIGRldmljZSBub2RlcyBvcmRlcmluZyBh
-bmQga2VybmVsCiAgICAgbGluayBvcmRlcmluZy4gWW91IG1heSBhY2hpZXZlIHRoZSBzYW1lIGJ5
-IGV4dGVuZGluZyB0aGUgQUNQSSBBUEQKICAgICBjb2RlIChkcml2ZXJzL2FjcGkvYWNwaV9hcGQu
-Yykgd2hldGhlciB0aGF0J3MgdGhlIGJlc3Qgd2F5IGZvcndhcmQgaXMKICAgICB0byBiZSBzZWVu
-LgoKKDIpICBZb3UgY2FuIGFsc28gYWRkIGFuIHhnZW5lIHNwZWNpZmljIHNjYW4gaGFuZGxlciBh
-dCBhcmNoX2luaXRfY2FsbCgpCiAgICAgYnV0IGdpdmVuIHRoYXQgUENJIHJvb3QgYnJpZGdlIGlz
-IG1hbmFnZWQgdGhyb3VnaCBhIHNjYW4gaGFuZGxlciB0b28geW91CiAgICAgd291bGQgcmVseSBv
-biBBQ1BJIGRldmljZXMgbm9kZXMgb3JkZXJpbmcgaW4gdGhlIERTRFQuIExldCBtZSBleHBsYWlu
-CiAgICAgc29tZXRoaW5nIGZvciB0aGUgYmVuZWZpdCBvZiBldmVyeW9uZSByZWFkaW5nIHRoaXMg
-dGhyZWFkOiBJIGRvIG5vdCB3YW50CiAgICAgWC1nZW5lIEFDUEkgdGFibGVzIHRvIGZvcmNlIHRo
-ZSBrZXJuZWwgdG8gc2NhbiBkZXZpY2VzIGluIGFueSBvcmRlcgogICAgIHdoYXRzb3ZlciBiZWNh
-dXNlIHRoaXMgd291bGQgbWVhbiB3ZSB3aWxsIF9uZXZlcl8gYmUgYWJsZSB0byBjaGFuZ2UgdGhl
-CiAgICAgc2NhbiBvcmRlciBpZiB3ZSB3YW50ZWQgdG8gbGVzdCB3ZSB0cmlnZ2VyIHJlZ3Jlc3Np
-b25zLiBTbyB0aGlzIGlzCiAgICAgYSBub24tb3B0aW9uIGluIG15IG9waW5pb24uCgooMykgTGFz
-dCBvcHRpb24gaXMgdG8gcmVnaXN0ZXIgdGhlIE1TSSBmd25vZGUgZWl0aGVyIGluIFBDSSBFQ0FN
-IHF1aXJrCiAgICBoYW5kbGluZyBvciBpbiBhcm02NCBiZWZvcmUgcHJvYmluZyB0aGUgUENJIHJv
-b3QgYnVzLgoKSSBhbSBub3Qga2VlbiBvbiAoMikgYW5kICgzKSBhdCBhbGwsIHNvIF9pZl8gd2Ug
-aGF2ZSB0byBmaW5kIGEgc29sdXRpb24KdG8gdGhpcyBwcm9ibGVtICgxKSBpcyB0aGUgb25seSBv
-cHRpb24geW91IGhhdmUgZm9yIHRoZSB0aW1lIGJlaW5nIGFzCmZhciBhcyBJIGFtIGNvbmNlcm5l
-ZC4KCkxvcmVuem8KCj4gCj4gQmVzdCByZWdhcmRzLAo+IEtodW9uZyBEaW5oCj4gCj4gPiBUaGFu
-a3MsCj4gPiBMb3JlbnpvCj4gPgo+ID4+IFRoYW5rcywKPiA+PiBLaHVvbmcgRGluaAo+ID4+Cj4g
-Pj4gPj4gRmluYWxseSwgcGxlYXNlIGV4ZWN1dGUgdGhpcyBjb21tYW5kIG9uIHRoZSB2bWxpbnV4
-IHRoYXQgIndvcmtzIgo+ID4+ID4+IGZvciB5b3U6Cj4gPj4gPj4KPiA+PiA+PiBubSB2bWxpbnV4
-IHwgZ3JlcCAtRSAnX19pbml0Y2FsbF8oeGdlbmVfcGNpZV9tc2lfaW5pdHxhY3BpX2luaXQpJwo+
-ID4+ID4KPiA+PiA+ICQgbm0gdm1saW51eCB8IGdyZXAgLUUgJ19faW5pdGNhbGxfKHhnZW5lX3Bj
-aWVfbXNpX2luaXR8YWNwaV9pbml0KScKPiA+PiA+IGZmZmYwMDAwMDhkYWIyZDggdCBfX2luaXRj
-YWxsX2FjcGlfaW5pdDQKPiA+PiA+IGZmZmYwMDAwMDhkYWIyYzggdCBfX2luaXRjYWxsX3hnZW5l
-X3BjaWVfbXNpX2luaXQ0Cj4gPj4gPgo+ID4+ID4gQmVzdCByZWdhcmRzLAo+ID4+ID4gS2h1b25n
-IERpbmgKPiA+PiA+Cj4gPj4gPj4gRXZlbiBieSBvcmRlcmluZyBkZXZpY2VzIGluIHRoZSBBQ1BJ
-IHRhYmxlcyAodGhhdCBJIGFiaG9yKSBJIHN0aWxsIGRvCj4gPj4gPj4gbm90IHVuZGVyc3RhbmQg
-aG93IHRoaXMgd29ya3MgKEkgbWVhbiB3aXRob3V0IHJlbHlpbmcgb24ga2VybmVsIGxpbmsKPiA+
-PiA+PiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgTVNJIGRyaXZlciBpcyBwcm9iZWQgYmVmb3Jl
-IFBDSSBkZXZpY2VzIGFyZQo+ID4+ID4+IGVudW1lcmF0ZWQgaW4gYWNwaV9pbml0KCkpLgo+ID4+
-ID4+Cj4gPj4gPj4gVGhhbmtzLAo+ID4+ID4+IExvcmVuem8KPiA+PiA+Pgo+ID4+ID4+PiBCZXN0
-IHJlZ2FyZHMsCj4gPj4gPj4+IEtodW9uZwo+ID4+ID4+Pgo+ID4+ID4+PiBPbiBGcmksIEFwciAy
-OCwgMjAxNyBhdCAyOjI3IEFNLCBNYXJjIFp5bmdpZXIgPG1hcmMuenluZ2llckBhcm0uY29tPiB3
-cm90ZToKPiA+PiA+Pj4gPiBPbiAyOC8wNC8xNyAwMTo1NCwgS2h1b25nIERpbmggd3JvdGU6Cj4g
-Pj4gPj4+ID4+IEZyb206IEtodW9uZyBEaW5oIDxrZGluaEBhcG0uY29tPgo+ID4+ID4+PiA+Pgo+
-ID4+ID4+PiA+PiBUaGlzIHBhdGNoIG1ha2VzIHBjaS14Z2VuZS1tc2kgZHJpdmVyIEFDUEktYXdh
-cmUgYW5kIHByb3ZpZGVzCj4gPj4gPj4+ID4+IE1TSSBjYXBhYmlsaXR5IGZvciBYLUdlbmUgdjEg
-UENJZSBjb250cm9sbGVycyBpbiBBQ1BJIGJvb3QgbW9kZS4KPiA+PiA+Pj4gPj4KPiA+PiA+Pj4g
-Pj4gU2lnbmVkLW9mZi1ieTogS2h1b25nIERpbmggPGtkaW5oQGFwbS5jb20+Cj4gPj4gPj4+ID4+
-IFNpZ25lZC1vZmYtYnk6IER1YyBEYW5nIDxkaGRhbmdAYXBtLmNvbT4KPiA+PiA+Pj4gPj4gQWNr
-ZWQtYnk6IE1hcmMgWnluZ2llciA8bWFyYy56eW5naWVyQGFybS5jb20+Cj4gPj4gPj4+ID4+IC0t
-LQo+ID4+ID4+PiA+PiB2MjoKPiA+PiA+Pj4gPj4gIC0gVmVyaWZ5IHdpdGggQklPUyB2ZXJzaW9u
-IDMuMDYuMjUgYW5kIDMuMDcuMDkKPiA+PiA+Pj4gPj4gdjE6Cj4gPj4gPj4+ID4+ICAtIEluaXRp
-YWwgdmVyc2lvbgo+ID4+ID4+PiA+PiAtLS0KPiA+PiA+Pj4gPj4gIGRyaXZlcnMvcGNpL2hvc3Qv
-cGNpLXhnZW5lLW1zaS5jIHwgICAzNSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0t
-LQo+ID4+ID4+PiA+PiAgMSBmaWxlcyBjaGFuZ2VkLCAzMiBpbnNlcnRpb25zKCspLCAzIGRlbGV0
-aW9ucygtKQo+ID4+ID4+PiA+Pgo+ID4+ID4+PiA+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kv
-aG9zdC9wY2kteGdlbmUtbXNpLmMgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS14Z2VuZS1tc2kuYwo+
-ID4+ID4+PiA+PiBpbmRleCBmMWI2MzNiLi4wMGFhYTNkIDEwMDY0NAo+ID4+ID4+PiA+PiAtLS0g
-YS9kcml2ZXJzL3BjaS9ob3N0L3BjaS14Z2VuZS1tc2kuYwo+ID4+ID4+PiA+PiArKysgYi9kcml2
-ZXJzL3BjaS9ob3N0L3BjaS14Z2VuZS1tc2kuYwo+ID4+ID4+PiA+PiBAQCAtMjQsNiArMjQsNyBA
-QAo+ID4+ID4+PiA+PiAgI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgo+ID4+ID4+PiA+PiAgI2luY2x1
-ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ID4+ID4+PiA+PiAgI2luY2x1ZGUgPGxpbnV4
-L29mX3BjaS5oPgo+ID4+ID4+PiA+PiArI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KPiA+PiA+Pj4g
-Pj4KPiA+PiA+Pj4gPj4gICNkZWZpbmUgTVNJX0lSMCAgICAgICAgICAgICAgICAgICAgICAweDAw
-MDAwMAo+ID4+ID4+PiA+PiAgI2RlZmluZSBNU0lfSU5UMCAgICAgICAgICAgICAweDgwMDAwMAo+
-ID4+ID4+PiA+PiBAQCAtMzksNyArNDAsNyBAQCBzdHJ1Y3QgeGdlbmVfbXNpX2dyb3VwIHsKPiA+
-PiA+Pj4gPj4gIH07Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+ICBzdHJ1Y3QgeGdlbmVfbXNpIHsK
-PiA+PiA+Pj4gPj4gLSAgICAgc3RydWN0IGRldmljZV9ub2RlICAgICAgKm5vZGU7Cj4gPj4gPj4+
-ID4+ICsgICAgIHN0cnVjdCBmd25vZGVfaGFuZGxlICAgICpmd25vZGU7Cj4gPj4gPj4+ID4+ICAg
-ICAgIHN0cnVjdCBpcnFfZG9tYWluICAgICAgICppbm5lcl9kb21haW47Cj4gPj4gPj4+ID4+ICAg
-ICAgIHN0cnVjdCBpcnFfZG9tYWluICAgICAgICptc2lfZG9tYWluOwo+ID4+ID4+PiA+PiAgICAg
-ICB1NjQgICAgICAgICAgICAgICAgICAgICBtc2lfYWRkcjsKPiA+PiA+Pj4gPj4gQEAgLTI0OSw2
-ICsyNTAsMTMgQEAgc3RhdGljIHZvaWQgeGdlbmVfaXJxX2RvbWFpbl9mcmVlKHN0cnVjdCBpcnFf
-ZG9tYWluICpkb21haW4sCj4gPj4gPj4+ID4+ICAgICAgIC5mcmVlICAgPSB4Z2VuZV9pcnFfZG9t
-YWluX2ZyZWUsCj4gPj4gPj4+ID4+ICB9Owo+ID4+ID4+PiA+Pgo+ID4+ID4+PiA+PiArI2lmZGVm
-IENPTkZJR19BQ1BJCj4gPj4gPj4+ID4+ICtzdGF0aWMgc3RydWN0IGZ3bm9kZV9oYW5kbGUgKnhn
-ZW5lX21zaV9nZXRfZndub2RlKHN0cnVjdCBkZXZpY2UgKmRldikKPiA+PiA+Pj4gPj4gK3sKPiA+
-PiA+Pj4gPj4gKyAgICAgcmV0dXJuIHhnZW5lX21zaV9jdHJsLmZ3bm9kZTsKPiA+PiA+Pj4gPj4g
-K30KPiA+PiA+Pj4gPj4gKyNlbmRpZgo+ID4+ID4+PiA+PiArCj4gPj4gPj4+ID4+ICBzdGF0aWMg
-aW50IHhnZW5lX2FsbG9jYXRlX2RvbWFpbnMoc3RydWN0IHhnZW5lX21zaSAqbXNpKQo+ID4+ID4+
-PiA+PiAgewo+ID4+ID4+PiA+PiAgICAgICBtc2ktPmlubmVyX2RvbWFpbiA9IGlycV9kb21haW5f
-YWRkX2xpbmVhcihOVUxMLCBOUl9NU0lfVkVDLAo+ID4+ID4+PiA+PiBAQCAtMjU2LDcgKzI2NCw3
-IEBAIHN0YXRpYyBpbnQgeGdlbmVfYWxsb2NhdGVfZG9tYWlucyhzdHJ1Y3QgeGdlbmVfbXNpICpt
-c2kpCj4gPj4gPj4+ID4+ICAgICAgIGlmICghbXNpLT5pbm5lcl9kb21haW4pCj4gPj4gPj4+ID4+
-ICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+IC0g
-ICAgIG1zaS0+bXNpX2RvbWFpbiA9IHBjaV9tc2lfY3JlYXRlX2lycV9kb21haW4ob2Zfbm9kZV90
-b19md25vZGUobXNpLT5ub2RlKSwKPiA+PiA+Pj4gPj4gKyAgICAgbXNpLT5tc2lfZG9tYWluID0g
-cGNpX21zaV9jcmVhdGVfaXJxX2RvbWFpbihtc2ktPmZ3bm9kZSwKPiA+PiA+Pj4gPj4gICAgICAg
-ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGdlbmVfbXNpX2Rv
-bWFpbl9pbmZvLAo+ID4+ID4+PiA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
-ICAgICAgICAgICAgICAgIG1zaS0+aW5uZXJfZG9tYWluKTsKPiA+PiA+Pj4gPj4KPiA+PiA+Pj4g
-Pj4gQEAgLTI2NSw2ICsyNzMsOSBAQCBzdGF0aWMgaW50IHhnZW5lX2FsbG9jYXRlX2RvbWFpbnMo
-c3RydWN0IHhnZW5lX21zaSAqbXNpKQo+ID4+ID4+PiA+PiAgICAgICAgICAgICAgIHJldHVybiAt
-RU5PTUVNOwo+ID4+ID4+PiA+PiAgICAgICB9Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+ICsjaWZk
-ZWYgQ09ORklHX0FDUEkKPiA+PiA+Pj4gPj4gKyAgICAgcGNpX21zaV9yZWdpc3Rlcl9md25vZGVf
-cHJvdmlkZXIoJnhnZW5lX21zaV9nZXRfZndub2RlKTsKPiA+PiA+Pj4gPj4gKyNlbmRpZgo+ID4+
-ID4+PiA+PiAgICAgICByZXR1cm4gMDsKPiA+PiA+Pj4gPj4gIH0KPiA+PiA+Pj4gPj4KPiA+PiA+
-Pj4gPj4gQEAgLTQ0OSw2ICs0NjAsMTMgQEAgc3RhdGljIGludCB4Z2VuZV9tc2lfaHdpcnFfZnJl
-ZSh1bnNpZ25lZCBpbnQgY3B1KQo+ID4+ID4+PiA+PiAgICAgICB7fSwKPiA+PiA+Pj4gPj4gIH07
-Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+ICsjaWZkZWYgQ09ORklHX0FDUEkKPiA+PiA+Pj4gPj4g
-K3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgeGdlbmVfbXNpX2FjcGlfaWRzW10g
-PSB7Cj4gPj4gPj4+ID4+ICsgICAgIHsiQVBNQzBEMEUiLCAwfSwKPiA+PiA+Pj4gPj4gKyAgICAg
-eyB9LAo+ID4+ID4+PiA+PiArfTsKPiA+PiA+Pj4gPj4gKyNlbmRpZgo+ID4+ID4+PiA+PiArCj4g
-Pj4gPj4+ID4+ICBzdGF0aWMgaW50IHhnZW5lX21zaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2
-aWNlICpwZGV2KQo+ID4+ID4+PiA+PiAgewo+ID4+ID4+PiA+PiAgICAgICBzdHJ1Y3QgcmVzb3Vy
-Y2UgKnJlczsKPiA+PiA+Pj4gPj4gQEAgLTQ2OSw3ICs0ODcsMTcgQEAgc3RhdGljIGludCB4Z2Vu
-ZV9tc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+PiA+Pj4gPj4gICAg
-ICAgICAgICAgICBnb3RvIGVycm9yOwo+ID4+ID4+PiA+PiAgICAgICB9Cj4gPj4gPj4+ID4+ICAg
-ICAgIHhnZW5lX21zaS0+bXNpX2FkZHIgPSByZXMtPnN0YXJ0Owo+ID4+ID4+PiA+PiAtICAgICB4
-Z2VuZV9tc2ktPm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKPiA+PiA+Pj4gPj4gKwo+ID4+ID4+
-PiA+PiArICAgICB4Z2VuZV9tc2ktPmZ3bm9kZSA9IG9mX25vZGVfdG9fZndub2RlKHBkZXYtPmRl
-di5vZl9ub2RlKTsKPiA+PiA+Pj4gPj4gKyAgICAgaWYgKCF4Z2VuZV9tc2ktPmZ3bm9kZSkgewo+
-ID4+ID4+PiA+PiArICAgICAgICAgICAgIHhnZW5lX21zaS0+Zndub2RlID0gaXJxX2RvbWFpbl9h
-bGxvY19md25vZGUoTlVMTCk7Cj4gPj4gPj4+ID4KPiA+PiA+Pj4gPiBQbGVhc2UgcHJvdmlkZSBz
-b21ldGhpbmcgb3RoZXIgdGhhbiBOVUxMLCBzdWNoIGFzIHRoZSBiYXNlIGFkZHJlc3MgaWYKPiA+
-PiA+Pj4gPiB0aGUgZGV2aWNlLiBUaGF0J3MgcXVpdGUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCj4g
-Pj4gPj4+ID4KPiA+PiA+Pj4gPj4gKyAgICAgICAgICAgICBpZiAoIXhnZW5lX21zaS0+Zndub2Rl
-KSB7Cj4gPj4gPj4+ID4+ICsgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZwZGV2LT5kZXYs
-ICJGYWlsZWQgdG8gY3JlYXRlIGZ3bm9kZVxuIik7Cj4gPj4gPj4+ID4+ICsgICAgICAgICAgICAg
-ICAgICAgICByYyA9IEVOT01FTTsKPiA+PiA+Pj4gPj4gKyAgICAgICAgICAgICAgICAgICAgIGdv
-dG8gZXJyb3I7Cj4gPj4gPj4+ID4+ICsgICAgICAgICAgICAgfQo+ID4+ID4+PiA+PiArICAgICB9
-Cj4gPj4gPj4+ID4+ICsKPiA+PiA+Pj4gPj4gICAgICAgeGdlbmVfbXNpLT5udW1fY3B1cyA9IG51
-bV9wb3NzaWJsZV9jcHVzKCk7Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+ICAgICAgIHJjID0geGdl
-bmVfbXNpX2luaXRfYWxsb2NhdG9yKHhnZW5lX21zaSk7Cj4gPj4gPj4+ID4+IEBAIC01NDAsNiAr
-NTY4LDcgQEAgc3RhdGljIGludCB4Z2VuZV9tc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj
-ZSAqcGRldikKPiA+PiA+Pj4gPj4gICAgICAgLmRyaXZlciA9IHsKPiA+PiA+Pj4gPj4gICAgICAg
-ICAgICAgICAubmFtZSA9ICJ4Z2VuZS1tc2kiLAo+ID4+ID4+PiA+PiAgICAgICAgICAgICAgIC5v
-Zl9tYXRjaF90YWJsZSA9IHhnZW5lX21zaV9tYXRjaF90YWJsZSwKPiA+PiA+Pj4gPj4gKyAgICAg
-ICAgICAgICAuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKHhnZW5lX21zaV9hY3BpX2lkcyks
-Cj4gPj4gPj4+ID4+ICAgICAgIH0sCj4gPj4gPj4+ID4+ICAgICAgIC5wcm9iZSA9IHhnZW5lX21z
-aV9wcm9iZSwKPiA+PiA+Pj4gPj4gICAgICAgLnJlbW92ZSA9IHhnZW5lX21zaV9yZW1vdmUsCj4g
-Pj4gPj4+ID4+Cj4gPj4gPj4+ID4KPiA+PiA+Pj4gPiBUaGUgY29kZSBpcyB0cml2aWFsLCBidXQg
-cmVsaWVzIG9uIHRoZSBNU0kgY29udHJvbGxlciB0byBwcm9iZSBiZWZvcmUKPiA+PiA+Pj4gPiB0
-aGUgUENJIGJ1cy4gV2hhdCBlbmZvcmNlcyB0aGlzPyBIb3cgaXMgaXQgbWFraW5nIHN1cmUgdGhh
-dCB0aGlzIGlzIG5vdAo+ID4+ID4+PiA+IGdvaW5nIHRvIGJyZWFrIGluIHRoZSBuZXh0IGtlcm5l
-bCByZWxlYXNlPyBBcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGhlcmUKPiA+PiA+Pj4gPiBpcyBubyBl
-eHBsaWNpdCBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIHR3bywgbWFraW5nIGl0IHRoZSB3aG9sZSB0
-aGluZwo+ID4+ID4+PiA+IGV4dHJlbWVseSBmcmFnaWxlLgo+ID4+ID4+PiA+Cj4gPj4gPj4+ID4g
-VGhhbmtzLAo+ID4+ID4+PiA+Cj4gPj4gPj4+ID4gICAgICAgICBNLgo+ID4+ID4+PiA+IC0tCj4g
-Pj4gPj4+ID4gSmF6eiBpcyBub3QgZGVhZC4gSXQganVzdCBzbWVsbHMgZnVubnkuLi4KPiA+PiA+
-Pj4KPiA+PiA+Pj4gLS0KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
-X19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlz
-dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp
-bmZvL2xpbnV4LWFybS1rZXJuZWwK
+On Tue, Jun 13, 2017 at 01:56:44PM -0700, Khuong Dinh wrote:
+> Hi Lorenzo,
+> 
+> On Thu, Jun 8, 2017 at 3:39 AM, Lorenzo Pieralisi
+> <lorenzo.pieralisi@arm.com> wrote:
+> > 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 for helping to resolve this general ACPI dependence issue.
+> I look forward for a version to test with.
+> 
+> Can we separate the general dependence patch from the X-Gene MSI ACPI
+> enable patch.
+> This original patch was to enable ACPI support for PCIe MSI.
+> The dependence issue can be resolved separately.
+> Can you help to pull in the patch.
+
+Ok, pragmatically the only sane thing you can do is:
+
+(1)  Add an X-gene specific hook in drivers/acpi/scan.c (acpi_scan_init())
+     that carries out fwnode registration (ie register the fwnode by
+     searching the MSI HID object - this does not depend on ACPI device
+     nodes order - you enforce the order by parsing the namespace before
+     ACPI core does it, at that point in time ACPI objects are created).
+     Not sure Rafael will be happy to see this code but that's the only
+     solution that does not rely on ACPI device nodes ordering and kernel
+     link ordering. You may achieve the same by extending the ACPI APD
+     code (drivers/acpi/acpi_apd.c) whether that's the best way forward is
+     to be seen.
+
+(2)  You can also add an xgene specific scan handler at arch_init_call()
+     but given that PCI root bridge is managed through a scan handler too you
+     would rely on ACPI devices nodes ordering in the DSDT. Let me explain
+     something for the benefit of everyone reading this thread: I do not want
+     X-gene ACPI tables to force the kernel to scan devices in any order
+     whatsover because this would mean we will _never_ be able to change the
+     scan order if we wanted to lest we trigger regressions. So this is
+     a non-option in my opinion.
+
+(3) Last option is to register the MSI fwnode either in PCI ECAM quirk
+    handling or in arm64 before probing the PCI root bus.
+
+I am not keen on (2) and (3) at all, so _if_ we have to find a solution
+to this problem (1) is the only option you have for the time being as
+far as I am concerned.
+
+Lorenzo
+
+> 
+> Best regards,
+> Khuong Dinh
+> 
+> > 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 a4dfb1a..0cfa9d7 100644
--- a/a/content_digest
+++ b/N2/content_digest
@@ -10,233 +10,301 @@
  "Subject\0Re: [PATCH v2 pci] PCI/MSI: pci-xgene-msi: Enable MSI support in ACPI boot for X-Gene v1\0"
  "Date\0Wed, 14 Jun 2017 13:59:02 +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"
- "T24gVHVlLCBKdW4gMTMsIDIwMTcgYXQgMDE6NTY6NDRQTSAtMDcwMCwgS2h1b25nIERpbmggd3Jv\n"
- "dGU6Cj4gSGkgTG9yZW56bywKPiAKPiBPbiBUaHUsIEp1biA4LCAyMDE3IGF0IDM6MzkgQU0sIExv\n"
- "cmVuem8gUGllcmFsaXNpCj4gPGxvcmVuem8ucGllcmFsaXNpQGFybS5jb20+IHdyb3RlOgo+ID4g\n"
- "T24gVHVlLCBKdW4gMDYsIDIwMTcgYXQgMDk6NDQ6MTVBTSAtMDcwMCwgS2h1b25nIERpbmggd3Jv\n"
- "dGU6Cj4gPj4gSGkgTG9yZW56bywKPiA+Pgo+ID4+IE9uIFR1ZSwgTWF5IDksIDIwMTcgYXQgMzo1\n"
- "NSBQTSwgS2h1b25nIERpbmggPGtkaW5oQGFwbS5jb20+IHdyb3RlOgo+ID4+ID4gSGkgTG9yZW56\n"
- "bywKPiA+PiA+Cj4gPj4gPiBPbiBGcmksIE1heSA1LCAyMDE3IGF0IDk6NTEgQU0sIExvcmVuem8g\n"
- "UGllcmFsaXNpCj4gPj4gPiA8bG9yZW56by5waWVyYWxpc2lAYXJtLmNvbT4gd3JvdGU6Cj4gPj4g\n"
- "Pj4gT24gVGh1LCBNYXkgMDQsIDIwMTcgYXQgMDU6MzY6MDZQTSAtMDcwMCwgS2h1b25nIERpbmgg\n"
- "d3JvdGU6Cj4gPj4gPj4+IEhpIE1hcmMsCj4gPj4gPj4+IFRoZXJlJ3Mgbm8gZXhwbGljaXQgZGVw\n"
- "ZW5kZW5jeSBiZXR3ZWVuIHBjaWUgZHJpdmVyIGFuZCBtc2kKPiA+PiA+Pj4gY29udHJvbGxlci4g\n"
- "IFRoZSBjdXJyZW50IHNvbHV0aW9uIHRoYXQgd2UgZGlkIGlzIHJlbHlpbmcgb24gdGhlCj4gPj4g\n"
- "Pj4+IG5vZGUgb3JkZXJpbmcgaW4gQklPUy4gIEFDUEkgNS4wIGludHJvZHVjZWQgX0RFUCBtZXRo\n"
- "b2QgdG8gYXNzaWduIGEKPiA+PiA+Pj4gaGlnaGVyIHByaW9yaXR5IGluIHN0YXJ0IG9yZGVyaW5n\n"
- "LiAgVGhpcyBtZXRob2QgY291bGQgYmUgYXBwbGllZCBpbgo+ID4+ID4+PiBjYXNlIG9mIG1zaSBh\n"
- "bmQgcGNpZSBhcmUgdGhlIHNhbWUgbGV2ZWwgb2Ygc3Vic3lzX2luaXQgKGluIEFDUEkKPiA+PiA+\n"
- "Pj4gYm9vdCkuICBIb3dldmVyLCBQQ0llIGRyaXZlciBoYXMgbm90IHN1cHBvcnRlZCBmb3IgdGhp\n"
- "cyBkZXBlbmRlbmN5Cj4gPj4gPj4+IGNoZWNrIHlldC4gIEhvdyBkbyB5b3UgdGhpbmsgYWJvdXQg\n"
- "dGhpcyBzb2x1dGlvbi4KPiA+PiA+Pgo+ID4+ID4+IEZpcnN0IG9mZiwgeW91IGNhbid0IHBvc3Qg\n"
- "ZW1haWxzIHdpdGggY29uZmlkZW50aWFsaXR5IG5vdGljZXMgb24KPiA+PiA+PiBtYWlsaW5nIGxp\n"
- "c3RzIHNvIHJlbW92ZSBpdCBmcm9tIG5vdyBvbndhcmRzLgo+ID4+ID4KPiA+PiA+IEZpeGVkCj4g\n"
- "Pj4gPgo+ID4+ID4+IFNlY29uZGx5LCBJIGNvbW1lbnRlZCBvbiB0aGlzIGJlZm9yZSwgc28geW91\n"
- "IGtub3cgd2hhdCBteSBvcGluaW9uIGlzLgo+ID4+ID4KPiA+PiA+IEkgZ290IHlvdXIgb3Bpbmlv\n"
- "bi4gSSdsbCBpbXBsZW1lbnQgYXMgeW91ciBzdWdnZXN0aW9uLgo+ID4+ID4KPiA+Pgo+ID4+ICAg\n"
- "UmVnYXJkaW5nIHRvIHlvdXIgcHJldmlvdXMgc3VnZ2VzdGlvbiB0byBhZGQgYSBob29rIHdhbGtp\n"
- "bmcgdGhlIEFDUEkKPiA+PiAgIG5hbWVzcGFjZSBiZWZvcmUgYWNwaV9idXNfc2NhbigpIGluIGFj\n"
- "cGlfc2Nhbl9pbml0KCkgdG8gbWFrZSBNU0kKPiA+PiAgIGNvbnRyb2xsZXJzIG11c3QgYmUgcHJv\n"
- "YmVkIGJlZm9yZSBQQ0kuICBJIGhhdmUgYSBjb25jZXJuIHRoYXQgdGhlCj4gPj4gICBNU0kgbmFt\n"
- "ZXNwYWNlIOKAnCBfU0IuTVNJWOKAnSBpcyBub3QgYSB1bmlxdWUgbmFtZSBhbmQgaG93IGNhbiB3\n"
- "ZSB3YWxrCj4gPj4gICB0aGUgQUNQSSBuYW1lc3BhY2UgYW5kIHVzZSB0aGlzIG5hbWUgdG8gbWFr\n"
- "ZSBNU0kgcHJvYmVkIGJlZm9yZSBQQ0kuCj4gPj4gICBNYXkgeW91IGhhdmUgbGl0dGxlIGJpdCBt\n"
- "b3JlIGluZm9ybWF0aW9uIGZvciB0aGlzIG9yIGRvIHlvdSBoYXZlCj4gPj4gICBhbm90aGVyIHN1\n"
- "Z2dlc3Rpb24gZm9yIHRoaXM/Cj4gPj4KPiA+PiAgICBUaGVyZeKAmXMgYW5vdGhlciBzb2x1dGlv\n"
- "biB3aGljaCBtYWtlcyB0aGlzIHNpbXBsZXIgYW5kIEnigJlkIGxpa2UgdG8KPiA+PiAgICBhc2sg\n"
- "eW91ciBvcGluaW9uIGFib3V0IHRoaXMuCj4gPj4gICAgVGhlIHNvbHV0aW9uIGlzIHRvIG1ha2Ug\n"
- "YW4gaGllcmFyY2h5IGJldHdlZW4gTVNJIGFuZCBQQ0kgbm9kZXMgIGFzIGJlbG93Ogo+ID4+IERl\n"
- "dmljZShcX1NCLk1TSVgpIHsKPiA+PiAgICBEZXZpY2UoXF9TQi5QQ0kwKQo+ID4+ICAgIERldmlj\n"
- "ZShcX1NCLlBDSTEpCj4gPj4gICAg4oCm4oCmCj4gPj4gfQo+ID4+ICAgSW4gb3RoZXIgd29yZCwg\n"
- "TVNJWCBub2RlIGlzIGEgcGFyZW50IG5vZGUgb2YgUENJIG5vZGVzIGluIEFDUEkKPiA+PiAgIHRh\n"
- "YmxlLiAgSW4gdGhpcyBzZW5zZSwgdGhlcmXigJlzIGFuIGV4cGxpY2l0IGRlcGVuZGVuY3kgYmV0\n"
- "d2VlbiBNU0kKPiA+PiAgIGFuZCBQQ0ksIE1TSSBjb250cm9sbGVyIG11c3QgYmUgcHJvYmVkIGJl\n"
- "Zm9yZSBQQ0kgYW5kIGl0IHdpbGwKPiA+PiAgIGd1YXJhbnRlZSBub3QgYnJlYWtpbmcgbmV4dCBr\n"
- "ZXJuZWwgcmVsZWFzZXMuICBIb3cgZG8geW91IHRoaW5rIGFib3V0Cj4gPj4gICB0aGlzIHNvbHV0\n"
- "aW9uLgo+ID4KPiA+IEkgdGhpbmsgdGhhdCdzIGEgcGxhc3RlciBhcyBpbmVmZmVjdGl2ZSBhcyBy\n"
- "ZW9yZGVyaW5nIG5vZGVzLCBpbiBzaG9ydAo+ID4gaXQgaXMgbm90IGEgc29sdXRpb24gYW5kIHlv\n"
- "dSBzdGlsbCByZWx5IG9uIGtlcm5lbCBsaW5rIG9yZGVyaW5nLCB5b3UKPiA+IGNhbiBmaWRkbGUg\n"
- "d2l0aCBBQ1BJIHRhYmxlcyBhcyBtdWNoIGFzIHlvdSB3YW50IGJ1dCB0aGF0IGRvZXMgbm90IGNo\n"
- "YW5nZS4KPiA+Cj4gPj4gIEkgYWxzbyB0cmllZCB0byB1c2UgX0RFUCBtZXRob2QgdG8gZGVzY3Jp\n"
- "YmUgdGhlIGRlcGVuZGVuY3kgb2YgUENJZQo+ID4+ICBub2RlcywgYnV0IGl0IGxvb2tzIHRoYXQg\n"
- "aXQgZG9lcyBub3Qgd29yayBhcyBQQ0kgYW5kIE1TSSBhcmUgaGFuZGVkCj4gPj4gIGJ5IGFjcGlf\n"
- "YnVzX3NjYW4gYW5kIHN0aWxsIGhhdmluZyBpc3N1ZSB3aGVuIHdlIHJlLXByb2JlIFBDSS4KPiA+\n"
- "Cj4gPiBUaGF0J3MgYSB0YWQgdmFndWUgdG8gYmUgZnJhbmssIGFueXdheSBpdCBpcyBwcmV0dHkg\n"
- "Y2xlYXIgdG8gbWUgdGhhdCB3ZQo+ID4gaGF2ZSBoaXQgYSB3YWxsLiBJbiBBQ1BJIHRoZXJlIGlz\n"
- "IG5vIHdheSB0byBkZXNjcmliZSBwcm9iZSBkZXBlbmRlbmNpZXMKPiA+IGxpa2UgdGhlIG9uZSB5\n"
- "b3UgaGF2ZSwgaXQgaXMgYXMgc2ltcGxlIGFzIHRoYXQsIGFuZCB0aGlzIE1TSSBpc3N1ZSB5b3UK\n"
- "PiA+IGFyZSBmYWNpbmcgaXMganVzdCBhbiBleGFtcGxlLCB0aGVyZSBhcmUgbW9yZSBlZzoKPiA+\n"
- "Cj4gPiBodHRwczovL3d3dy5zcGluaWNzLm5ldC9saXN0cy9hcm0ta2VybmVsL21zZzU4NTgyNS5o\n"
- "dG1sCj4gPgo+ID4gQXQgdGhlIGVuZCBvZiB0aGUgZGF5IHRoZSBjaG9pY2UgaXMgc2ltcGxlIGVp\n"
- "dGhlciB3ZSBhY2NlcHQgKGFuZCB3ZQo+ID4gbWFpbnRhaW4gYmVjYXVzZSB0aGF0J3MgdGhlIHBy\n"
- "b2JsZW0pIHRoZXNlIGhhY2tzIC0gYW5kIEkgYW0gbm90IHdpbGxpbmcKPiA+IHRvIGRvIHRoYXQg\n"
- "LSBvciB3ZSBmaW5kIGEgd2F5IHRvIHNvbHZlIHRoaXMgZnJvbSBhIGdlbmVyYWwgcGVyc3BlY3Rp\n"
- "dmUgbm90Cj4gPiBhcyBhIHBvaW50IGhhY2suCj4gPgo+ID4gSSBjYW4gaGF2ZSBhIGxvb2sgYXQg\n"
- "c29sdmluZyB0aGUgd2hvbGUgaXNzdWUgYnV0IGl0IHdvbid0IGhhcHBlbgo+ID4gdG9tb3Jyb3cu\n"
- "Cj4gCj4gVGhhbmtzIGZvciBoZWxwaW5nIHRvIHJlc29sdmUgdGhpcyBnZW5lcmFsIEFDUEkgZGVw\n"
- "ZW5kZW5jZSBpc3N1ZS4KPiBJIGxvb2sgZm9yd2FyZCBmb3IgYSB2ZXJzaW9uIHRvIHRlc3Qgd2l0\n"
- "aC4KPiAKPiBDYW4gd2Ugc2VwYXJhdGUgdGhlIGdlbmVyYWwgZGVwZW5kZW5jZSBwYXRjaCBmcm9t\n"
- "IHRoZSBYLUdlbmUgTVNJIEFDUEkKPiBlbmFibGUgcGF0Y2guCj4gVGhpcyBvcmlnaW5hbCBwYXRj\n"
- "aCB3YXMgdG8gZW5hYmxlIEFDUEkgc3VwcG9ydCBmb3IgUENJZSBNU0kuCj4gVGhlIGRlcGVuZGVu\n"
- "Y2UgaXNzdWUgY2FuIGJlIHJlc29sdmVkIHNlcGFyYXRlbHkuCj4gQ2FuIHlvdSBoZWxwIHRvIHB1\n"
- "bGwgaW4gdGhlIHBhdGNoLgoKT2ssIHByYWdtYXRpY2FsbHkgdGhlIG9ubHkgc2FuZSB0aGluZyB5\n"
- "b3UgY2FuIGRvIGlzOgoKKDEpICBBZGQgYW4gWC1nZW5lIHNwZWNpZmljIGhvb2sgaW4gZHJpdmVy\n"
- "cy9hY3BpL3NjYW4uYyAoYWNwaV9zY2FuX2luaXQoKSkKICAgICB0aGF0IGNhcnJpZXMgb3V0IGZ3\n"
- "bm9kZSByZWdpc3RyYXRpb24gKGllIHJlZ2lzdGVyIHRoZSBmd25vZGUgYnkKICAgICBzZWFyY2hp\n"
- "bmcgdGhlIE1TSSBISUQgb2JqZWN0IC0gdGhpcyBkb2VzIG5vdCBkZXBlbmQgb24gQUNQSSBkZXZp\n"
- "Y2UKICAgICBub2RlcyBvcmRlciAtIHlvdSBlbmZvcmNlIHRoZSBvcmRlciBieSBwYXJzaW5nIHRo\n"
- "ZSBuYW1lc3BhY2UgYmVmb3JlCiAgICAgQUNQSSBjb3JlIGRvZXMgaXQsIGF0IHRoYXQgcG9pbnQg\n"
- "aW4gdGltZSBBQ1BJIG9iamVjdHMgYXJlIGNyZWF0ZWQpLgogICAgIE5vdCBzdXJlIFJhZmFlbCB3\n"
- "aWxsIGJlIGhhcHB5IHRvIHNlZSB0aGlzIGNvZGUgYnV0IHRoYXQncyB0aGUgb25seQogICAgIHNv\n"
- "bHV0aW9uIHRoYXQgZG9lcyBub3QgcmVseSBvbiBBQ1BJIGRldmljZSBub2RlcyBvcmRlcmluZyBh\n"
- "bmQga2VybmVsCiAgICAgbGluayBvcmRlcmluZy4gWW91IG1heSBhY2hpZXZlIHRoZSBzYW1lIGJ5\n"
- "IGV4dGVuZGluZyB0aGUgQUNQSSBBUEQKICAgICBjb2RlIChkcml2ZXJzL2FjcGkvYWNwaV9hcGQu\n"
- "Yykgd2hldGhlciB0aGF0J3MgdGhlIGJlc3Qgd2F5IGZvcndhcmQgaXMKICAgICB0byBiZSBzZWVu\n"
- "LgoKKDIpICBZb3UgY2FuIGFsc28gYWRkIGFuIHhnZW5lIHNwZWNpZmljIHNjYW4gaGFuZGxlciBh\n"
- "dCBhcmNoX2luaXRfY2FsbCgpCiAgICAgYnV0IGdpdmVuIHRoYXQgUENJIHJvb3QgYnJpZGdlIGlz\n"
- "IG1hbmFnZWQgdGhyb3VnaCBhIHNjYW4gaGFuZGxlciB0b28geW91CiAgICAgd291bGQgcmVseSBv\n"
- "biBBQ1BJIGRldmljZXMgbm9kZXMgb3JkZXJpbmcgaW4gdGhlIERTRFQuIExldCBtZSBleHBsYWlu\n"
- "CiAgICAgc29tZXRoaW5nIGZvciB0aGUgYmVuZWZpdCBvZiBldmVyeW9uZSByZWFkaW5nIHRoaXMg\n"
- "dGhyZWFkOiBJIGRvIG5vdCB3YW50CiAgICAgWC1nZW5lIEFDUEkgdGFibGVzIHRvIGZvcmNlIHRo\n"
- "ZSBrZXJuZWwgdG8gc2NhbiBkZXZpY2VzIGluIGFueSBvcmRlcgogICAgIHdoYXRzb3ZlciBiZWNh\n"
- "dXNlIHRoaXMgd291bGQgbWVhbiB3ZSB3aWxsIF9uZXZlcl8gYmUgYWJsZSB0byBjaGFuZ2UgdGhl\n"
- "CiAgICAgc2NhbiBvcmRlciBpZiB3ZSB3YW50ZWQgdG8gbGVzdCB3ZSB0cmlnZ2VyIHJlZ3Jlc3Np\n"
- "b25zLiBTbyB0aGlzIGlzCiAgICAgYSBub24tb3B0aW9uIGluIG15IG9waW5pb24uCgooMykgTGFz\n"
- "dCBvcHRpb24gaXMgdG8gcmVnaXN0ZXIgdGhlIE1TSSBmd25vZGUgZWl0aGVyIGluIFBDSSBFQ0FN\n"
- "IHF1aXJrCiAgICBoYW5kbGluZyBvciBpbiBhcm02NCBiZWZvcmUgcHJvYmluZyB0aGUgUENJIHJv\n"
- "b3QgYnVzLgoKSSBhbSBub3Qga2VlbiBvbiAoMikgYW5kICgzKSBhdCBhbGwsIHNvIF9pZl8gd2Ug\n"
- "aGF2ZSB0byBmaW5kIGEgc29sdXRpb24KdG8gdGhpcyBwcm9ibGVtICgxKSBpcyB0aGUgb25seSBv\n"
- "cHRpb24geW91IGhhdmUgZm9yIHRoZSB0aW1lIGJlaW5nIGFzCmZhciBhcyBJIGFtIGNvbmNlcm5l\n"
- "ZC4KCkxvcmVuem8KCj4gCj4gQmVzdCByZWdhcmRzLAo+IEtodW9uZyBEaW5oCj4gCj4gPiBUaGFu\n"
- "a3MsCj4gPiBMb3JlbnpvCj4gPgo+ID4+IFRoYW5rcywKPiA+PiBLaHVvbmcgRGluaAo+ID4+Cj4g\n"
- "Pj4gPj4gRmluYWxseSwgcGxlYXNlIGV4ZWN1dGUgdGhpcyBjb21tYW5kIG9uIHRoZSB2bWxpbnV4\n"
- "IHRoYXQgIndvcmtzIgo+ID4+ID4+IGZvciB5b3U6Cj4gPj4gPj4KPiA+PiA+PiBubSB2bWxpbnV4\n"
- "IHwgZ3JlcCAtRSAnX19pbml0Y2FsbF8oeGdlbmVfcGNpZV9tc2lfaW5pdHxhY3BpX2luaXQpJwo+\n"
- "ID4+ID4KPiA+PiA+ICQgbm0gdm1saW51eCB8IGdyZXAgLUUgJ19faW5pdGNhbGxfKHhnZW5lX3Bj\n"
- "aWVfbXNpX2luaXR8YWNwaV9pbml0KScKPiA+PiA+IGZmZmYwMDAwMDhkYWIyZDggdCBfX2luaXRj\n"
- "YWxsX2FjcGlfaW5pdDQKPiA+PiA+IGZmZmYwMDAwMDhkYWIyYzggdCBfX2luaXRjYWxsX3hnZW5l\n"
- "X3BjaWVfbXNpX2luaXQ0Cj4gPj4gPgo+ID4+ID4gQmVzdCByZWdhcmRzLAo+ID4+ID4gS2h1b25n\n"
- "IERpbmgKPiA+PiA+Cj4gPj4gPj4gRXZlbiBieSBvcmRlcmluZyBkZXZpY2VzIGluIHRoZSBBQ1BJ\n"
- "IHRhYmxlcyAodGhhdCBJIGFiaG9yKSBJIHN0aWxsIGRvCj4gPj4gPj4gbm90IHVuZGVyc3RhbmQg\n"
- "aG93IHRoaXMgd29ya3MgKEkgbWVhbiB3aXRob3V0IHJlbHlpbmcgb24ga2VybmVsIGxpbmsKPiA+\n"
- "PiA+PiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgTVNJIGRyaXZlciBpcyBwcm9iZWQgYmVmb3Jl\n"
- "IFBDSSBkZXZpY2VzIGFyZQo+ID4+ID4+IGVudW1lcmF0ZWQgaW4gYWNwaV9pbml0KCkpLgo+ID4+\n"
- "ID4+Cj4gPj4gPj4gVGhhbmtzLAo+ID4+ID4+IExvcmVuem8KPiA+PiA+Pgo+ID4+ID4+PiBCZXN0\n"
- "IHJlZ2FyZHMsCj4gPj4gPj4+IEtodW9uZwo+ID4+ID4+Pgo+ID4+ID4+PiBPbiBGcmksIEFwciAy\n"
- "OCwgMjAxNyBhdCAyOjI3IEFNLCBNYXJjIFp5bmdpZXIgPG1hcmMuenluZ2llckBhcm0uY29tPiB3\n"
- "cm90ZToKPiA+PiA+Pj4gPiBPbiAyOC8wNC8xNyAwMTo1NCwgS2h1b25nIERpbmggd3JvdGU6Cj4g\n"
- "Pj4gPj4+ID4+IEZyb206IEtodW9uZyBEaW5oIDxrZGluaEBhcG0uY29tPgo+ID4+ID4+PiA+Pgo+\n"
- "ID4+ID4+PiA+PiBUaGlzIHBhdGNoIG1ha2VzIHBjaS14Z2VuZS1tc2kgZHJpdmVyIEFDUEktYXdh\n"
- "cmUgYW5kIHByb3ZpZGVzCj4gPj4gPj4+ID4+IE1TSSBjYXBhYmlsaXR5IGZvciBYLUdlbmUgdjEg\n"
- "UENJZSBjb250cm9sbGVycyBpbiBBQ1BJIGJvb3QgbW9kZS4KPiA+PiA+Pj4gPj4KPiA+PiA+Pj4g\n"
- "Pj4gU2lnbmVkLW9mZi1ieTogS2h1b25nIERpbmggPGtkaW5oQGFwbS5jb20+Cj4gPj4gPj4+ID4+\n"
- "IFNpZ25lZC1vZmYtYnk6IER1YyBEYW5nIDxkaGRhbmdAYXBtLmNvbT4KPiA+PiA+Pj4gPj4gQWNr\n"
- "ZWQtYnk6IE1hcmMgWnluZ2llciA8bWFyYy56eW5naWVyQGFybS5jb20+Cj4gPj4gPj4+ID4+IC0t\n"
- "LQo+ID4+ID4+PiA+PiB2MjoKPiA+PiA+Pj4gPj4gIC0gVmVyaWZ5IHdpdGggQklPUyB2ZXJzaW9u\n"
- "IDMuMDYuMjUgYW5kIDMuMDcuMDkKPiA+PiA+Pj4gPj4gdjE6Cj4gPj4gPj4+ID4+ICAtIEluaXRp\n"
- "YWwgdmVyc2lvbgo+ID4+ID4+PiA+PiAtLS0KPiA+PiA+Pj4gPj4gIGRyaXZlcnMvcGNpL2hvc3Qv\n"
- "cGNpLXhnZW5lLW1zaS5jIHwgICAzNSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0t\n"
- "LQo+ID4+ID4+PiA+PiAgMSBmaWxlcyBjaGFuZ2VkLCAzMiBpbnNlcnRpb25zKCspLCAzIGRlbGV0\n"
- "aW9ucygtKQo+ID4+ID4+PiA+Pgo+ID4+ID4+PiA+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kv\n"
- "aG9zdC9wY2kteGdlbmUtbXNpLmMgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS14Z2VuZS1tc2kuYwo+\n"
- "ID4+ID4+PiA+PiBpbmRleCBmMWI2MzNiLi4wMGFhYTNkIDEwMDY0NAo+ID4+ID4+PiA+PiAtLS0g\n"
- "YS9kcml2ZXJzL3BjaS9ob3N0L3BjaS14Z2VuZS1tc2kuYwo+ID4+ID4+PiA+PiArKysgYi9kcml2\n"
- "ZXJzL3BjaS9ob3N0L3BjaS14Z2VuZS1tc2kuYwo+ID4+ID4+PiA+PiBAQCAtMjQsNiArMjQsNyBA\n"
- "QAo+ID4+ID4+PiA+PiAgI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgo+ID4+ID4+PiA+PiAgI2luY2x1\n"
- "ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ID4+ID4+PiA+PiAgI2luY2x1ZGUgPGxpbnV4\n"
- "L29mX3BjaS5oPgo+ID4+ID4+PiA+PiArI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KPiA+PiA+Pj4g\n"
- "Pj4KPiA+PiA+Pj4gPj4gICNkZWZpbmUgTVNJX0lSMCAgICAgICAgICAgICAgICAgICAgICAweDAw\n"
- "MDAwMAo+ID4+ID4+PiA+PiAgI2RlZmluZSBNU0lfSU5UMCAgICAgICAgICAgICAweDgwMDAwMAo+\n"
- "ID4+ID4+PiA+PiBAQCAtMzksNyArNDAsNyBAQCBzdHJ1Y3QgeGdlbmVfbXNpX2dyb3VwIHsKPiA+\n"
- "PiA+Pj4gPj4gIH07Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+ICBzdHJ1Y3QgeGdlbmVfbXNpIHsK\n"
- "PiA+PiA+Pj4gPj4gLSAgICAgc3RydWN0IGRldmljZV9ub2RlICAgICAgKm5vZGU7Cj4gPj4gPj4+\n"
- "ID4+ICsgICAgIHN0cnVjdCBmd25vZGVfaGFuZGxlICAgICpmd25vZGU7Cj4gPj4gPj4+ID4+ICAg\n"
- "ICAgIHN0cnVjdCBpcnFfZG9tYWluICAgICAgICppbm5lcl9kb21haW47Cj4gPj4gPj4+ID4+ICAg\n"
- "ICAgIHN0cnVjdCBpcnFfZG9tYWluICAgICAgICptc2lfZG9tYWluOwo+ID4+ID4+PiA+PiAgICAg\n"
- "ICB1NjQgICAgICAgICAgICAgICAgICAgICBtc2lfYWRkcjsKPiA+PiA+Pj4gPj4gQEAgLTI0OSw2\n"
- "ICsyNTAsMTMgQEAgc3RhdGljIHZvaWQgeGdlbmVfaXJxX2RvbWFpbl9mcmVlKHN0cnVjdCBpcnFf\n"
- "ZG9tYWluICpkb21haW4sCj4gPj4gPj4+ID4+ICAgICAgIC5mcmVlICAgPSB4Z2VuZV9pcnFfZG9t\n"
- "YWluX2ZyZWUsCj4gPj4gPj4+ID4+ICB9Owo+ID4+ID4+PiA+Pgo+ID4+ID4+PiA+PiArI2lmZGVm\n"
- "IENPTkZJR19BQ1BJCj4gPj4gPj4+ID4+ICtzdGF0aWMgc3RydWN0IGZ3bm9kZV9oYW5kbGUgKnhn\n"
- "ZW5lX21zaV9nZXRfZndub2RlKHN0cnVjdCBkZXZpY2UgKmRldikKPiA+PiA+Pj4gPj4gK3sKPiA+\n"
- "PiA+Pj4gPj4gKyAgICAgcmV0dXJuIHhnZW5lX21zaV9jdHJsLmZ3bm9kZTsKPiA+PiA+Pj4gPj4g\n"
- "K30KPiA+PiA+Pj4gPj4gKyNlbmRpZgo+ID4+ID4+PiA+PiArCj4gPj4gPj4+ID4+ICBzdGF0aWMg\n"
- "aW50IHhnZW5lX2FsbG9jYXRlX2RvbWFpbnMoc3RydWN0IHhnZW5lX21zaSAqbXNpKQo+ID4+ID4+\n"
- "PiA+PiAgewo+ID4+ID4+PiA+PiAgICAgICBtc2ktPmlubmVyX2RvbWFpbiA9IGlycV9kb21haW5f\n"
- "YWRkX2xpbmVhcihOVUxMLCBOUl9NU0lfVkVDLAo+ID4+ID4+PiA+PiBAQCAtMjU2LDcgKzI2NCw3\n"
- "IEBAIHN0YXRpYyBpbnQgeGdlbmVfYWxsb2NhdGVfZG9tYWlucyhzdHJ1Y3QgeGdlbmVfbXNpICpt\n"
- "c2kpCj4gPj4gPj4+ID4+ICAgICAgIGlmICghbXNpLT5pbm5lcl9kb21haW4pCj4gPj4gPj4+ID4+\n"
- "ICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+IC0g\n"
- "ICAgIG1zaS0+bXNpX2RvbWFpbiA9IHBjaV9tc2lfY3JlYXRlX2lycV9kb21haW4ob2Zfbm9kZV90\n"
- "b19md25vZGUobXNpLT5ub2RlKSwKPiA+PiA+Pj4gPj4gKyAgICAgbXNpLT5tc2lfZG9tYWluID0g\n"
- "cGNpX21zaV9jcmVhdGVfaXJxX2RvbWFpbihtc2ktPmZ3bm9kZSwKPiA+PiA+Pj4gPj4gICAgICAg\n"
- "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGdlbmVfbXNpX2Rv\n"
- "bWFpbl9pbmZvLAo+ID4+ID4+PiA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
- "ICAgICAgICAgICAgICAgIG1zaS0+aW5uZXJfZG9tYWluKTsKPiA+PiA+Pj4gPj4KPiA+PiA+Pj4g\n"
- "Pj4gQEAgLTI2NSw2ICsyNzMsOSBAQCBzdGF0aWMgaW50IHhnZW5lX2FsbG9jYXRlX2RvbWFpbnMo\n"
- "c3RydWN0IHhnZW5lX21zaSAqbXNpKQo+ID4+ID4+PiA+PiAgICAgICAgICAgICAgIHJldHVybiAt\n"
- "RU5PTUVNOwo+ID4+ID4+PiA+PiAgICAgICB9Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+ICsjaWZk\n"
- "ZWYgQ09ORklHX0FDUEkKPiA+PiA+Pj4gPj4gKyAgICAgcGNpX21zaV9yZWdpc3Rlcl9md25vZGVf\n"
- "cHJvdmlkZXIoJnhnZW5lX21zaV9nZXRfZndub2RlKTsKPiA+PiA+Pj4gPj4gKyNlbmRpZgo+ID4+\n"
- "ID4+PiA+PiAgICAgICByZXR1cm4gMDsKPiA+PiA+Pj4gPj4gIH0KPiA+PiA+Pj4gPj4KPiA+PiA+\n"
- "Pj4gPj4gQEAgLTQ0OSw2ICs0NjAsMTMgQEAgc3RhdGljIGludCB4Z2VuZV9tc2lfaHdpcnFfZnJl\n"
- "ZSh1bnNpZ25lZCBpbnQgY3B1KQo+ID4+ID4+PiA+PiAgICAgICB7fSwKPiA+PiA+Pj4gPj4gIH07\n"
- "Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+ICsjaWZkZWYgQ09ORklHX0FDUEkKPiA+PiA+Pj4gPj4g\n"
- "K3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgeGdlbmVfbXNpX2FjcGlfaWRzW10g\n"
- "PSB7Cj4gPj4gPj4+ID4+ICsgICAgIHsiQVBNQzBEMEUiLCAwfSwKPiA+PiA+Pj4gPj4gKyAgICAg\n"
- "eyB9LAo+ID4+ID4+PiA+PiArfTsKPiA+PiA+Pj4gPj4gKyNlbmRpZgo+ID4+ID4+PiA+PiArCj4g\n"
- "Pj4gPj4+ID4+ICBzdGF0aWMgaW50IHhnZW5lX21zaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2\n"
- "aWNlICpwZGV2KQo+ID4+ID4+PiA+PiAgewo+ID4+ID4+PiA+PiAgICAgICBzdHJ1Y3QgcmVzb3Vy\n"
- "Y2UgKnJlczsKPiA+PiA+Pj4gPj4gQEAgLTQ2OSw3ICs0ODcsMTcgQEAgc3RhdGljIGludCB4Z2Vu\n"
- "ZV9tc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+PiA+Pj4gPj4gICAg\n"
- "ICAgICAgICAgICBnb3RvIGVycm9yOwo+ID4+ID4+PiA+PiAgICAgICB9Cj4gPj4gPj4+ID4+ICAg\n"
- "ICAgIHhnZW5lX21zaS0+bXNpX2FkZHIgPSByZXMtPnN0YXJ0Owo+ID4+ID4+PiA+PiAtICAgICB4\n"
- "Z2VuZV9tc2ktPm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKPiA+PiA+Pj4gPj4gKwo+ID4+ID4+\n"
- "PiA+PiArICAgICB4Z2VuZV9tc2ktPmZ3bm9kZSA9IG9mX25vZGVfdG9fZndub2RlKHBkZXYtPmRl\n"
- "di5vZl9ub2RlKTsKPiA+PiA+Pj4gPj4gKyAgICAgaWYgKCF4Z2VuZV9tc2ktPmZ3bm9kZSkgewo+\n"
- "ID4+ID4+PiA+PiArICAgICAgICAgICAgIHhnZW5lX21zaS0+Zndub2RlID0gaXJxX2RvbWFpbl9h\n"
- "bGxvY19md25vZGUoTlVMTCk7Cj4gPj4gPj4+ID4KPiA+PiA+Pj4gPiBQbGVhc2UgcHJvdmlkZSBz\n"
- "b21ldGhpbmcgb3RoZXIgdGhhbiBOVUxMLCBzdWNoIGFzIHRoZSBiYXNlIGFkZHJlc3MgaWYKPiA+\n"
- "PiA+Pj4gPiB0aGUgZGV2aWNlLiBUaGF0J3MgcXVpdGUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCj4g\n"
- "Pj4gPj4+ID4KPiA+PiA+Pj4gPj4gKyAgICAgICAgICAgICBpZiAoIXhnZW5lX21zaS0+Zndub2Rl\n"
- "KSB7Cj4gPj4gPj4+ID4+ICsgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZwZGV2LT5kZXYs\n"
- "ICJGYWlsZWQgdG8gY3JlYXRlIGZ3bm9kZVxuIik7Cj4gPj4gPj4+ID4+ICsgICAgICAgICAgICAg\n"
- "ICAgICAgICByYyA9IEVOT01FTTsKPiA+PiA+Pj4gPj4gKyAgICAgICAgICAgICAgICAgICAgIGdv\n"
- "dG8gZXJyb3I7Cj4gPj4gPj4+ID4+ICsgICAgICAgICAgICAgfQo+ID4+ID4+PiA+PiArICAgICB9\n"
- "Cj4gPj4gPj4+ID4+ICsKPiA+PiA+Pj4gPj4gICAgICAgeGdlbmVfbXNpLT5udW1fY3B1cyA9IG51\n"
- "bV9wb3NzaWJsZV9jcHVzKCk7Cj4gPj4gPj4+ID4+Cj4gPj4gPj4+ID4+ICAgICAgIHJjID0geGdl\n"
- "bmVfbXNpX2luaXRfYWxsb2NhdG9yKHhnZW5lX21zaSk7Cj4gPj4gPj4+ID4+IEBAIC01NDAsNiAr\n"
- "NTY4LDcgQEAgc3RhdGljIGludCB4Z2VuZV9tc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj\n"
- "ZSAqcGRldikKPiA+PiA+Pj4gPj4gICAgICAgLmRyaXZlciA9IHsKPiA+PiA+Pj4gPj4gICAgICAg\n"
- "ICAgICAgICAubmFtZSA9ICJ4Z2VuZS1tc2kiLAo+ID4+ID4+PiA+PiAgICAgICAgICAgICAgIC5v\n"
- "Zl9tYXRjaF90YWJsZSA9IHhnZW5lX21zaV9tYXRjaF90YWJsZSwKPiA+PiA+Pj4gPj4gKyAgICAg\n"
- "ICAgICAgICAuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKHhnZW5lX21zaV9hY3BpX2lkcyks\n"
- "Cj4gPj4gPj4+ID4+ICAgICAgIH0sCj4gPj4gPj4+ID4+ICAgICAgIC5wcm9iZSA9IHhnZW5lX21z\n"
- "aV9wcm9iZSwKPiA+PiA+Pj4gPj4gICAgICAgLnJlbW92ZSA9IHhnZW5lX21zaV9yZW1vdmUsCj4g\n"
- "Pj4gPj4+ID4+Cj4gPj4gPj4+ID4KPiA+PiA+Pj4gPiBUaGUgY29kZSBpcyB0cml2aWFsLCBidXQg\n"
- "cmVsaWVzIG9uIHRoZSBNU0kgY29udHJvbGxlciB0byBwcm9iZSBiZWZvcmUKPiA+PiA+Pj4gPiB0\n"
- "aGUgUENJIGJ1cy4gV2hhdCBlbmZvcmNlcyB0aGlzPyBIb3cgaXMgaXQgbWFraW5nIHN1cmUgdGhh\n"
- "dCB0aGlzIGlzIG5vdAo+ID4+ID4+PiA+IGdvaW5nIHRvIGJyZWFrIGluIHRoZSBuZXh0IGtlcm5l\n"
- "bCByZWxlYXNlPyBBcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGhlcmUKPiA+PiA+Pj4gPiBpcyBubyBl\n"
- "eHBsaWNpdCBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIHR3bywgbWFraW5nIGl0IHRoZSB3aG9sZSB0\n"
- "aGluZwo+ID4+ID4+PiA+IGV4dHJlbWVseSBmcmFnaWxlLgo+ID4+ID4+PiA+Cj4gPj4gPj4+ID4g\n"
- "VGhhbmtzLAo+ID4+ID4+PiA+Cj4gPj4gPj4+ID4gICAgICAgICBNLgo+ID4+ID4+PiA+IC0tCj4g\n"
- "Pj4gPj4+ID4gSmF6eiBpcyBub3QgZGVhZC4gSXQganVzdCBzbWVsbHMgZnVubnkuLi4KPiA+PiA+\n"
- "Pj4KPiA+PiA+Pj4gLS0KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f\n"
- "X19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlz\n"
- "dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp\n"
- bmZvL2xpbnV4LWFybS1rZXJuZWwK
+ "On Tue, Jun 13, 2017 at 01:56:44PM -0700, Khuong Dinh wrote:\n"
+ "> Hi Lorenzo,\n"
+ "> \n"
+ "> On Thu, Jun 8, 2017 at 3:39 AM, Lorenzo Pieralisi\n"
+ "> <lorenzo.pieralisi@arm.com> wrote:\n"
+ "> > 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 for helping to resolve this general ACPI dependence issue.\n"
+ "> I look forward for a version to test with.\n"
+ "> \n"
+ "> Can we separate the general dependence patch from the X-Gene MSI ACPI\n"
+ "> enable patch.\n"
+ "> This original patch was to enable ACPI support for PCIe MSI.\n"
+ "> The dependence issue can be resolved separately.\n"
+ "> Can you help to pull in the patch.\n"
+ "\n"
+ "Ok, pragmatically the only sane thing you can do is:\n"
+ "\n"
+ "(1)  Add an X-gene specific hook in drivers/acpi/scan.c (acpi_scan_init())\n"
+ "     that carries out fwnode registration (ie register the fwnode by\n"
+ "     searching the MSI HID object - this does not depend on ACPI device\n"
+ "     nodes order - you enforce the order by parsing the namespace before\n"
+ "     ACPI core does it, at that point in time ACPI objects are created).\n"
+ "     Not sure Rafael will be happy to see this code but that's the only\n"
+ "     solution that does not rely on ACPI device nodes ordering and kernel\n"
+ "     link ordering. You may achieve the same by extending the ACPI APD\n"
+ "     code (drivers/acpi/acpi_apd.c) whether that's the best way forward is\n"
+ "     to be seen.\n"
+ "\n"
+ "(2)  You can also add an xgene specific scan handler at arch_init_call()\n"
+ "     but given that PCI root bridge is managed through a scan handler too you\n"
+ "     would rely on ACPI devices nodes ordering in the DSDT. Let me explain\n"
+ "     something for the benefit of everyone reading this thread: I do not want\n"
+ "     X-gene ACPI tables to force the kernel to scan devices in any order\n"
+ "     whatsover because this would mean we will _never_ be able to change the\n"
+ "     scan order if we wanted to lest we trigger regressions. So this is\n"
+ "     a non-option in my opinion.\n"
+ "\n"
+ "(3) Last option is to register the MSI fwnode either in PCI ECAM quirk\n"
+ "    handling or in arm64 before probing the PCI root bus.\n"
+ "\n"
+ "I am not keen on (2) and (3) at all, so _if_ we have to find a solution\n"
+ "to this problem (1) is the only option you have for the time being as\n"
+ "far as I am concerned.\n"
+ "\n"
+ "Lorenzo\n"
+ "\n"
+ "> \n"
+ "> Best regards,\n"
+ "> Khuong Dinh\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"
+ > >> >>> --
 
-62f65ce8dfab3089e42d79c7f06a13fcbe45e6a6967764201998925935138264
+40bccffe286ea6ab5ebc4d68a0cee6be5ac3ecf8c29ba2c217f422c037e18cdd

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.