From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mark yao Subject: Re: [PATCH v5 7/8] drm/rockchip: Use common IOMMU API to attach devices Date: Fri, 8 Jul 2016 08:54:26 +0800 Message-ID: <577EF9C2.2070902@rock-chips.com> References: <1466734413-7453-1-git-send-email-zhengsq@rock-chips.com> <1466734413-7453-8-git-send-email-zhengsq@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1466734413-7453-8-git-send-email-zhengsq@rock-chips.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Shunqian Zheng , joro@8bytes.org, heiko@sntech.de, robh+dt@kernel.org, mark.rutland@arm.com, linux@armlinux.org.uk, airlied@linux.ie, tfiga@google.com, xxm@rock-chips.com Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Tomasz Figa , linux-rockchip@lists.infradead.org, iommu@lists.linux-foundation.org, linux-arm-kernel@lists.infradead.org List-Id: iommu@lists.linux-foundation.org T24gMjAxNuW5tDA25pyIMjTml6UgMTA6MTMsIFNodW5xaWFuIFpoZW5nIHdyb3RlOgo+IFJvY2tj aGlwIERSTSB1c2VkIHRoZSBhcm0gc3BlY2lhbCBBUEksIGFybV9pb21tdV8qKCksIHRvIGF0dGFj aAo+IGlvbW11IGZvciBBUk0zMiBTb0NzLiBUaGlzIHBhdGNoIGNvbnZlcnQgdG8gY29tbW9uIGlv bW11IEFQSQo+IHNvIGl0IHdvdWxkIHN1cHBvcnQgQVJNNjQgbGlrZSBSSzMzOTkuCj4KPiBTaW5j ZSBwcmV2aW91cyBwYXRjaCBhZGRlZCBzdXBwb3J0IGZvciBkaXJlY3QgSU9NTVUgYWRkcmVzcyBz cGFjZQo+IG1hbmFnZW1lbnQsIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIERNQSBBUEkgYW55bW9y ZSBhbmQgdGhpcyBwYXRjaCB3aXJlcwo+IHRoaW5ncyB0byB1c2UgdGhlIG5ldyBtZXRob2QuCj4K PiBTaWduZWQtb2ZmLWJ5OiBTaHVucWlhbiBaaGVuZyA8emhlbmdzcUByb2NrLWNoaXBzLmNvbT4K PiBTaWduZWQtb2ZmLWJ5OiBUb21hc3ogRmlnYSA8dGZpZ2FAY2hyb21pdW0ub3JnPgoKTG9va3Mg Z29vZCBmb3IgbWUsIGFuZCBpdCB3b3JrcyBvbiByazMzOTkgYm9hcmQsIHNvCgpBY2tlZC1ieTog TWFyayBZYW8gPG1hcmsueWFvQHJvY2stY2hpcHMuY29tPgoKPiAtLS0KPiAgIGRyaXZlcnMvZ3B1 L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZHJ2LmMgfCAxMDAgKysrKysrKysrKysrKysrLS0t LS0tLS0tLS0tLQo+ICAgMSBmaWxlIGNoYW5nZWQsIDUzIGluc2VydGlvbnMoKyksIDQ3IGRlbGV0 aW9ucygtKQo+Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hp cF9kcm1fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Rydi5j Cj4gaW5kZXggOGI5NmM2OS4uY2E5NjI0ZiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0v cm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Rydi5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tj aGlwL3JvY2tjaGlwX2RybV9kcnYuYwo+IEBAIC0xNCwxOCArMTQsMTggQEAKPiAgICAqIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4gICAgKi8KPiAgIAo+IC0j aW5jbHVkZSA8YXNtL2RtYS1pb21tdS5oPgo+IC0KPiAgICNpbmNsdWRlIDxkcm0vZHJtUC5oPgo+ ICAgI2luY2x1ZGUgPGRybS9kcm1fY3J0Y19oZWxwZXIuaD4KPiAgICNpbmNsdWRlIDxkcm0vZHJt X2ZiX2hlbHBlci5oPgo+ICAgI2luY2x1ZGUgPGRybS9kcm1fZ2VtX2NtYV9oZWxwZXIuaD4KPiAg ICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgo+ICsjaW5jbHVkZSA8bGludXgvZG1hLWlv bW11Lmg+Cj4gICAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgo+ICAgI2luY2x1ZGUgPGxp bnV4L21vZHVsZS5oPgo+ICAgI2luY2x1ZGUgPGxpbnV4L29mX2dyYXBoLmg+Cj4gICAjaW5jbHVk ZSA8bGludXgvY29tcG9uZW50Lmg+Cj4gICAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgo+ICsj aW5jbHVkZSA8bGludXgvaW9tbXUuaD4KPiAgIAo+ICAgI2luY2x1ZGUgPGRybS9yb2NrY2hpcF9k cm0uaD4KPiAgIAo+IEBAIC01MSwyOCArNTEsMzEgQEAgc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVy IHJvY2tjaGlwX2RybV9kcml2ZXI7Cj4gICBpbnQgcm9ja2NoaXBfZHJtX2RtYV9hdHRhY2hfZGV2 aWNlKHN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2LAo+ICAgCQkJCSAgIHN0cnVjdCBkZXZpY2Ug KmRldikKPiAgIHsKPiAtCXN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZyA9IGRybV9k ZXYtPmRldi0+YXJjaGRhdGEubWFwcGluZzsKPiArCXN0cnVjdCByb2NrY2hpcF9kcm1fcHJpdmF0 ZSAqcHJpdmF0ZSA9IGRybV9kZXYtPmRldl9wcml2YXRlOwo+ICAgCWludCByZXQ7Cj4gICAKPiAg IAlpZiAoIWlzX3N1cHBvcnRfaW9tbXUpCj4gICAJCXJldHVybiAwOwo+ICAgCj4gLQlyZXQgPSBk bWFfc2V0X2NvaGVyZW50X21hc2soZGV2LCBETUFfQklUX01BU0soMzIpKTsKPiAtCWlmIChyZXQp Cj4gKwlyZXQgPSBpb21tdV9hdHRhY2hfZGV2aWNlKHByaXZhdGUtPmRvbWFpbiwgZGV2KTsKPiAr CWlmIChyZXQpIHsKPiArCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBhdHRhY2ggaW9tbXUgZGV2 aWNlXG4iKTsKPiAgIAkJcmV0dXJuIHJldDsKPiArCX0KPiAgIAo+IC0JZG1hX3NldF9tYXhfc2Vn X3NpemUoZGV2LCBETUFfQklUX01BU0soMzIpKTsKPiAtCj4gLQlyZXR1cm4gYXJtX2lvbW11X2F0 dGFjaF9kZXZpY2UoZGV2LCBtYXBwaW5nKTsKPiArCXJldHVybiAwOwo+ICAgfQo+ICAgCj4gICB2 b2lkIHJvY2tjaGlwX2RybV9kbWFfZGV0YWNoX2RldmljZShzdHJ1Y3QgZHJtX2RldmljZSAqZHJt X2RldiwKPiAgIAkJCQkgICAgc3RydWN0IGRldmljZSAqZGV2KQo+ICAgewo+ICsJc3RydWN0IHJv Y2tjaGlwX2RybV9wcml2YXRlICpwcml2YXRlID0gZHJtX2Rldi0+ZGV2X3ByaXZhdGU7Cj4gKwlz dHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4gPSBwcml2YXRlLT5kb21haW47Cj4gKwo+ICAgCWlm ICghaXNfc3VwcG9ydF9pb21tdSkKPiAgIAkJcmV0dXJuOwo+ICAgCj4gLQlhcm1faW9tbXVfZGV0 YWNoX2RldmljZShkZXYpOwo+ICsJaW9tbXVfZGV0YWNoX2RldmljZShkb21haW4sIGRldik7Cj4g ICB9Cj4gICAKPiAgIGludCByb2NrY2hpcF9yZWdpc3Rlcl9jcnRjX2Z1bmNzKHN0cnVjdCBkcm1f Y3J0YyAqY3J0YywKPiBAQCAtMTM3LDExICsxNDAsNDUgQEAgc3RhdGljIHZvaWQgcm9ja2NoaXBf ZHJtX2NydGNfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKPiAgIAkJcHJp di0+Y3J0Y19mdW5jc1twaXBlXS0+ZGlzYWJsZV92YmxhbmsoY3J0Yyk7Cj4gICB9Cj4gICAKPiAr c3RhdGljIGludCByb2NrY2hpcF9kcm1faW5pdF9pb21tdShzdHJ1Y3QgZHJtX2RldmljZSAqZHJt X2RldikKPiArewo+ICsJc3RydWN0IHJvY2tjaGlwX2RybV9wcml2YXRlICpwcml2YXRlID0gZHJt X2Rldi0+ZGV2X3ByaXZhdGU7Cj4gKwlzdHJ1Y3QgaW9tbXVfZG9tYWluX2dlb21ldHJ5ICpnZW9t ZXRyeTsKPiArCXU2NCBzdGFydCwgZW5kOwo+ICsKPiArCWlmICghaXNfc3VwcG9ydF9pb21tdSkK PiArCQlyZXR1cm4gMDsKPiArCj4gKwlwcml2YXRlLT5kb21haW4gPSBpb21tdV9kb21haW5fYWxs b2MoJnBsYXRmb3JtX2J1c190eXBlKTsKPiArCWlmICghcHJpdmF0ZS0+ZG9tYWluKQo+ICsJCXJl dHVybiAtRU5PTUVNOwo+ICsKPiArCWdlb21ldHJ5ID0gJnByaXZhdGUtPmRvbWFpbi0+Z2VvbWV0 cnk7Cj4gKwlzdGFydCA9IGdlb21ldHJ5LT5hcGVydHVyZV9zdGFydDsKPiArCWVuZCA9IGdlb21l dHJ5LT5hcGVydHVyZV9lbmQ7Cj4gKwo+ICsJRFJNX0RFQlVHKCJJT01NVSBjb250ZXh0IGluaXRp YWxpemVkIChhcGVydHVyZTogJSNsbHgtJSNsbHgpXG4iLAo+ICsJCSAgc3RhcnQsIGVuZCk7Cj4g Kwlkcm1fbW1faW5pdCgmcHJpdmF0ZS0+bW0sIHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpOwo+ICsK PiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCByb2NrY2hpcF9pb21tdV9jbGVh bnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2KQo+ICt7Cj4gKwlzdHJ1Y3Qgcm9ja2NoaXBf ZHJtX3ByaXZhdGUgKnByaXZhdGUgPSBkcm1fZGV2LT5kZXZfcHJpdmF0ZTsKPiArCj4gKwlpZiAo IWlzX3N1cHBvcnRfaW9tbXUpCj4gKwkJcmV0dXJuOwo+ICsKPiArCWRybV9tbV90YWtlZG93bigm cHJpdmF0ZS0+bW0pOwo+ICsJaW9tbXVfZG9tYWluX2ZyZWUocHJpdmF0ZS0+ZG9tYWluKTsKPiAr fQo+ICsKPiAgIHN0YXRpYyBpbnQgcm9ja2NoaXBfZHJtX2JpbmQoc3RydWN0IGRldmljZSAqZGV2 KQo+ICAgewo+ICAgCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2Owo+ICAgCXN0cnVjdCByb2Nr Y2hpcF9kcm1fcHJpdmF0ZSAqcHJpdmF0ZTsKPiAtCXN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAq bWFwcGluZyA9IE5VTEw7Cj4gICAJaW50IHJldDsKPiAgIAo+ICAgCWRybV9kZXYgPSBkcm1fZGV2 X2FsbG9jKCZyb2NrY2hpcF9kcm1fZHJpdmVyLCBkZXYpOwo+IEBAIC0xNjIsMzggKzE5OSwxNCBA QCBzdGF0aWMgaW50IHJvY2tjaGlwX2RybV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldikKPiAgIAo+ ICAgCXJvY2tjaGlwX2RybV9tb2RlX2NvbmZpZ19pbml0KGRybV9kZXYpOwo+ICAgCj4gLQlkZXYt PmRtYV9wYXJtcyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGV2LT5kbWFfcGFybXMpLAo+ IC0JCQkJICAgICAgR0ZQX0tFUk5FTCk7Cj4gLQlpZiAoIWRldi0+ZG1hX3Bhcm1zKSB7Cj4gLQkJ cmV0ID0gLUVOT01FTTsKPiArCXJldCA9IHJvY2tjaGlwX2RybV9pbml0X2lvbW11KGRybV9kZXYp Owo+ICsJaWYgKHJldCkKPiAgIAkJZ290byBlcnJfY29uZmlnX2NsZWFudXA7Cj4gLQl9Cj4gLQo+ IC0JaWYgKGlzX3N1cHBvcnRfaW9tbXUpIHsKPiAtCQkvKiBUT0RPKGRqa3VydHopOiBmZXRjaCB0 aGUgbWFwcGluZyBzdGFydC9zaXplIGZyb20gc29tZXdoZXJlICovCj4gLQkJbWFwcGluZyA9IGFy bV9pb21tdV9jcmVhdGVfbWFwcGluZygmcGxhdGZvcm1fYnVzX3R5cGUsCj4gLQkJCQkJCSAgIDB4 MDAwMDAwMDAsCj4gLQkJCQkJCSAgIFNaXzJHKTsKPiAtCQlpZiAoSVNfRVJSKG1hcHBpbmcpKSB7 Cj4gLQkJCXJldCA9IFBUUl9FUlIobWFwcGluZyk7Cj4gLQkJCWdvdG8gZXJyX2NvbmZpZ19jbGVh bnVwOwo+IC0JCX0KPiAtCj4gLQkJcmV0ID0gZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudChkZXYs IERNQV9CSVRfTUFTSygzMikpOwo+IC0JCWlmIChyZXQpCj4gLQkJCWdvdG8gZXJyX3JlbGVhc2Vf bWFwcGluZzsKPiAtCj4gLQkJZG1hX3NldF9tYXhfc2VnX3NpemUoZGV2LCBETUFfQklUX01BU0so MzIpKTsKPiAtCj4gLQkJcmV0ID0gYXJtX2lvbW11X2F0dGFjaF9kZXZpY2UoZGV2LCBtYXBwaW5n KTsKPiAtCQlpZiAocmV0KQo+IC0JCQlnb3RvIGVycl9yZWxlYXNlX21hcHBpbmc7Cj4gLQl9Cj4g ICAKPiAgIAkvKiBUcnkgdG8gYmluZCBhbGwgc3ViIGRyaXZlcnMuICovCj4gICAJcmV0ID0gY29t cG9uZW50X2JpbmRfYWxsKGRldiwgZHJtX2Rldik7Cj4gICAJaWYgKHJldCkKPiAtCQlnb3RvIGVy cl9kZXRhY2hfZGV2aWNlOwo+ICsJCWdvdG8gZXJyX2lvbW11X2NsZWFudXA7Cj4gICAKPiAgIAkv KiBpbml0IGttcyBwb2xsIGZvciBoYW5kbGluZyBocGQgKi8KPiAgIAlkcm1fa21zX2hlbHBlcl9w b2xsX2luaXQoZHJtX2Rldik7Cj4gQEAgLTIxOCw4ICsyMzEsNiBAQCBzdGF0aWMgaW50IHJvY2tj aGlwX2RybV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldikKPiAgIAlpZiAocmV0KQo+ICAgCQlnb3Rv IGVycl9mYmRldl9maW5pOwo+ICAgCj4gLQlpZiAoaXNfc3VwcG9ydF9pb21tdSkKPiAtCQlhcm1f aW9tbXVfcmVsZWFzZV9tYXBwaW5nKG1hcHBpbmcpOwo+ICAgCXJldHVybiAwOwo+ICAgZXJyX2Zi ZGV2X2Zpbmk6Cj4gICAJcm9ja2NoaXBfZHJtX2ZiZGV2X2ZpbmkoZHJtX2Rldik7Cj4gQEAgLTIy OCwxMiArMjM5LDggQEAgZXJyX3ZibGFua19jbGVhbnVwOgo+ICAgZXJyX2ttc19oZWxwZXJfcG9s bF9maW5pOgo+ICAgCWRybV9rbXNfaGVscGVyX3BvbGxfZmluaShkcm1fZGV2KTsKPiAgIAljb21w b25lbnRfdW5iaW5kX2FsbChkZXYsIGRybV9kZXYpOwo+IC1lcnJfZGV0YWNoX2RldmljZToKPiAt CWlmIChpc19zdXBwb3J0X2lvbW11KQo+IC0JCWFybV9pb21tdV9kZXRhY2hfZGV2aWNlKGRldik7 Cj4gLWVycl9yZWxlYXNlX21hcHBpbmc6Cj4gLQlpZiAoaXNfc3VwcG9ydF9pb21tdSkKPiAtCQlh cm1faW9tbXVfcmVsZWFzZV9tYXBwaW5nKG1hcHBpbmcpOwo+ICtlcnJfaW9tbXVfY2xlYW51cDoK PiArCXJvY2tjaGlwX2lvbW11X2NsZWFudXAoZHJtX2Rldik7Cj4gICBlcnJfY29uZmlnX2NsZWFu dXA6Cj4gICAJZHJtX21vZGVfY29uZmlnX2NsZWFudXAoZHJtX2Rldik7Cj4gICAJZHJtX2Rldi0+ ZGV2X3ByaXZhdGUgPSBOVUxMOwo+IEBAIC0yNTAsOCArMjU3LDcgQEAgc3RhdGljIHZvaWQgcm9j a2NoaXBfZHJtX3VuYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gICAJZHJtX3ZibGFua19jbGVh bnVwKGRybV9kZXYpOwo+ICAgCWRybV9rbXNfaGVscGVyX3BvbGxfZmluaShkcm1fZGV2KTsKPiAg IAljb21wb25lbnRfdW5iaW5kX2FsbChkZXYsIGRybV9kZXYpOwo+IC0JaWYgKGlzX3N1cHBvcnRf aW9tbXUpCj4gLQkJYXJtX2lvbW11X2RldGFjaF9kZXZpY2UoZGV2KTsKPiArCXJvY2tjaGlwX2lv bW11X2NsZWFudXAoZHJtX2Rldik7Cj4gICAJZHJtX21vZGVfY29uZmlnX2NsZWFudXAoZHJtX2Rl dik7Cj4gICAJZHJtX2Rldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOwo+ICAgCWRybV9kZXZfdW5yZWdp c3Rlcihkcm1fZGV2KTsKCgotLSAK77ytYXJrIFlhbwoKCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVs QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWls bWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: mark.yao@rock-chips.com (Mark yao) Date: Fri, 8 Jul 2016 08:54:26 +0800 Subject: [PATCH v5 7/8] drm/rockchip: Use common IOMMU API to attach devices In-Reply-To: <1466734413-7453-8-git-send-email-zhengsq@rock-chips.com> References: <1466734413-7453-1-git-send-email-zhengsq@rock-chips.com> <1466734413-7453-8-git-send-email-zhengsq@rock-chips.com> Message-ID: <577EF9C2.2070902@rock-chips.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 2016?06?24? 10:13, Shunqian Zheng wrote: > Rockchip DRM used the arm special API, arm_iommu_*(), to attach > iommu for ARM32 SoCs. This patch convert to common iommu API > so it would support ARM64 like RK3399. > > Since previous patch added support for direct IOMMU address space > management, there is no need to use DMA API anymore and this patch wires > things to use the new method. > > Signed-off-by: Shunqian Zheng > Signed-off-by: Tomasz Figa Looks good for me, and it works on rk3399 board, so Acked-by: Mark Yao > --- > drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 100 +++++++++++++++------------- > 1 file changed, 53 insertions(+), 47 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > index 8b96c69..ca9624f 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > @@ -14,18 +14,18 @@ > * GNU General Public License for more details. > */ > > -#include > - > #include > #include > #include > #include > #include > +#include > #include > #include > #include > #include > #include > +#include > > #include > > @@ -51,28 +51,31 @@ static struct drm_driver rockchip_drm_driver; > int rockchip_drm_dma_attach_device(struct drm_device *drm_dev, > struct device *dev) > { > - struct dma_iommu_mapping *mapping = drm_dev->dev->archdata.mapping; > + struct rockchip_drm_private *private = drm_dev->dev_private; > int ret; > > if (!is_support_iommu) > return 0; > > - ret = dma_set_coherent_mask(dev, DMA_BIT_MASK(32)); > - if (ret) > + ret = iommu_attach_device(private->domain, dev); > + if (ret) { > + dev_err(dev, "Failed to attach iommu device\n"); > return ret; > + } > > - dma_set_max_seg_size(dev, DMA_BIT_MASK(32)); > - > - return arm_iommu_attach_device(dev, mapping); > + return 0; > } > > void rockchip_drm_dma_detach_device(struct drm_device *drm_dev, > struct device *dev) > { > + struct rockchip_drm_private *private = drm_dev->dev_private; > + struct iommu_domain *domain = private->domain; > + > if (!is_support_iommu) > return; > > - arm_iommu_detach_device(dev); > + iommu_detach_device(domain, dev); > } > > int rockchip_register_crtc_funcs(struct drm_crtc *crtc, > @@ -137,11 +140,45 @@ static void rockchip_drm_crtc_disable_vblank(struct drm_device *dev, > priv->crtc_funcs[pipe]->disable_vblank(crtc); > } > > +static int rockchip_drm_init_iommu(struct drm_device *drm_dev) > +{ > + struct rockchip_drm_private *private = drm_dev->dev_private; > + struct iommu_domain_geometry *geometry; > + u64 start, end; > + > + if (!is_support_iommu) > + return 0; > + > + private->domain = iommu_domain_alloc(&platform_bus_type); > + if (!private->domain) > + return -ENOMEM; > + > + geometry = &private->domain->geometry; > + start = geometry->aperture_start; > + end = geometry->aperture_end; > + > + DRM_DEBUG("IOMMU context initialized (aperture: %#llx-%#llx)\n", > + start, end); > + drm_mm_init(&private->mm, start, end - start + 1); > + > + return 0; > +} > + > +static void rockchip_iommu_cleanup(struct drm_device *drm_dev) > +{ > + struct rockchip_drm_private *private = drm_dev->dev_private; > + > + if (!is_support_iommu) > + return; > + > + drm_mm_takedown(&private->mm); > + iommu_domain_free(private->domain); > +} > + > static int rockchip_drm_bind(struct device *dev) > { > struct drm_device *drm_dev; > struct rockchip_drm_private *private; > - struct dma_iommu_mapping *mapping = NULL; > int ret; > > drm_dev = drm_dev_alloc(&rockchip_drm_driver, dev); > @@ -162,38 +199,14 @@ static int rockchip_drm_bind(struct device *dev) > > rockchip_drm_mode_config_init(drm_dev); > > - dev->dma_parms = devm_kzalloc(dev, sizeof(*dev->dma_parms), > - GFP_KERNEL); > - if (!dev->dma_parms) { > - ret = -ENOMEM; > + ret = rockchip_drm_init_iommu(drm_dev); > + if (ret) > goto err_config_cleanup; > - } > - > - if (is_support_iommu) { > - /* TODO(djkurtz): fetch the mapping start/size from somewhere */ > - mapping = arm_iommu_create_mapping(&platform_bus_type, > - 0x00000000, > - SZ_2G); > - if (IS_ERR(mapping)) { > - ret = PTR_ERR(mapping); > - goto err_config_cleanup; > - } > - > - ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32)); > - if (ret) > - goto err_release_mapping; > - > - dma_set_max_seg_size(dev, DMA_BIT_MASK(32)); > - > - ret = arm_iommu_attach_device(dev, mapping); > - if (ret) > - goto err_release_mapping; > - } > > /* Try to bind all sub drivers. */ > ret = component_bind_all(dev, drm_dev); > if (ret) > - goto err_detach_device; > + goto err_iommu_cleanup; > > /* init kms poll for handling hpd */ > drm_kms_helper_poll_init(drm_dev); > @@ -218,8 +231,6 @@ static int rockchip_drm_bind(struct device *dev) > if (ret) > goto err_fbdev_fini; > > - if (is_support_iommu) > - arm_iommu_release_mapping(mapping); > return 0; > err_fbdev_fini: > rockchip_drm_fbdev_fini(drm_dev); > @@ -228,12 +239,8 @@ err_vblank_cleanup: > err_kms_helper_poll_fini: > drm_kms_helper_poll_fini(drm_dev); > component_unbind_all(dev, drm_dev); > -err_detach_device: > - if (is_support_iommu) > - arm_iommu_detach_device(dev); > -err_release_mapping: > - if (is_support_iommu) > - arm_iommu_release_mapping(mapping); > +err_iommu_cleanup: > + rockchip_iommu_cleanup(drm_dev); > err_config_cleanup: > drm_mode_config_cleanup(drm_dev); > drm_dev->dev_private = NULL; > @@ -250,8 +257,7 @@ static void rockchip_drm_unbind(struct device *dev) > drm_vblank_cleanup(drm_dev); > drm_kms_helper_poll_fini(drm_dev); > component_unbind_all(dev, drm_dev); > - if (is_support_iommu) > - arm_iommu_detach_device(dev); > + rockchip_iommu_cleanup(drm_dev); > drm_mode_config_cleanup(drm_dev); > drm_dev->dev_private = NULL; > drm_dev_unregister(drm_dev); -- ?ark Yao From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753600AbcGHAyv (ORCPT ); Thu, 7 Jul 2016 20:54:51 -0400 Received: from regular1.263xmail.com ([211.150.99.132]:46326 "EHLO regular1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753136AbcGHAym (ORCPT ); Thu, 7 Jul 2016 20:54:42 -0400 X-263anti-spam: KSV:0; X-MAIL-GRAY: 0 X-MAIL-DELIVERY: 1 X-KSVirus-check: 0 X-ABS-CHECKED: 4 X-ADDR-CHECKED: 0 X-RL-SENDER: mark.yao@rock-chips.com X-FST-TO: tfiga@chromium.org X-SENDER-IP: 58.22.7.114 X-LOGIN-NAME: mark.yao@rock-chips.com X-UNIQUE-TAG: <613443cfabd379768d5d40e9f4b9f304> X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 Subject: Re: [PATCH v5 7/8] drm/rockchip: Use common IOMMU API to attach devices To: Shunqian Zheng , joro@8bytes.org, heiko@sntech.de, robh+dt@kernel.org, mark.rutland@arm.com, linux@armlinux.org.uk, airlied@linux.ie, tfiga@google.com, xxm@rock-chips.com References: <1466734413-7453-1-git-send-email-zhengsq@rock-chips.com> <1466734413-7453-8-git-send-email-zhengsq@rock-chips.com> Cc: linux-arm-kernel@lists.infradead.org, iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, Tomasz Figa From: Mark yao Message-ID: <577EF9C2.2070902@rock-chips.com> Date: Fri, 8 Jul 2016 08:54:26 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 In-Reply-To: <1466734413-7453-8-git-send-email-zhengsq@rock-chips.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2016年06月24日 10:13, Shunqian Zheng wrote: > Rockchip DRM used the arm special API, arm_iommu_*(), to attach > iommu for ARM32 SoCs. This patch convert to common iommu API > so it would support ARM64 like RK3399. > > Since previous patch added support for direct IOMMU address space > management, there is no need to use DMA API anymore and this patch wires > things to use the new method. > > Signed-off-by: Shunqian Zheng > Signed-off-by: Tomasz Figa Looks good for me, and it works on rk3399 board, so Acked-by: Mark Yao > --- > drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 100 +++++++++++++++------------- > 1 file changed, 53 insertions(+), 47 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > index 8b96c69..ca9624f 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > @@ -14,18 +14,18 @@ > * GNU General Public License for more details. > */ > > -#include > - > #include > #include > #include > #include > #include > +#include > #include > #include > #include > #include > #include > +#include > > #include > > @@ -51,28 +51,31 @@ static struct drm_driver rockchip_drm_driver; > int rockchip_drm_dma_attach_device(struct drm_device *drm_dev, > struct device *dev) > { > - struct dma_iommu_mapping *mapping = drm_dev->dev->archdata.mapping; > + struct rockchip_drm_private *private = drm_dev->dev_private; > int ret; > > if (!is_support_iommu) > return 0; > > - ret = dma_set_coherent_mask(dev, DMA_BIT_MASK(32)); > - if (ret) > + ret = iommu_attach_device(private->domain, dev); > + if (ret) { > + dev_err(dev, "Failed to attach iommu device\n"); > return ret; > + } > > - dma_set_max_seg_size(dev, DMA_BIT_MASK(32)); > - > - return arm_iommu_attach_device(dev, mapping); > + return 0; > } > > void rockchip_drm_dma_detach_device(struct drm_device *drm_dev, > struct device *dev) > { > + struct rockchip_drm_private *private = drm_dev->dev_private; > + struct iommu_domain *domain = private->domain; > + > if (!is_support_iommu) > return; > > - arm_iommu_detach_device(dev); > + iommu_detach_device(domain, dev); > } > > int rockchip_register_crtc_funcs(struct drm_crtc *crtc, > @@ -137,11 +140,45 @@ static void rockchip_drm_crtc_disable_vblank(struct drm_device *dev, > priv->crtc_funcs[pipe]->disable_vblank(crtc); > } > > +static int rockchip_drm_init_iommu(struct drm_device *drm_dev) > +{ > + struct rockchip_drm_private *private = drm_dev->dev_private; > + struct iommu_domain_geometry *geometry; > + u64 start, end; > + > + if (!is_support_iommu) > + return 0; > + > + private->domain = iommu_domain_alloc(&platform_bus_type); > + if (!private->domain) > + return -ENOMEM; > + > + geometry = &private->domain->geometry; > + start = geometry->aperture_start; > + end = geometry->aperture_end; > + > + DRM_DEBUG("IOMMU context initialized (aperture: %#llx-%#llx)\n", > + start, end); > + drm_mm_init(&private->mm, start, end - start + 1); > + > + return 0; > +} > + > +static void rockchip_iommu_cleanup(struct drm_device *drm_dev) > +{ > + struct rockchip_drm_private *private = drm_dev->dev_private; > + > + if (!is_support_iommu) > + return; > + > + drm_mm_takedown(&private->mm); > + iommu_domain_free(private->domain); > +} > + > static int rockchip_drm_bind(struct device *dev) > { > struct drm_device *drm_dev; > struct rockchip_drm_private *private; > - struct dma_iommu_mapping *mapping = NULL; > int ret; > > drm_dev = drm_dev_alloc(&rockchip_drm_driver, dev); > @@ -162,38 +199,14 @@ static int rockchip_drm_bind(struct device *dev) > > rockchip_drm_mode_config_init(drm_dev); > > - dev->dma_parms = devm_kzalloc(dev, sizeof(*dev->dma_parms), > - GFP_KERNEL); > - if (!dev->dma_parms) { > - ret = -ENOMEM; > + ret = rockchip_drm_init_iommu(drm_dev); > + if (ret) > goto err_config_cleanup; > - } > - > - if (is_support_iommu) { > - /* TODO(djkurtz): fetch the mapping start/size from somewhere */ > - mapping = arm_iommu_create_mapping(&platform_bus_type, > - 0x00000000, > - SZ_2G); > - if (IS_ERR(mapping)) { > - ret = PTR_ERR(mapping); > - goto err_config_cleanup; > - } > - > - ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32)); > - if (ret) > - goto err_release_mapping; > - > - dma_set_max_seg_size(dev, DMA_BIT_MASK(32)); > - > - ret = arm_iommu_attach_device(dev, mapping); > - if (ret) > - goto err_release_mapping; > - } > > /* Try to bind all sub drivers. */ > ret = component_bind_all(dev, drm_dev); > if (ret) > - goto err_detach_device; > + goto err_iommu_cleanup; > > /* init kms poll for handling hpd */ > drm_kms_helper_poll_init(drm_dev); > @@ -218,8 +231,6 @@ static int rockchip_drm_bind(struct device *dev) > if (ret) > goto err_fbdev_fini; > > - if (is_support_iommu) > - arm_iommu_release_mapping(mapping); > return 0; > err_fbdev_fini: > rockchip_drm_fbdev_fini(drm_dev); > @@ -228,12 +239,8 @@ err_vblank_cleanup: > err_kms_helper_poll_fini: > drm_kms_helper_poll_fini(drm_dev); > component_unbind_all(dev, drm_dev); > -err_detach_device: > - if (is_support_iommu) > - arm_iommu_detach_device(dev); > -err_release_mapping: > - if (is_support_iommu) > - arm_iommu_release_mapping(mapping); > +err_iommu_cleanup: > + rockchip_iommu_cleanup(drm_dev); > err_config_cleanup: > drm_mode_config_cleanup(drm_dev); > drm_dev->dev_private = NULL; > @@ -250,8 +257,7 @@ static void rockchip_drm_unbind(struct device *dev) > drm_vblank_cleanup(drm_dev); > drm_kms_helper_poll_fini(drm_dev); > component_unbind_all(dev, drm_dev); > - if (is_support_iommu) > - arm_iommu_detach_device(dev); > + rockchip_iommu_cleanup(drm_dev); > drm_mode_config_cleanup(drm_dev); > drm_dev->dev_private = NULL; > drm_dev_unregister(drm_dev); -- Mark Yao