From mboxrd@z Thu Jan 1 00:00:00 1970 From: "majun (Euler7)" Subject: Re: [Update][PATCH v9.1 15/15] irqchip: mbigen: Add ACPI support Date: Tue, 28 Mar 2017 20:30:27 +0800 Message-ID: <58DA5763.4060509@huawei.com> References: <1490703665-4932-1-git-send-email-hanjun.guo@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset="gbk" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1490703665-4932-1-git-send-email-hanjun.guo@linaro.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: Hanjun Guo , Marc Zyngier , "Rafael J. Wysocki" , Lorenzo Pieralisi Cc: Kefeng Wang , yimin@huawei.com, linuxarm@huawei.com, linux-kernel@vger.kernel.org, huxinwei@huawei.com, linux-acpi@vger.kernel.org, Darren Hart , Thomas Gleixner , Al Stone , linux-arm-kernel@lists.infradead.org, majun258@huawei.com List-Id: linux-acpi@vger.kernel.org SGkgaGFuanVuOgoJVGhpcyBwYXRjaCB3b3JrcyBmaW5lIG9uIG15IEQwNSBib2FyZC4KClRlc3Rl ZC1ieTogTWFKdW4gPG1hanVuMjU4QGh1YXdlaS5jb20+CgpCZXN0IFJlZ2FyZHMKTWFqdW4KCtTa IDIwMTcvMy8yOCAyMDoyMSwgSGFuanVuIEd1byDQtLXAOgo+IFdpdGggdGhlIHByZXBhcmF0aW9u IG9mIHBsYXRmb3JtIG1zaSBzdXBwb3J0IGFuZCBpbnRlcnJ1cHQgcHJvZHVjZXIKPiBpbiBjb21t aXQgZDQ0ZmEzZDQ2MDc5ICgiQUNQSTogQWRkIHN1cHBvcnQgZm9yIFJlc291cmNlU291cmNlL0lS UQo+IGRvbWFpbiBtYXBwaW5nIiksIHdlIGNhbiBhZGQgbWJpZ2VuIEFDUEkgc3VwcG9ydCBub3cu Cj4gCj4gTm93IHRoYXQgdGhlIG1ham9yIGZyYW1ld29yayBjaGFuZ2VzIGFyZSByZWFkeSwgd2Ug anVzdCBuZWVkIHRvIGFkZAo+IHRoZSBBQ1BJIHByb2JlIGNvZGUgd2hpY2ggY3JlYXRlcyB0aGUg aXJxZG9tYWluIGZvciBkZXZpY2VzIGNvbm5lY3RpbmcKPiB0byBpdC4KPiAKPiBJbiBvcmRlciB0 byBjcmVhdGUgdGhlIGlycWRvbWFpbiwgd2UgbmVlZCB0byBrbm93IHRoZSBudW1iZXIgb2YgaHcK PiBpcnFzIGFzIGlucHV0IHdoaWNoIGlzIHByb3ZpZGVkIGJ5IG1iaWdlbi4gSW4gRFQgY2FzZSwg d2UgYXJlIHVzaW5nCj4gIm51bS1waW5zIiBwcm9wZXJ0eSB0byBkZXNjcmliZSBpdCwgYW5kIHdl IHdpbGwgdGFrZSBhZHZhbnRhZ2Ugb2YKPiB0aGF0IHRvbyB1c2luZyBfRFNEIGluIEFDUEkgYXMg dGhlcmUgaXMgbm8gc3RhbmRhcmQgd2F5IG9mIGRlc2NyaWJlCj4gaXQgaW4gQUNQSSB3YXksIGFs c28gYWNjb3JkaW5nIHRvIHRoZSBfRFNEIHJ1bGUgZGVzY3JpYmVkIGluCj4gRG9jdW1lbnRhdGlv bi9hY3BpL0RTRC1wcm9wZXJ0aWVzLXJ1bGVzLnR4dCwgaXQgZG9lc24ndCBicmVhawo+IHRoZSBy dWxlcy4KPiAKPiBUaGUgRFNEVCBpcyByZXByZXNlbnRlZCBhcyBiZWxvdzoKPiAKPiBGb3IgbWJp Z2VuLAo+ICAgRGV2aWNlKE1CSTApIHsKPiAgICAgICAgICAgTmFtZShfSElELCAiSElTSTAxNTIi KQo+ICAgICAgICAgICBOYW1lKF9VSUQsIFplcm8pCj4gICAgICAgICAgIE5hbWUoX0NSUywgUmVz b3VyY2VUZW1wbGF0ZSgpIHsKPiAgICAgICAgICAgICAgICAgICBNZW1vcnkzMkZpeGVkKFJlYWRX cml0ZSwgMHhhMDA4MDAwMCwgMHgxMDAwMCkKPiAgICAgICAgICAgfSkKPiAKPiAgICAgICAgICBO YW1lKF9EU0QsIFBhY2thZ2UgKCkgewo+ICAgICAgICAgICAgICAgICAgVG9VVUlEKCJkYWZmZDgx NC02ZWJhLTRkOGMtOGE5MS1iYzliYmY0YWEzMDEiKSwKPiAgICAgICAgICAgICAgICAgIFBhY2th Z2UgKCkgewo+ICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlICgpIHsibnVtLXBpbnMi LCAzNzh9Cj4gICAgICAgICAgICAgICAgICB9Cj4gICAgICAgICB9KQo+ICB9Cj4gCj4gRm9yIGRl dmljZXMsCj4gIERldmljZShTQVMwKSB7Cj4gICAgICAgICAgTmFtZShfSElELCAiSElTSXh4eHgi KQo+ICAgICAgICAgIE5hbWUoX1VJRCwgWmVybykKPiAgICAgICAgICBOYW1lKF9DUlMsIFJlc291 cmNlVGVtcGxhdGUoKSB7Cj4gICAgICAgICAgICAgICAgICBNZW1vcnkzMkZpeGVkKFJlYWRXcml0 ZSwgMHhiMDAzMDAwMCwgMHgxMDAwMCkKPiAJCSBJbnRlcnJ1cHQoUmVzb3VyY2VDb25zdW1lciwu Li4sICJcX1NCLk1CSTAiKSB7MTIsIC4uLn0KPiAgICAgICAgICB9KQo+ICB9Cj4gCj4gU28gZm9y IHRoZSBkZXZpY2VzIGNvbm5lY3RlZCB0byB0aGUgbWJpZ2VuLCBhcyB3ZSBjbGVhcmx5IHNheSB0 aGF0Cj4gaXQgcmVmZXJzIHRvIGEgc3BlY2lmaWMgaW50ZXJydXB0IGNvbnRyb2xsZXIgKG1iaWdl biksIHdlIGNhbiBnZXQKPiB0aGUgdmlycSBmcm9tIG1iaWdlbidzIGlycWRvbWFpbiBvbmNlIGl0 J3MgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCj4gCj4gU2lnbmVkLW9mZi1ieTogSGFuanVuIEd1byA8 aGFuanVuLmd1b0BsaW5hcm8ub3JnPgo+IFNpZ25lZC1vZmYtYnk6IE1hSnVuIDxtYWp1bjI1OEBo dWF3ZWkuY29tPgo+IENjOiBBbCBTdG9uZSA8YWhzM0ByZWRoYXQuY29tPgo+IENjOiBEYXJyZW4g SGFydCA8ZHZoYXJ0QGluZnJhZGVhZC5vcmc+Cj4gQ2M6IExvcmVuem8gUGllcmFsaXNpIDxsb3Jl bnpvLnBpZXJhbGlzaUBhcm0uY29tPgo+IENjOiBNYXJjIFp5bmdpZXIgPG1hcmMuenluZ2llckBh cm0uY29tPgo+IC0tLQo+ICBkcml2ZXJzL2lycWNoaXAvaXJxLW1iaWdlbi5jIHwgNzUgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0KPiAgMSBmaWxlIGNoYW5nZWQs IDcyIGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvaXJxY2hpcC9pcnEtbWJpZ2VuLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW1iaWdlbi5jCj4g aW5kZXggMzc1NjQwOC4uMDYxY2RiOCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJx LW1iaWdlbi5jCj4gKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1tYmlnZW4uYwo+IEBAIC0xNiw2 ICsxNiw3IEBACj4gICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0 dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lgo+ICAgKi8KPiAgCj4gKyNpbmNsdWRlIDxsaW51 eC9hY3BpLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KPiAgI2luY2x1ZGUgPGxp bnV4L2lycWNoaXAuaD4KPiAgI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+IEBAIC0xODAsNyAr MTgxLDcgQEAgc3RhdGljIGludCBtYmlnZW5fZG9tYWluX3RyYW5zbGF0ZShzdHJ1Y3QgaXJxX2Rv bWFpbiAqZCwKPiAgCQkJCSAgICB1bnNpZ25lZCBsb25nICpod2lycSwKPiAgCQkJCSAgICB1bnNp Z25lZCBpbnQgKnR5cGUpCj4gIHsKPiAtCWlmIChpc19vZl9ub2RlKGZ3c3BlYy0+Zndub2RlKSkg ewo+ICsJaWYgKGlzX29mX25vZGUoZndzcGVjLT5md25vZGUpIHx8IGlzX2FjcGlfZGV2aWNlX25v ZGUoZndzcGVjLT5md25vZGUpKSB7Cj4gIAkJaWYgKGZ3c3BlYy0+cGFyYW1fY291bnQgIT0gMikK PiAgCQkJcmV0dXJuIC1FSU5WQUw7Cj4gIAo+IEBAIC0yNzEsNiArMjcyLDU4IEBAIHN0YXRpYyBp bnQgbWJpZ2VuX29mX2NyZWF0ZV9kb21haW4oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwK PiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+ICsjaWZkZWYgQ09ORklHX0FDUEkKPiArc3RhdGljIGlu dCBtYmlnZW5fYWNwaV9jcmVhdGVfZG9tYWluKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYs Cj4gKwkJCQkgICAgIHN0cnVjdCBtYmlnZW5fZGV2aWNlICptZ25fY2hpcCkKPiArewo+ICsJc3Ry dWN0IGlycV9kb21haW4gKmRvbWFpbjsKPiArCXUzMiBudW1fcGlucyA9IDA7Cj4gKwlpbnQgcmV0 Owo+ICsKPiArCS8qCj4gKwkgKiAibnVtLXBpbnMiIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgaW50 ZXJydXB0IHBpbnMgaW1wbGVtZW50ZWQgaW4KPiArCSAqIHRoaXMgbWJpZ2VuIGluc3RhbmNlLCBh bmQgbWJpZ2VuIGlzIGFuIGludGVycnVwdCBjb250cm9sbGVyCj4gKwkgKiBjb25uZWN0ZWQgdG8g SVRTICBjb252ZXJ0aW5nIHdpcmVkIGludGVycnVwdHMgaW50byBNU0ksIHNvIHdlCj4gKwkgKiB1 c2UgIm51bS1waW5zIiB0byBhbGxvYyBNU0kgdmVjdG9ycyB3aGljaCBhcmUgbmVlZGVkIGJ5IGNs aWVudAo+ICsJICogZGV2aWNlcyBjb25uZWN0ZWQgdG8gaXQuCj4gKwkgKgo+ICsJICogSGVyZSBp cyB0aGUgRFNEVCBkZXZpY2Ugbm9kZSB1c2VkIGZvciBtYmlnZW4gaW4gZmlybXdhcmU6Cj4gKwkg KglEZXZpY2UoTUJJMCkgewo+ICsJICoJCU5hbWUoX0hJRCwgIkhJU0kwMTUyIikKPiArCSAqCQlO YW1lKF9VSUQsIFplcm8pCj4gKwkgKgkJTmFtZShfQ1JTLCBSZXNvdXJjZVRlbXBsYXRlKCkgewo+ ICsJICoJCQlNZW1vcnkzMkZpeGVkKFJlYWRXcml0ZSwgMHhhMDA4MDAwMCwgMHgxMDAwMCkKPiAr CSAqCQl9KQo+ICsJICoKPiArCSAqCQlOYW1lKF9EU0QsIFBhY2thZ2UgKCkgewo+ICsJICoJCQlU b1VVSUQoImRhZmZkODE0LTZlYmEtNGQ4Yy04YTkxLWJjOWJiZjRhYTMwMSIpLAo+ICsJICoJCQlQ YWNrYWdlICgpIHsKPiArCSAqCQkJCVBhY2thZ2UgKCkgeyJudW0tcGlucyIsIDM3OH0KPiArCSAq CQkJfQo+ICsJICoJCX0pCj4gKwkgKgl9Cj4gKwkgKi8KPiArCXJldCA9IGRldmljZV9wcm9wZXJ0 eV9yZWFkX3UzMigmcGRldi0+ZGV2LCAibnVtLXBpbnMiLCAmbnVtX3BpbnMpOwo+ICsJaWYgKHJl dCB8fCBudW1fcGlucyA9PSAwKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCWRvbWFpbiA9 IHBsYXRmb3JtX21zaV9jcmVhdGVfZGV2aWNlX2RvbWFpbigmcGRldi0+ZGV2LCBudW1fcGlucywK PiArCQkJCQkJICAgbWJpZ2VuX3dyaXRlX21zZywKPiArCQkJCQkJICAgJm1iaWdlbl9kb21haW5f b3BzLAo+ICsJCQkJCQkgICBtZ25fY2hpcCk7Cj4gKwlpZiAoIWRvbWFpbikKPiArCQlyZXR1cm4g LUVOT01FTTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsjZWxzZQo+ICtzdGF0aWMgaW5saW5l IGludCBtYmlnZW5fYWNwaV9jcmVhdGVfZG9tYWluKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXYsCj4gKwkJCQkJICAgIHN0cnVjdCBtYmlnZW5fZGV2aWNlICptZ25fY2hpcCkKPiArewo+ICsJ cmV0dXJuIC1FTk9ERVY7Cj4gK30KPiArI2VuZGlmCj4gKwo+ICBzdGF0aWMgaW50IG1iaWdlbl9k ZXZpY2VfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiAgewo+ICAJc3RydWN0 IG1iaWdlbl9kZXZpY2UgKm1nbl9jaGlwOwo+IEBAIC0yODksOSArMzQyLDE4IEBAIHN0YXRpYyBp bnQgbWJpZ2VuX2RldmljZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICAJ aWYgKElTX0VSUihtZ25fY2hpcC0+YmFzZSkpCj4gIAkJcmV0dXJuIFBUUl9FUlIobWduX2NoaXAt PmJhc2UpOwo+ICAKPiAtCWVyciA9IG1iaWdlbl9vZl9jcmVhdGVfZG9tYWluKHBkZXYsIG1nbl9j aGlwKTsKPiAtCWlmIChlcnIpCj4gKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfT0YpICYmIHBkZXYt PmRldi5vZl9ub2RlKQo+ICsJCWVyciA9IG1iaWdlbl9vZl9jcmVhdGVfZG9tYWluKHBkZXYsIG1n bl9jaGlwKTsKPiArCWVsc2UgaWYgKEFDUElfQ09NUEFOSU9OKCZwZGV2LT5kZXYpKQo+ICsJCWVy ciA9IG1iaWdlbl9hY3BpX2NyZWF0ZV9kb21haW4ocGRldiwgbWduX2NoaXApOwo+ICsJZWxzZQo+ ICsJCWVyciA9IC1FSU5WQUw7Cj4gKwo+ICsJaWYgKGVycikgewo+ICsJCWRldl9lcnIoJnBkZXYt PmRldiwgIkZhaWxlZCB0byBjcmVhdGUgbWJpLWdlbkAlcCBpcnFkb21haW4iLAo+ICsJCQltZ25f Y2hpcC0+YmFzZSk7Cj4gIAkJcmV0dXJuIGVycjsKPiArCX0KPiAgCj4gIAlwbGF0Zm9ybV9zZXRf ZHJ2ZGF0YShwZGV2LCBtZ25fY2hpcCk7Cj4gIAlyZXR1cm4gMDsKPiBAQCAtMzAzLDEwICszNjUs MTcgQEAgc3RhdGljIGludCBtYmlnZW5fZGV2aWNlX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2UgKnBkZXYpCj4gIH07Cj4gIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1iaWdlbl9vZl9tYXRj aCk7Cj4gIAo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIG1iaWdlbl9hY3Bp X21hdGNoW10gPSB7Cj4gKwl7ICJISVNJMDE1MiIsIDAgfSwKPiArCXt9Cj4gK307Cj4gK01PRFVM RV9ERVZJQ0VfVEFCTEUoYWNwaSwgbWJpZ2VuX2FjcGlfbWF0Y2gpOwo+ICsKPiAgc3RhdGljIHN0 cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWJpZ2VuX3BsYXRmb3JtX2RyaXZlciA9IHsKPiAgCS5kcml2 ZXIgPSB7Cj4gIAkJLm5hbWUJCT0gIkhpc2lsaWNvbiBNQklHRU4tVjIiLAo+ICAJCS5vZl9tYXRj aF90YWJsZQk9IG1iaWdlbl9vZl9tYXRjaCwKPiArCQkuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElf UFRSKG1iaWdlbl9hY3BpX21hdGNoKSwKPiAgCX0sCj4gIAkucHJvYmUJCQk9IG1iaWdlbl9kZXZp Y2VfcHJvYmUsCj4gIH07Cj4gCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5l bEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4v bGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: majun258@huawei.com (majun (Euler7)) Date: Tue, 28 Mar 2017 20:30:27 +0800 Subject: [Update][PATCH v9.1 15/15] irqchip: mbigen: Add ACPI support In-Reply-To: <1490703665-4932-1-git-send-email-hanjun.guo@linaro.org> References: <1490703665-4932-1-git-send-email-hanjun.guo@linaro.org> Message-ID: <58DA5763.4060509@huawei.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi hanjun: This patch works fine on my D05 board. Tested-by: MaJun Best Regards Majun ? 2017/3/28 20:21, Hanjun Guo ??: > With the preparation of platform msi support and interrupt producer > in commit d44fa3d46079 ("ACPI: Add support for ResourceSource/IRQ > domain mapping"), we can add mbigen ACPI support now. > > Now that the major framework changes are ready, we just need to add > the ACPI probe code which creates the irqdomain for devices connecting > to it. > > In order to create the irqdomain, we need to know the number of hw > irqs as input which is provided by mbigen. In DT case, we are using > "num-pins" property to describe it, and we will take advantage of > that too using _DSD in ACPI as there is no standard way of describe > it in ACPI way, also according to the _DSD rule described in > Documentation/acpi/DSD-properties-rules.txt, it doesn't break > the rules. > > The DSDT is represented as below: > > For mbigen, > Device(MBI0) { > Name(_HID, "HISI0152") > Name(_UID, Zero) > Name(_CRS, ResourceTemplate() { > Memory32Fixed(ReadWrite, 0xa0080000, 0x10000) > }) > > Name(_DSD, Package () { > ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), > Package () { > Package () {"num-pins", 378} > } > }) > } > > For devices, > Device(SAS0) { > Name(_HID, "HISIxxxx") > Name(_UID, Zero) > Name(_CRS, ResourceTemplate() { > Memory32Fixed(ReadWrite, 0xb0030000, 0x10000) > Interrupt(ResourceConsumer,..., "\_SB.MBI0") {12, ...} > }) > } > > So for the devices connected to the mbigen, as we clearly say that > it refers to a specific interrupt controller (mbigen), we can get > the virq from mbigen's irqdomain once it's created successfully. > > Signed-off-by: Hanjun Guo > Signed-off-by: MaJun > Cc: Al Stone > Cc: Darren Hart > Cc: Lorenzo Pieralisi > Cc: Marc Zyngier > --- > drivers/irqchip/irq-mbigen.c | 75 ++++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 72 insertions(+), 3 deletions(-) > > diff --git a/drivers/irqchip/irq-mbigen.c b/drivers/irqchip/irq-mbigen.c > index 3756408..061cdb8 100644 > --- a/drivers/irqchip/irq-mbigen.c > +++ b/drivers/irqchip/irq-mbigen.c > @@ -16,6 +16,7 @@ > * along with this program. If not, see . > */ > > +#include > #include > #include > #include > @@ -180,7 +181,7 @@ static int mbigen_domain_translate(struct irq_domain *d, > unsigned long *hwirq, > unsigned int *type) > { > - if (is_of_node(fwspec->fwnode)) { > + if (is_of_node(fwspec->fwnode) || is_acpi_device_node(fwspec->fwnode)) { > if (fwspec->param_count != 2) > return -EINVAL; > > @@ -271,6 +272,58 @@ static int mbigen_of_create_domain(struct platform_device *pdev, > return 0; > } > > +#ifdef CONFIG_ACPI > +static int mbigen_acpi_create_domain(struct platform_device *pdev, > + struct mbigen_device *mgn_chip) > +{ > + struct irq_domain *domain; > + u32 num_pins = 0; > + int ret; > + > + /* > + * "num-pins" is the total number of interrupt pins implemented in > + * this mbigen instance, and mbigen is an interrupt controller > + * connected to ITS converting wired interrupts into MSI, so we > + * use "num-pins" to alloc MSI vectors which are needed by client > + * devices connected to it. > + * > + * Here is the DSDT device node used for mbigen in firmware: > + * Device(MBI0) { > + * Name(_HID, "HISI0152") > + * Name(_UID, Zero) > + * Name(_CRS, ResourceTemplate() { > + * Memory32Fixed(ReadWrite, 0xa0080000, 0x10000) > + * }) > + * > + * Name(_DSD, Package () { > + * ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), > + * Package () { > + * Package () {"num-pins", 378} > + * } > + * }) > + * } > + */ > + ret = device_property_read_u32(&pdev->dev, "num-pins", &num_pins); > + if (ret || num_pins == 0) > + return -EINVAL; > + > + domain = platform_msi_create_device_domain(&pdev->dev, num_pins, > + mbigen_write_msg, > + &mbigen_domain_ops, > + mgn_chip); > + if (!domain) > + return -ENOMEM; > + > + return 0; > +} > +#else > +static inline int mbigen_acpi_create_domain(struct platform_device *pdev, > + struct mbigen_device *mgn_chip) > +{ > + return -ENODEV; > +} > +#endif > + > static int mbigen_device_probe(struct platform_device *pdev) > { > struct mbigen_device *mgn_chip; > @@ -289,9 +342,18 @@ static int mbigen_device_probe(struct platform_device *pdev) > if (IS_ERR(mgn_chip->base)) > return PTR_ERR(mgn_chip->base); > > - err = mbigen_of_create_domain(pdev, mgn_chip); > - if (err) > + if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node) > + err = mbigen_of_create_domain(pdev, mgn_chip); > + else if (ACPI_COMPANION(&pdev->dev)) > + err = mbigen_acpi_create_domain(pdev, mgn_chip); > + else > + err = -EINVAL; > + > + if (err) { > + dev_err(&pdev->dev, "Failed to create mbi-gen@%p irqdomain", > + mgn_chip->base); > return err; > + } > > platform_set_drvdata(pdev, mgn_chip); > return 0; > @@ -303,10 +365,17 @@ static int mbigen_device_probe(struct platform_device *pdev) > }; > MODULE_DEVICE_TABLE(of, mbigen_of_match); > > +static const struct acpi_device_id mbigen_acpi_match[] = { > + { "HISI0152", 0 }, > + {} > +}; > +MODULE_DEVICE_TABLE(acpi, mbigen_acpi_match); > + > static struct platform_driver mbigen_platform_driver = { > .driver = { > .name = "Hisilicon MBIGEN-V2", > .of_match_table = mbigen_of_match, > + .acpi_match_table = ACPI_PTR(mbigen_acpi_match), > }, > .probe = mbigen_device_probe, > }; > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752923AbdC1MeI (ORCPT ); Tue, 28 Mar 2017 08:34:08 -0400 Received: from szxga02-in.huawei.com ([45.249.212.188]:4400 "EHLO dggrg02-dlp.huawei.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1752886AbdC1MeF (ORCPT ); Tue, 28 Mar 2017 08:34:05 -0400 Subject: Re: [Update][PATCH v9.1 15/15] irqchip: mbigen: Add ACPI support To: Hanjun Guo , Marc Zyngier , "Rafael J. Wysocki" , Lorenzo Pieralisi References: <1490703665-4932-1-git-send-email-hanjun.guo@linaro.org> CC: , , , , , Thomas Gleixner , Kefeng Wang , , , "Al Stone" , Darren Hart From: "majun (Euler7)" Message-ID: <58DA5763.4060509@huawei.com> Date: Tue, 28 Mar 2017 20:30:27 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 In-Reply-To: <1490703665-4932-1-git-send-email-hanjun.guo@linaro.org> Content-Type: text/plain; charset="gbk" Content-Transfer-Encoding: 8bit X-Originating-IP: [10.177.249.226] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020205.58DA576F.0159,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2014-11-16 11:51:01, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 9ce7ed7814fde1251f967ead41d948a2 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi hanjun: This patch works fine on my D05 board. Tested-by: MaJun Best Regards Majun ÔÚ 2017/3/28 20:21, Hanjun Guo дµÀ: > With the preparation of platform msi support and interrupt producer > in commit d44fa3d46079 ("ACPI: Add support for ResourceSource/IRQ > domain mapping"), we can add mbigen ACPI support now. > > Now that the major framework changes are ready, we just need to add > the ACPI probe code which creates the irqdomain for devices connecting > to it. > > In order to create the irqdomain, we need to know the number of hw > irqs as input which is provided by mbigen. In DT case, we are using > "num-pins" property to describe it, and we will take advantage of > that too using _DSD in ACPI as there is no standard way of describe > it in ACPI way, also according to the _DSD rule described in > Documentation/acpi/DSD-properties-rules.txt, it doesn't break > the rules. > > The DSDT is represented as below: > > For mbigen, > Device(MBI0) { > Name(_HID, "HISI0152") > Name(_UID, Zero) > Name(_CRS, ResourceTemplate() { > Memory32Fixed(ReadWrite, 0xa0080000, 0x10000) > }) > > Name(_DSD, Package () { > ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), > Package () { > Package () {"num-pins", 378} > } > }) > } > > For devices, > Device(SAS0) { > Name(_HID, "HISIxxxx") > Name(_UID, Zero) > Name(_CRS, ResourceTemplate() { > Memory32Fixed(ReadWrite, 0xb0030000, 0x10000) > Interrupt(ResourceConsumer,..., "\_SB.MBI0") {12, ...} > }) > } > > So for the devices connected to the mbigen, as we clearly say that > it refers to a specific interrupt controller (mbigen), we can get > the virq from mbigen's irqdomain once it's created successfully. > > Signed-off-by: Hanjun Guo > Signed-off-by: MaJun > Cc: Al Stone > Cc: Darren Hart > Cc: Lorenzo Pieralisi > Cc: Marc Zyngier > --- > drivers/irqchip/irq-mbigen.c | 75 ++++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 72 insertions(+), 3 deletions(-) > > diff --git a/drivers/irqchip/irq-mbigen.c b/drivers/irqchip/irq-mbigen.c > index 3756408..061cdb8 100644 > --- a/drivers/irqchip/irq-mbigen.c > +++ b/drivers/irqchip/irq-mbigen.c > @@ -16,6 +16,7 @@ > * along with this program. If not, see . > */ > > +#include > #include > #include > #include > @@ -180,7 +181,7 @@ static int mbigen_domain_translate(struct irq_domain *d, > unsigned long *hwirq, > unsigned int *type) > { > - if (is_of_node(fwspec->fwnode)) { > + if (is_of_node(fwspec->fwnode) || is_acpi_device_node(fwspec->fwnode)) { > if (fwspec->param_count != 2) > return -EINVAL; > > @@ -271,6 +272,58 @@ static int mbigen_of_create_domain(struct platform_device *pdev, > return 0; > } > > +#ifdef CONFIG_ACPI > +static int mbigen_acpi_create_domain(struct platform_device *pdev, > + struct mbigen_device *mgn_chip) > +{ > + struct irq_domain *domain; > + u32 num_pins = 0; > + int ret; > + > + /* > + * "num-pins" is the total number of interrupt pins implemented in > + * this mbigen instance, and mbigen is an interrupt controller > + * connected to ITS converting wired interrupts into MSI, so we > + * use "num-pins" to alloc MSI vectors which are needed by client > + * devices connected to it. > + * > + * Here is the DSDT device node used for mbigen in firmware: > + * Device(MBI0) { > + * Name(_HID, "HISI0152") > + * Name(_UID, Zero) > + * Name(_CRS, ResourceTemplate() { > + * Memory32Fixed(ReadWrite, 0xa0080000, 0x10000) > + * }) > + * > + * Name(_DSD, Package () { > + * ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), > + * Package () { > + * Package () {"num-pins", 378} > + * } > + * }) > + * } > + */ > + ret = device_property_read_u32(&pdev->dev, "num-pins", &num_pins); > + if (ret || num_pins == 0) > + return -EINVAL; > + > + domain = platform_msi_create_device_domain(&pdev->dev, num_pins, > + mbigen_write_msg, > + &mbigen_domain_ops, > + mgn_chip); > + if (!domain) > + return -ENOMEM; > + > + return 0; > +} > +#else > +static inline int mbigen_acpi_create_domain(struct platform_device *pdev, > + struct mbigen_device *mgn_chip) > +{ > + return -ENODEV; > +} > +#endif > + > static int mbigen_device_probe(struct platform_device *pdev) > { > struct mbigen_device *mgn_chip; > @@ -289,9 +342,18 @@ static int mbigen_device_probe(struct platform_device *pdev) > if (IS_ERR(mgn_chip->base)) > return PTR_ERR(mgn_chip->base); > > - err = mbigen_of_create_domain(pdev, mgn_chip); > - if (err) > + if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node) > + err = mbigen_of_create_domain(pdev, mgn_chip); > + else if (ACPI_COMPANION(&pdev->dev)) > + err = mbigen_acpi_create_domain(pdev, mgn_chip); > + else > + err = -EINVAL; > + > + if (err) { > + dev_err(&pdev->dev, "Failed to create mbi-gen@%p irqdomain", > + mgn_chip->base); > return err; > + } > > platform_set_drvdata(pdev, mgn_chip); > return 0; > @@ -303,10 +365,17 @@ static int mbigen_device_probe(struct platform_device *pdev) > }; > MODULE_DEVICE_TABLE(of, mbigen_of_match); > > +static const struct acpi_device_id mbigen_acpi_match[] = { > + { "HISI0152", 0 }, > + {} > +}; > +MODULE_DEVICE_TABLE(acpi, mbigen_acpi_match); > + > static struct platform_driver mbigen_platform_driver = { > .driver = { > .name = "Hisilicon MBIGEN-V2", > .of_match_table = mbigen_of_match, > + .acpi_match_table = ACPI_PTR(mbigen_acpi_match), > }, > .probe = mbigen_device_probe, > }; >