From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-11.3 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9AD2DC433E6 for ; Sat, 29 Aug 2020 09:57:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 71EAE20838 for ; Sat, 29 Aug 2020 09:57:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="iJqgYe2I" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727022AbgH2J53 (ORCPT ); Sat, 29 Aug 2020 05:57:29 -0400 Received: from mailgw02.mediatek.com ([1.203.163.81]:24605 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726869AbgH2J52 (ORCPT ); Sat, 29 Aug 2020 05:57:28 -0400 X-UUID: 06a97a601b30491ab643e29003ee3d10-20200829 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=YQ4nWNJaU2/84I56GfA7izeF71Nu7GxMGRIJ/4QLhhI=; b=iJqgYe2INoU7y5RbgeFWvqv7yXDT7wXXuH6QVWH8MwimigaAtcURtEZCqOdT81bfUhVmsmSMN0cgKkkduDX0H0CGIdSOMIeqyALhmkFm3cZq6FZ8b5Y573JvKeY6fGwQjf1MnghwP2HLQpe0YZOO0SZ+7z8XJSjwGZQ7GXZNHEA=; X-UUID: 06a97a601b30491ab643e29003ee3d10-20200829 Received: from mtkcas35.mediatek.inc [(172.27.4.253)] by mailgw02.mediatek.com (envelope-from ) (mailgw01.mediatek.com ESMTP with TLS) with ESMTP id 818620872; Sat, 29 Aug 2020 17:56:23 +0800 Received: from MTKCAS36.mediatek.inc (172.27.4.186) by MTKMBS31N1.mediatek.inc (172.27.4.69) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sat, 29 Aug 2020 17:56:20 +0800 Received: from [10.17.3.153] (10.17.3.153) by MTKCAS36.mediatek.inc (172.27.4.170) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sat, 29 Aug 2020 17:56:20 +0800 Message-ID: <1598694891.19851.12.camel@mhfsdcap03> Subject: Re: [PATCH 09/18] iommu/mediatek-v1: Add IOMMU_DOMAIN_DMA support From: Yong Wu To: Robin Murphy CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , Date: Sat, 29 Aug 2020 17:54:51 +0800 In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-TM-SNTS-SMTP: AA63C797C93CBD61B254A639A39F87490728FF8037E9BB375825F26FABF9D7122000:8 X-MTK: N Content-Transfer-Encoding: base64 Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org T24gVGh1LCAyMDIwLTA4LTIwIGF0IDE2OjA4ICswMTAwLCBSb2JpbiBNdXJwaHkgd3JvdGU6DQo+ IE5vdyB0aGF0IGFyY2gvYXJtIGlzIHdpcmVkIHVwIGZvciBkZWZhdWx0IGRvbWFpbnMgYW5kIGlv bW11LWRtYSwNCj4gaW1wbGVtZW50IHRoZSBjb3JyZXNwb25kaW5nIGRyaXZlci1zaWRlIHN1cHBv cnQgZm9yIGdyb3VwcyBhbmQgRE1BDQo+IGRvbWFpbnMgdG8gcmVwbGFjZSB0aGUgc2hhcmVkIG1h cHBpbmcgd29ya2Fyb3VuZC4NCj4gDQo+IFNpZ25lZC1vZmYtYnk6IFJvYmluIE11cnBoeSA8cm9i aW4ubXVycGh5QGFybS5jb20+DQo+IC0tLQ0KPiAgZHJpdmVycy9pb21tdS9tdGtfaW9tbXUuaCAg ICB8ICAgMiAtDQo+ICBkcml2ZXJzL2lvbW11L210a19pb21tdV92MS5jIHwgMTUzICsrKysrKysr KysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo+ICAyIGZpbGVzIGNoYW5nZWQsIDQ4IGluc2Vy dGlvbnMoKyksIDEwNyBkZWxldGlvbnMoLSkNCg0KSGkgUm9iaW4sDQoNClRoYW5rcyB2ZXJ5IG11 Y2ggZm9yIHRoaXMgcGF0Y2gsIEl0IG1ha2VzIHRoZSBjb2RlIG11Y2ggY2xlYW5lci4NCg0KUGxl YXNlIGhlbHAgc3F1YXNoIHRoZSBsaXR0bGUgY2hhbmdlIGluIHRoaXMgcGF0Y2gsDQoNCi0tLSBh L2RyaXZlcnMvaW9tbXUvbXRrX2lvbW11X3YxLmMNCisrKyBiL2RyaXZlcnMvaW9tbXUvbXRrX2lv bW11X3YxLmMNCkBAIC01NTUsNiArNTU1LDcgQEAgc3RhdGljIGludCBtdGtfaW9tbXVfcHJvYmUo c3RydWN0IHBsYXRmb3JtX2RldmljZQ0KKnBkZXYpDQogCQlyZXR1cm4gcmV0Ow0KIA0KIAlpb21t dV9kZXZpY2Vfc2V0X29wcygmZGF0YS0+aW9tbXUsICZtdGtfaW9tbXVfb3BzKTsNCisJaW9tbXVf ZGV2aWNlX3NldF9md25vZGUoJmRhdGEtPmlvbW11LCAmZGV2LT5vZl9ub2RlLT5md25vZGUpOw0K IA0KIAlyZXQgPSBpb21tdV9kZXZpY2VfcmVnaXN0ZXIoJmRhdGEtPmlvbW11KTsNCiAJaWYgKHJl dCkNCg0KDQpUaGVuLA0KVGVzdGVkLWJ5OiBZb25nIFd1IDx5b25nLnd1QG1lZGlhdGVrLmNvbT4N Cg0KPiANCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvbXRrX2lvbW11LmggYi9kcml2ZXJz L2lvbW11L210a19pb21tdS5oDQo+IGluZGV4IDEyMjkyNWRiZTU0Ny4uNjI1M2U5OGQ4MTBjIDEw MDY0NA0KPiAtLS0gYS9kcml2ZXJzL2lvbW11L210a19pb21tdS5oDQo+ICsrKyBiL2RyaXZlcnMv aW9tbXUvbXRrX2lvbW11LmgNCj4gQEAgLTY3LDggKzY3LDYgQEAgc3RydWN0IG10a19pb21tdV9k YXRhIHsNCj4gIAlzdHJ1Y3QgaW9tbXVfZGV2aWNlCQlpb21tdTsNCj4gIAljb25zdCBzdHJ1Y3Qg bXRrX2lvbW11X3BsYXRfZGF0YSAqcGxhdF9kYXRhOw0KPiAgDQo+IC0Jc3RydWN0IGRtYV9pb21t dV9tYXBwaW5nCSptYXBwaW5nOyAvKiBGb3IgbXRrX2lvbW11X3YxLmMgKi8NCj4gLQ0KPiAgCXN0 cnVjdCBsaXN0X2hlYWQJCWxpc3Q7DQo+ICAJc3RydWN0IG10a19zbWlfbGFyYl9pb21tdQlsYXJi X2ltdVtNVEtfTEFSQl9OUl9NQVhdOw0KPiAgfTsNCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9t bXUvbXRrX2lvbW11X3YxLmMgYi9kcml2ZXJzL2lvbW11L210a19pb21tdV92MS5jDQo+IGluZGV4 IDgyZGRmZTkxNzBkNC4uNDBjODliOGQzYWM0IDEwMDY0NA0KPiAtLS0gYS9kcml2ZXJzL2lvbW11 L210a19pb21tdV92MS5jDQo+ICsrKyBiL2RyaXZlcnMvaW9tbXUvbXRrX2lvbW11X3YxLmMNCj4g QEAgLTI4LDcgKzI4LDYgQEANCj4gICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+DQo+ICAjaW5jbHVk ZSA8bGludXgvc3BpbmxvY2suaD4NCj4gICNpbmNsdWRlIDxhc20vYmFycmllci5oPg0KPiAtI2lu Y2x1ZGUgPGFzbS9kbWEtaW9tbXUuaD4NCj4gICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+DQo+ICAj aW5jbHVkZSA8ZHQtYmluZGluZ3MvbWVtb3J5L210MjcwMS1sYXJiLXBvcnQuaD4NCj4gICNpbmNs dWRlIDxzb2MvbWVkaWF0ZWsvc21pLmg+DQo+IEBAIC0yNDAsMTMgKzIzOSwxOCBAQCBzdGF0aWMg c3RydWN0IGlvbW11X2RvbWFpbiAqbXRrX2lvbW11X2RvbWFpbl9hbGxvYyh1bnNpZ25lZCB0eXBl KQ0KPiAgew0KPiAgCXN0cnVjdCBtdGtfaW9tbXVfZG9tYWluICpkb207DQo+ICANCj4gLQlpZiAo dHlwZSAhPSBJT01NVV9ET01BSU5fVU5NQU5BR0VEKQ0KPiArCWlmICh0eXBlICE9IElPTU1VX0RP TUFJTl9VTk1BTkFHRUQgJiYgdHlwZSAhPSBJT01NVV9ET01BSU5fRE1BKQ0KPiAgCQlyZXR1cm4g TlVMTDsNCj4gIA0KPiAgCWRvbSA9IGt6YWxsb2Moc2l6ZW9mKCpkb20pLCBHRlBfS0VSTkVMKTsN Cj4gIAlpZiAoIWRvbSkNCj4gIAkJcmV0dXJuIE5VTEw7DQo+ICANCj4gKwlpZiAodHlwZSA9PSBJ T01NVV9ET01BSU5fRE1BICYmIGlvbW11X2dldF9kbWFfY29va2llKCZkb20tPmRvbWFpbikpIHsN Cj4gKwkJa2ZyZWUoZG9tKTsNCj4gKwkJcmV0dXJuIE5VTEw7DQo+ICsJfQ0KPiArDQo+ICAJcmV0 dXJuICZkb20tPmRvbWFpbjsNCj4gIH0NCj4gIA0KPiBAQCAtMjU3LDYgKzI2MSw3IEBAIHN0YXRp YyB2b2lkIG10a19pb21tdV9kb21haW5fZnJlZShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4p DQo+ICANCj4gIAlkbWFfZnJlZV9jb2hlcmVudChkYXRhLT5kZXYsIE0yNzAxX0lPTU1VX1BHVF9T SVpFLA0KPiAgCQkJZG9tLT5wZ3RfdmEsIGRvbS0+cGd0X3BhKTsNCj4gKwlpb21tdV9wdXRfZG1h X2Nvb2tpZShkb21haW4pOw0KPiAgCWtmcmVlKHRvX210a19kb21haW4oZG9tYWluKSk7DQo+ICB9 DQo+ICANCj4gQEAgLTI2NSwxNCArMjcwLDggQEAgc3RhdGljIGludCBtdGtfaW9tbXVfYXR0YWNo X2RldmljZShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sDQo+ICB7DQo+ICAJc3RydWN0IG10 a19pb21tdV9kYXRhICpkYXRhID0gZGV2X2lvbW11X3ByaXZfZ2V0KGRldik7DQo+ICAJc3RydWN0 IG10a19pb21tdV9kb21haW4gKmRvbSA9IHRvX210a19kb21haW4oZG9tYWluKTsNCj4gLQlzdHJ1 Y3QgZG1hX2lvbW11X21hcHBpbmcgKm10a19tYXBwaW5nOw0KPiAgCWludCByZXQ7DQo+ICANCj4g LQkvKiBPbmx5IGFsbG93IHRoZSBkb21haW4gY3JlYXRlZCBpbnRlcm5hbGx5LiAqLw0KPiAtCW10 a19tYXBwaW5nID0gZGF0YS0+bWFwcGluZzsNCj4gLQlpZiAobXRrX21hcHBpbmctPmRvbWFpbiAh PSBkb21haW4pDQo+IC0JCXJldHVybiAwOw0KPiAtDQo+ICAJaWYgKCFkYXRhLT5tNHVfZG9tKSB7 DQo+ICAJCWRhdGEtPm00dV9kb20gPSBkb207DQo+ICAJCXJldCA9IG10a19pb21tdV9kb21haW5f ZmluYWxpc2UoZGF0YSk7DQo+IEBAIC0zNTgsMTggKzM1NywzOSBAQCBzdGF0aWMgcGh5c19hZGRy X3QgbXRrX2lvbW11X2lvdmFfdG9fcGh5cyhzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sDQo+ ICANCj4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW9tbXVfb3BzIG10a19pb21tdV9vcHM7DQo+ICAN Cj4gLS8qDQo+IC0gKiBNVEsgZ2VuZXJhdGlvbiBvbmUgaW9tbXUgSFcgb25seSBzdXBwb3J0IG9u ZSBpb21tdSBkb21haW4sIGFuZCBhbGwgdGhlIGNsaWVudA0KPiAtICogc2hhcmluZyB0aGUgc2Ft ZSBpb3ZhIGFkZHJlc3Mgc3BhY2UuDQo+IC0gKi8NCj4gLXN0YXRpYyBpbnQgbXRrX2lvbW11X2Ny ZWF0ZV9tYXBwaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwNCj4gLQkJCQkgICAgc3RydWN0IG9mX3Bo YW5kbGVfYXJncyAqYXJncykNCj4gK3N0YXRpYyBzdHJ1Y3QgaW9tbXVfZGV2aWNlICptdGtfaW9t bXVfcHJvYmVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikNCj4gIHsNCj4gIAlzdHJ1Y3QgaW9t bXVfZndzcGVjICpmd3NwZWMgPSBkZXZfaW9tbXVfZndzcGVjX2dldChkZXYpOw0KPiAgCXN0cnVj dCBtdGtfaW9tbXVfZGF0YSAqZGF0YTsNCj4gKw0KPiArCWlmICghZndzcGVjIHx8IGZ3c3BlYy0+ b3BzICE9ICZtdGtfaW9tbXVfb3BzKQ0KPiArCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsgLyog Tm90IGEgaW9tbXUgY2xpZW50IGRldmljZSAqLw0KPiArDQo+ICsJZGF0YSA9IGRldl9pb21tdV9w cml2X2dldChkZXYpOw0KPiArDQo+ICsJcmV0dXJuICZkYXRhLT5pb21tdTsNCj4gK30NCj4gKw0K PiArc3RhdGljIHZvaWQgbXRrX2lvbW11X3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRl dikNCj4gK3sNCj4gKwlzdHJ1Y3QgaW9tbXVfZndzcGVjICpmd3NwZWMgPSBkZXZfaW9tbXVfZndz cGVjX2dldChkZXYpOw0KPiArDQo+ICsJaWYgKCFmd3NwZWMgfHwgZndzcGVjLT5vcHMgIT0gJm10 a19pb21tdV9vcHMpDQo+ICsJCXJldHVybjsNCj4gKw0KPiArCWlvbW11X2Z3c3BlY19mcmVlKGRl dik7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBzdHJ1Y3QgaW9tbXVfZ3JvdXAgKm10a19pb21tdV9k ZXZpY2VfZ3JvdXAoc3RydWN0IGRldmljZSAqZGV2KQ0KPiArew0KPiArCXN0cnVjdCBtdGtfaW9t bXVfZGF0YSAqZGF0YSA9IGRldl9pb21tdV9wcml2X2dldChkZXYpOw0KPiArDQo+ICsJcmV0dXJu IGlvbW11X2dyb3VwX3JlZl9nZXQoZGF0YS0+bTR1X2dyb3VwKTsNCj4gK30NCj4gKw0KPiArc3Rh dGljIGludCBtdGtfaW9tbXVfb2ZfeGxhdGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgb2Zf cGhhbmRsZV9hcmdzICphcmdzKQ0KPiArew0KPiAgCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm00 dXBkZXY7DQo+IC0Jc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nICptdGtfbWFwcGluZzsNCj4gLQlp bnQgcmV0Ow0KPiAgDQo+ICAJaWYgKGFyZ3MtPmFyZ3NfY291bnQgIT0gMSkgew0KPiAgCQlkZXZf ZXJyKGRldiwgImludmFsaWQgI2lvbW11LWNlbGxzKCVkKSBwcm9wZXJ0eSBmb3IgSU9NTVVcbiIs DQo+IEBAIC0zNzcsMTUgKzM5Nyw2IEBAIHN0YXRpYyBpbnQgbXRrX2lvbW11X2NyZWF0ZV9tYXBw aW5nKHN0cnVjdCBkZXZpY2UgKmRldiwNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+ICAJfQ0KPiAg DQo+IC0JaWYgKCFmd3NwZWMpIHsNCj4gLQkJcmV0ID0gaW9tbXVfZndzcGVjX2luaXQoZGV2LCAm YXJncy0+bnAtPmZ3bm9kZSwgJm10a19pb21tdV9vcHMpOw0KPiAtCQlpZiAocmV0KQ0KPiAtCQkJ cmV0dXJuIHJldDsNCj4gLQkJZndzcGVjID0gZGV2X2lvbW11X2Z3c3BlY19nZXQoZGV2KTsNCj4g LQl9IGVsc2UgaWYgKGRldl9pb21tdV9md3NwZWNfZ2V0KGRldiktPm9wcyAhPSAmbXRrX2lvbW11 X29wcykgew0KPiAtCQlyZXR1cm4gLUVJTlZBTDsNCj4gLQl9DQo+IC0NCj4gIAlpZiAoIWRldl9p b21tdV9wcml2X2dldChkZXYpKSB7DQo+ICAJCS8qIEdldCB0aGUgbTR1IGRldmljZSAqLw0KPiAg CQltNHVwZGV2ID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShhcmdzLT5ucCk7DQo+IEBAIC0zOTUs ODMgKzQwNiw3IEBAIHN0YXRpYyBpbnQgbXRrX2lvbW11X2NyZWF0ZV9tYXBwaW5nKHN0cnVjdCBk ZXZpY2UgKmRldiwNCj4gIAkJZGV2X2lvbW11X3ByaXZfc2V0KGRldiwgcGxhdGZvcm1fZ2V0X2Ry dmRhdGEobTR1cGRldikpOw0KPiAgCX0NCj4gIA0KPiAtCXJldCA9IGlvbW11X2Z3c3BlY19hZGRf aWRzKGRldiwgYXJncy0+YXJncywgMSk7DQo+IC0JaWYgKHJldCkNCj4gLQkJcmV0dXJuIHJldDsN Cj4gLQ0KPiAtCWRhdGEgPSBkZXZfaW9tbXVfcHJpdl9nZXQoZGV2KTsNCj4gLQltdGtfbWFwcGlu ZyA9IGRhdGEtPm1hcHBpbmc7DQo+IC0JaWYgKCFtdGtfbWFwcGluZykgew0KPiAtCQkvKiBNVEsg aW9tbXUgc3VwcG9ydCA0R0IgaW92YSBhZGRyZXNzIHNwYWNlLiAqLw0KPiAtCQltdGtfbWFwcGlu ZyA9IGFybV9pb21tdV9jcmVhdGVfbWFwcGluZygmcGxhdGZvcm1fYnVzX3R5cGUsDQo+IC0JCQkJ CQkwLCAxVUxMIDw8IDMyKTsNCj4gLQkJaWYgKElTX0VSUihtdGtfbWFwcGluZykpDQo+IC0JCQly ZXR1cm4gUFRSX0VSUihtdGtfbWFwcGluZyk7DQo+IC0NCj4gLQkJZGF0YS0+bWFwcGluZyA9IG10 a19tYXBwaW5nOw0KPiAtCX0NCj4gLQ0KPiAtCXJldHVybiAwOw0KPiAtfQ0KPiAtDQo+IC1zdGF0 aWMgaW50IG10a19pb21tdV9kZWZfZG9tYWluX3R5cGUoc3RydWN0IGRldmljZSAqZGV2KQ0KPiAt ew0KPiAtCXJldHVybiBJT01NVV9ET01BSU5fVU5NQU5BR0VEOw0KPiAtfQ0KPiAtDQo+IC1zdGF0 aWMgc3RydWN0IGlvbW11X2RldmljZSAqbXRrX2lvbW11X3Byb2JlX2RldmljZShzdHJ1Y3QgZGV2 aWNlICpkZXYpDQo+IC17DQo+IC0Jc3RydWN0IGlvbW11X2Z3c3BlYyAqZndzcGVjID0gZGV2X2lv bW11X2Z3c3BlY19nZXQoZGV2KTsNCj4gLQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIGlvbW11X3Nw ZWM7DQo+IC0Jc3RydWN0IG9mX3BoYW5kbGVfaXRlcmF0b3IgaXQ7DQo+IC0Jc3RydWN0IG10a19p b21tdV9kYXRhICpkYXRhOw0KPiAtCWludCBlcnI7DQo+IC0NCj4gLQlvZl9mb3JfZWFjaF9waGFu ZGxlKCZpdCwgZXJyLCBkZXYtPm9mX25vZGUsICJpb21tdXMiLA0KPiAtCQkJIiNpb21tdS1jZWxs cyIsIC0xKSB7DQo+IC0JCWludCBjb3VudCA9IG9mX3BoYW5kbGVfaXRlcmF0b3JfYXJncygmaXQs IGlvbW11X3NwZWMuYXJncywNCj4gLQkJCQkJTUFYX1BIQU5ETEVfQVJHUyk7DQo+IC0JCWlvbW11 X3NwZWMubnAgPSBvZl9ub2RlX2dldChpdC5ub2RlKTsNCj4gLQkJaW9tbXVfc3BlYy5hcmdzX2Nv dW50ID0gY291bnQ7DQo+IC0NCj4gLQkJbXRrX2lvbW11X2NyZWF0ZV9tYXBwaW5nKGRldiwgJmlv bW11X3NwZWMpOw0KPiAtDQo+IC0JCS8qIGRldi0+aW9tbXVfZndzcGVjIG1pZ2h0IGhhdmUgY2hh bmdlZCAqLw0KPiAtCQlmd3NwZWMgPSBkZXZfaW9tbXVfZndzcGVjX2dldChkZXYpOw0KPiAtDQo+ IC0JCW9mX25vZGVfcHV0KGlvbW11X3NwZWMubnApOw0KPiAtCX0NCj4gLQ0KPiAtCWlmICghZndz cGVjIHx8IGZ3c3BlYy0+b3BzICE9ICZtdGtfaW9tbXVfb3BzKQ0KPiAtCQlyZXR1cm4gRVJSX1BU UigtRU5PREVWKTsgLyogTm90IGEgaW9tbXUgY2xpZW50IGRldmljZSAqLw0KPiAtDQo+IC0JZGF0 YSA9IGRldl9pb21tdV9wcml2X2dldChkZXYpOw0KPiAtDQo+IC0JcmV0dXJuICZkYXRhLT5pb21t dTsNCj4gLX0NCj4gLQ0KPiAtc3RhdGljIHZvaWQgbXRrX2lvbW11X3Byb2JlX2ZpbmFsaXplKHN0 cnVjdCBkZXZpY2UgKmRldikNCj4gLXsNCj4gLQlzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm10 a19tYXBwaW5nOw0KPiAtCXN0cnVjdCBtdGtfaW9tbXVfZGF0YSAqZGF0YTsNCj4gLQlpbnQgZXJy Ow0KPiAtDQo+IC0JZGF0YSAgICAgICAgPSBkZXZfaW9tbXVfcHJpdl9nZXQoZGV2KTsNCj4gLQlt dGtfbWFwcGluZyA9IGRhdGEtPm1hcHBpbmc7DQo+IC0NCj4gLQllcnIgPSBhcm1faW9tbXVfYXR0 YWNoX2RldmljZShkZXYsIG10a19tYXBwaW5nKTsNCj4gLQlpZiAoZXJyKQ0KPiAtCQlkZXZfZXJy KGRldiwgIkNhbid0IGNyZWF0ZSBJT01NVSBtYXBwaW5nIC0gRE1BLU9QUyB3aWxsIG5vdCB3b3Jr XG4iKTsNCj4gLX0NCj4gLQ0KPiAtc3RhdGljIHZvaWQgbXRrX2lvbW11X3JlbGVhc2VfZGV2aWNl KHN0cnVjdCBkZXZpY2UgKmRldikNCj4gLXsNCj4gLQlzdHJ1Y3QgaW9tbXVfZndzcGVjICpmd3Nw ZWMgPSBkZXZfaW9tbXVfZndzcGVjX2dldChkZXYpOw0KPiAtDQo+IC0JaWYgKCFmd3NwZWMgfHwg ZndzcGVjLT5vcHMgIT0gJm10a19pb21tdV9vcHMpDQo+IC0JCXJldHVybjsNCj4gLQ0KPiAtCWlv bW11X2Z3c3BlY19mcmVlKGRldik7DQo+ICsJcmV0dXJuIGlvbW11X2Z3c3BlY19hZGRfaWRzKGRl diwgYXJncy0+YXJncywgMSk7DQo+ICB9DQo+ICANCj4gIHN0YXRpYyBpbnQgbXRrX2lvbW11X2h3 X2luaXQoY29uc3Qgc3RydWN0IG10a19pb21tdV9kYXRhICpkYXRhKQ0KPiBAQCAtNTI0LDEwICs0 NTksOSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGlvbW11X29wcyBtdGtfaW9tbXVfb3BzID0gew0K PiAgCS51bm1hcAkJPSBtdGtfaW9tbXVfdW5tYXAsDQo+ICAJLmlvdmFfdG9fcGh5cwk9IG10a19p b21tdV9pb3ZhX3RvX3BoeXMsDQo+ICAJLnByb2JlX2RldmljZQk9IG10a19pb21tdV9wcm9iZV9k ZXZpY2UsDQo+IC0JLnByb2JlX2ZpbmFsaXplID0gbXRrX2lvbW11X3Byb2JlX2ZpbmFsaXplLA0K PiAgCS5yZWxlYXNlX2RldmljZQk9IG10a19pb21tdV9yZWxlYXNlX2RldmljZSwNCj4gLQkuZGVm X2RvbWFpbl90eXBlID0gbXRrX2lvbW11X2RlZl9kb21haW5fdHlwZSwNCj4gLQkuZGV2aWNlX2dy b3VwCT0gZ2VuZXJpY19kZXZpY2VfZ3JvdXAsDQo+ICsJLmRldmljZV9ncm91cAk9IG10a19pb21t dV9kZXZpY2VfZ3JvdXAsDQo+ICsJLm9mX3hsYXRlCT0gbXRrX2lvbW11X29mX3hsYXRlLA0KPiAg CS5wZ3NpemVfYml0bWFwCT0gfjBVTCA8PCBNVDI3MDFfSU9NTVVfUEFHRV9TSElGVCwNCj4gIH07 DQo+ICANCj4gQEAgLTYyNiw2ICs1NjAsMTQgQEAgc3RhdGljIGludCBtdGtfaW9tbXVfcHJvYmUo c3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCj4gIAlpZiAocmV0KQ0KPiAgCQlyZXR1cm4g cmV0Ow0KPiAgDQo+ICsJLyoNCj4gKwkgKiBNVEsgZ2VuZXJhdGlvbiBvbmUgaW9tbXUgSFcgb25s eSBzdXBwb3J0IG9uZSBpb21tdSBkb21haW4sDQo+ICsJICogYW5kIGFsbCB0aGUgY2xpZW50IHNo YXJpbmcgdGhlIHNhbWUgaW92YSBhZGRyZXNzIHNwYWNlLg0KPiArCSAqLw0KPiArCWRhdGEtPm00 dV9ncm91cCA9IGlvbW11X2dyb3VwX2FsbG9jKCk7DQo+ICsJaWYgKElTX0VSUihkYXRhLT5tNHVf Z3JvdXApKQ0KPiArCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5tNHVfZ3JvdXApOw0KPiArDQo+ICAJ aWYgKCFpb21tdV9wcmVzZW50KCZwbGF0Zm9ybV9idXNfdHlwZSkpDQo+ICAJCWJ1c19zZXRfaW9t bXUoJnBsYXRmb3JtX2J1c190eXBlLCAgJm10a19pb21tdV9vcHMpOw0KPiAgDQo+IEBAIC02MzYs NiArNTc4LDcgQEAgc3RhdGljIGludCBtdGtfaW9tbXVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYpDQo+ICB7DQo+ICAJc3RydWN0IG10a19pb21tdV9kYXRhICpkYXRhID0gcGxh dGZvcm1fZ2V0X2RydmRhdGEocGRldik7DQo+ICANCj4gKwlpb21tdV9ncm91cF9wdXQoZGF0YS0+ bTR1X2dyb3VwKTsNCj4gIAlpb21tdV9kZXZpY2Vfc3lzZnNfcmVtb3ZlKCZkYXRhLT5pb21tdSk7 DQo+ICAJaW9tbXVfZGV2aWNlX3VucmVnaXN0ZXIoJmRhdGEtPmlvbW11KTsNCj4gIA0KDQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-11.0 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,USER_AGENT_SANE_2 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EB7D3C433E2 for ; Sat, 29 Aug 2020 10:01:39 +0000 (UTC) Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B123820825 for ; Sat, 29 Aug 2020 10:01:39 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="iJqgYe2I" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B123820825 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=iommu-bounces@lists.linux-foundation.org Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 50E3587730; Sat, 29 Aug 2020 10:01:39 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id hdwD1E3Mg66m; Sat, 29 Aug 2020 10:01:37 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 90A50875A2; Sat, 29 Aug 2020 10:01:37 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 5FA70C07FF; Sat, 29 Aug 2020 10:01:37 +0000 (UTC) Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 8B360C0051 for ; Sat, 29 Aug 2020 10:01:35 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 778E085F6C for ; Sat, 29 Aug 2020 10:01:35 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id pER1t7DSK40N for ; Sat, 29 Aug 2020 10:01:33 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from mailgw02.mediatek.com (unknown [1.203.163.81]) by fraxinus.osuosl.org (Postfix) with ESMTP id C759D85F61 for ; Sat, 29 Aug 2020 10:01:32 +0000 (UTC) X-UUID: 06a97a601b30491ab643e29003ee3d10-20200829 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=YQ4nWNJaU2/84I56GfA7izeF71Nu7GxMGRIJ/4QLhhI=; b=iJqgYe2INoU7y5RbgeFWvqv7yXDT7wXXuH6QVWH8MwimigaAtcURtEZCqOdT81bfUhVmsmSMN0cgKkkduDX0H0CGIdSOMIeqyALhmkFm3cZq6FZ8b5Y573JvKeY6fGwQjf1MnghwP2HLQpe0YZOO0SZ+7z8XJSjwGZQ7GXZNHEA=; X-UUID: 06a97a601b30491ab643e29003ee3d10-20200829 Received: from mtkcas35.mediatek.inc [(172.27.4.253)] by mailgw02.mediatek.com (envelope-from ) (mailgw01.mediatek.com ESMTP with TLS) with ESMTP id 818620872; Sat, 29 Aug 2020 17:56:23 +0800 Received: from MTKCAS36.mediatek.inc (172.27.4.186) by MTKMBS31N1.mediatek.inc (172.27.4.69) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sat, 29 Aug 2020 17:56:20 +0800 Received: from [10.17.3.153] (10.17.3.153) by MTKCAS36.mediatek.inc (172.27.4.170) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sat, 29 Aug 2020 17:56:20 +0800 Message-ID: <1598694891.19851.12.camel@mhfsdcap03> Subject: Re: [PATCH 09/18] iommu/mediatek-v1: Add IOMMU_DOMAIN_DMA support From: Yong Wu To: Robin Murphy Date: Sat, 29 Aug 2020 17:54:51 +0800 In-Reply-To: References: X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-TM-SNTS-SMTP: AA63C797C93CBD61B254A639A39F87490728FF8037E9BB375825F26FABF9D7122000:8 X-MTK: N Cc: geert+renesas@glider.be, dri-devel@lists.freedesktop.org, linux-tegra@vger.kernel.org, thierry.reding@gmail.com, laurent.pinchart@ideasonboard.com, digetx@gmail.com, will@kernel.org, hch@lst.de, linux-samsung-soc@vger.kernel.org, magnus.damm@gmail.com, linux@armlinux.org.uk, jonathanh@nvidia.com, agross@kernel.org, kyungmin.park@samsung.com, linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, inki.dae@samsung.com, linux-mediatek@lists.infradead.org, matthias.bgg@gmail.com, linux-arm-kernel@lists.infradead.org, sw0312.kim@samsung.com, linux-kernel@vger.kernel.org, t-kristo@ti.com, iommu@lists.linux-foundation.org X-BeenThere: iommu@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Development issues for Linux IOMMU support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: iommu-bounces@lists.linux-foundation.org Sender: "iommu" On Thu, 2020-08-20 at 16:08 +0100, Robin Murphy wrote: > Now that arch/arm is wired up for default domains and iommu-dma, > implement the corresponding driver-side support for groups and DMA > domains to replace the shared mapping workaround. > > Signed-off-by: Robin Murphy > --- > drivers/iommu/mtk_iommu.h | 2 - > drivers/iommu/mtk_iommu_v1.c | 153 +++++++++++------------------------ > 2 files changed, 48 insertions(+), 107 deletions(-) Hi Robin, Thanks very much for this patch, It makes the code much cleaner. Please help squash the little change in this patch, --- a/drivers/iommu/mtk_iommu_v1.c +++ b/drivers/iommu/mtk_iommu_v1.c @@ -555,6 +555,7 @@ static int mtk_iommu_probe(struct platform_device *pdev) return ret; iommu_device_set_ops(&data->iommu, &mtk_iommu_ops); + iommu_device_set_fwnode(&data->iommu, &dev->of_node->fwnode); ret = iommu_device_register(&data->iommu); if (ret) Then, Tested-by: Yong Wu > > diff --git a/drivers/iommu/mtk_iommu.h b/drivers/iommu/mtk_iommu.h > index 122925dbe547..6253e98d810c 100644 > --- a/drivers/iommu/mtk_iommu.h > +++ b/drivers/iommu/mtk_iommu.h > @@ -67,8 +67,6 @@ struct mtk_iommu_data { > struct iommu_device iommu; > const struct mtk_iommu_plat_data *plat_data; > > - struct dma_iommu_mapping *mapping; /* For mtk_iommu_v1.c */ > - > struct list_head list; > struct mtk_smi_larb_iommu larb_imu[MTK_LARB_NR_MAX]; > }; > diff --git a/drivers/iommu/mtk_iommu_v1.c b/drivers/iommu/mtk_iommu_v1.c > index 82ddfe9170d4..40c89b8d3ac4 100644 > --- a/drivers/iommu/mtk_iommu_v1.c > +++ b/drivers/iommu/mtk_iommu_v1.c > @@ -28,7 +28,6 @@ > #include > #include > #include > -#include > #include > #include > #include > @@ -240,13 +239,18 @@ static struct iommu_domain *mtk_iommu_domain_alloc(unsigned type) > { > struct mtk_iommu_domain *dom; > > - if (type != IOMMU_DOMAIN_UNMANAGED) > + if (type != IOMMU_DOMAIN_UNMANAGED && type != IOMMU_DOMAIN_DMA) > return NULL; > > dom = kzalloc(sizeof(*dom), GFP_KERNEL); > if (!dom) > return NULL; > > + if (type == IOMMU_DOMAIN_DMA && iommu_get_dma_cookie(&dom->domain)) { > + kfree(dom); > + return NULL; > + } > + > return &dom->domain; > } > > @@ -257,6 +261,7 @@ static void mtk_iommu_domain_free(struct iommu_domain *domain) > > dma_free_coherent(data->dev, M2701_IOMMU_PGT_SIZE, > dom->pgt_va, dom->pgt_pa); > + iommu_put_dma_cookie(domain); > kfree(to_mtk_domain(domain)); > } > > @@ -265,14 +270,8 @@ static int mtk_iommu_attach_device(struct iommu_domain *domain, > { > struct mtk_iommu_data *data = dev_iommu_priv_get(dev); > struct mtk_iommu_domain *dom = to_mtk_domain(domain); > - struct dma_iommu_mapping *mtk_mapping; > int ret; > > - /* Only allow the domain created internally. */ > - mtk_mapping = data->mapping; > - if (mtk_mapping->domain != domain) > - return 0; > - > if (!data->m4u_dom) { > data->m4u_dom = dom; > ret = mtk_iommu_domain_finalise(data); > @@ -358,18 +357,39 @@ static phys_addr_t mtk_iommu_iova_to_phys(struct iommu_domain *domain, > > static const struct iommu_ops mtk_iommu_ops; > > -/* > - * MTK generation one iommu HW only support one iommu domain, and all the client > - * sharing the same iova address space. > - */ > -static int mtk_iommu_create_mapping(struct device *dev, > - struct of_phandle_args *args) > +static struct iommu_device *mtk_iommu_probe_device(struct device *dev) > { > struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > struct mtk_iommu_data *data; > + > + if (!fwspec || fwspec->ops != &mtk_iommu_ops) > + return ERR_PTR(-ENODEV); /* Not a iommu client device */ > + > + data = dev_iommu_priv_get(dev); > + > + return &data->iommu; > +} > + > +static void mtk_iommu_release_device(struct device *dev) > +{ > + struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > + > + if (!fwspec || fwspec->ops != &mtk_iommu_ops) > + return; > + > + iommu_fwspec_free(dev); > +} > + > +static struct iommu_group *mtk_iommu_device_group(struct device *dev) > +{ > + struct mtk_iommu_data *data = dev_iommu_priv_get(dev); > + > + return iommu_group_ref_get(data->m4u_group); > +} > + > +static int mtk_iommu_of_xlate(struct device *dev, struct of_phandle_args *args) > +{ > struct platform_device *m4updev; > - struct dma_iommu_mapping *mtk_mapping; > - int ret; > > if (args->args_count != 1) { > dev_err(dev, "invalid #iommu-cells(%d) property for IOMMU\n", > @@ -377,15 +397,6 @@ static int mtk_iommu_create_mapping(struct device *dev, > return -EINVAL; > } > > - if (!fwspec) { > - ret = iommu_fwspec_init(dev, &args->np->fwnode, &mtk_iommu_ops); > - if (ret) > - return ret; > - fwspec = dev_iommu_fwspec_get(dev); > - } else if (dev_iommu_fwspec_get(dev)->ops != &mtk_iommu_ops) { > - return -EINVAL; > - } > - > if (!dev_iommu_priv_get(dev)) { > /* Get the m4u device */ > m4updev = of_find_device_by_node(args->np); > @@ -395,83 +406,7 @@ static int mtk_iommu_create_mapping(struct device *dev, > dev_iommu_priv_set(dev, platform_get_drvdata(m4updev)); > } > > - ret = iommu_fwspec_add_ids(dev, args->args, 1); > - if (ret) > - return ret; > - > - data = dev_iommu_priv_get(dev); > - mtk_mapping = data->mapping; > - if (!mtk_mapping) { > - /* MTK iommu support 4GB iova address space. */ > - mtk_mapping = arm_iommu_create_mapping(&platform_bus_type, > - 0, 1ULL << 32); > - if (IS_ERR(mtk_mapping)) > - return PTR_ERR(mtk_mapping); > - > - data->mapping = mtk_mapping; > - } > - > - return 0; > -} > - > -static int mtk_iommu_def_domain_type(struct device *dev) > -{ > - return IOMMU_DOMAIN_UNMANAGED; > -} > - > -static struct iommu_device *mtk_iommu_probe_device(struct device *dev) > -{ > - struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > - struct of_phandle_args iommu_spec; > - struct of_phandle_iterator it; > - struct mtk_iommu_data *data; > - int err; > - > - of_for_each_phandle(&it, err, dev->of_node, "iommus", > - "#iommu-cells", -1) { > - int count = of_phandle_iterator_args(&it, iommu_spec.args, > - MAX_PHANDLE_ARGS); > - iommu_spec.np = of_node_get(it.node); > - iommu_spec.args_count = count; > - > - mtk_iommu_create_mapping(dev, &iommu_spec); > - > - /* dev->iommu_fwspec might have changed */ > - fwspec = dev_iommu_fwspec_get(dev); > - > - of_node_put(iommu_spec.np); > - } > - > - if (!fwspec || fwspec->ops != &mtk_iommu_ops) > - return ERR_PTR(-ENODEV); /* Not a iommu client device */ > - > - data = dev_iommu_priv_get(dev); > - > - return &data->iommu; > -} > - > -static void mtk_iommu_probe_finalize(struct device *dev) > -{ > - struct dma_iommu_mapping *mtk_mapping; > - struct mtk_iommu_data *data; > - int err; > - > - data = dev_iommu_priv_get(dev); > - mtk_mapping = data->mapping; > - > - err = arm_iommu_attach_device(dev, mtk_mapping); > - if (err) > - dev_err(dev, "Can't create IOMMU mapping - DMA-OPS will not work\n"); > -} > - > -static void mtk_iommu_release_device(struct device *dev) > -{ > - struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > - > - if (!fwspec || fwspec->ops != &mtk_iommu_ops) > - return; > - > - iommu_fwspec_free(dev); > + return iommu_fwspec_add_ids(dev, args->args, 1); > } > > static int mtk_iommu_hw_init(const struct mtk_iommu_data *data) > @@ -524,10 +459,9 @@ static const struct iommu_ops mtk_iommu_ops = { > .unmap = mtk_iommu_unmap, > .iova_to_phys = mtk_iommu_iova_to_phys, > .probe_device = mtk_iommu_probe_device, > - .probe_finalize = mtk_iommu_probe_finalize, > .release_device = mtk_iommu_release_device, > - .def_domain_type = mtk_iommu_def_domain_type, > - .device_group = generic_device_group, > + .device_group = mtk_iommu_device_group, > + .of_xlate = mtk_iommu_of_xlate, > .pgsize_bitmap = ~0UL << MT2701_IOMMU_PAGE_SHIFT, > }; > > @@ -626,6 +560,14 @@ static int mtk_iommu_probe(struct platform_device *pdev) > if (ret) > return ret; > > + /* > + * MTK generation one iommu HW only support one iommu domain, > + * and all the client sharing the same iova address space. > + */ > + data->m4u_group = iommu_group_alloc(); > + if (IS_ERR(data->m4u_group)) > + return PTR_ERR(data->m4u_group); > + > if (!iommu_present(&platform_bus_type)) > bus_set_iommu(&platform_bus_type, &mtk_iommu_ops); > > @@ -636,6 +578,7 @@ static int mtk_iommu_remove(struct platform_device *pdev) > { > struct mtk_iommu_data *data = platform_get_drvdata(pdev); > > + iommu_group_put(data->m4u_group); > iommu_device_sysfs_remove(&data->iommu); > iommu_device_unregister(&data->iommu); > _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4D328C433E6 for ; Sat, 29 Aug 2020 10:06:54 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 04AF220825 for ; Sat, 29 Aug 2020 10:06:53 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="B1F0LlKI"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="iJqgYe2I" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 04AF220825 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Date:To:From: Subject:Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=WElBoCNcCDNUlW0IXeWT4jzvkByrHNdyTdFO5LnG+GM=; b=B1F0LlKItBwSCqDUGx3MPH/7m B7kFXDzOTfUW583syh28uOnUldsLaqWOwfCtqOSn17JGw59BfFqePPW9ZSUNdpjxN+NxyRr3L2kmc BRGMf6p1+9uYjN/woP/MxpkmkEIM41cB5rhG9MhyQdnLGZnh6CQ7rpBmG+EkTnUZp6xHLxU2eMaa5 FSc0HsN/NZldxSoQkV1nNKW1yLQsYZzii9SAtzLZ//7lKuXu0KzjWBZEltmEHYfRY+dtzy/5RDwWW Q1zKb6ekPBP7N75qv3MLi96yaK+Ru0lZBoiEl7VQ3QNV9WnNmjkOeUPyA2WlibapgZU+1ztT0ttKh UR2gJz+aA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kBxkv-0003Mh-Vv; Sat, 29 Aug 2020 10:06:42 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kBxkr-0003Ld-35; Sat, 29 Aug 2020 10:06:38 +0000 X-UUID: 60bc2226bf494daa84bb4c54766162bc-20200829 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=YQ4nWNJaU2/84I56GfA7izeF71Nu7GxMGRIJ/4QLhhI=; b=iJqgYe2INoU7y5RbgeFWvqv7yXDT7wXXuH6QVWH8MwimigaAtcURtEZCqOdT81bfUhVmsmSMN0cgKkkduDX0H0CGIdSOMIeqyALhmkFm3cZq6FZ8b5Y573JvKeY6fGwQjf1MnghwP2HLQpe0YZOO0SZ+7z8XJSjwGZQ7GXZNHEA=; X-UUID: 60bc2226bf494daa84bb4c54766162bc-20200829 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 1895685805; Sat, 29 Aug 2020 02:06:27 -0800 Received: from MTKMBS31N1.mediatek.inc (172.27.4.69) by MTKMBS62N2.mediatek.inc (172.29.193.42) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sat, 29 Aug 2020 02:56:24 -0700 Received: from MTKCAS36.mediatek.inc (172.27.4.186) by MTKMBS31N1.mediatek.inc (172.27.4.69) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sat, 29 Aug 2020 17:56:20 +0800 Received: from [10.17.3.153] (10.17.3.153) by MTKCAS36.mediatek.inc (172.27.4.170) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sat, 29 Aug 2020 17:56:20 +0800 Message-ID: <1598694891.19851.12.camel@mhfsdcap03> Subject: Re: [PATCH 09/18] iommu/mediatek-v1: Add IOMMU_DOMAIN_DMA support From: Yong Wu To: Robin Murphy Date: Sat, 29 Aug 2020 17:54:51 +0800 In-Reply-To: References: X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-TM-SNTS-SMTP: AA63C797C93CBD61B254A639A39F87490728FF8037E9BB375825F26FABF9D7122000:8 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200829_060637_615288_3705DA3C X-CRM114-Status: GOOD ( 29.14 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: geert+renesas@glider.be, dri-devel@lists.freedesktop.org, bjorn.andersson@linaro.org, linux-tegra@vger.kernel.org, thierry.reding@gmail.com, laurent.pinchart@ideasonboard.com, digetx@gmail.com, s-anna@ti.com, will@kernel.org, hch@lst.de, m.szyprowski@samsung.com, linux-samsung-soc@vger.kernel.org, joro@8bytes.org, magnus.damm@gmail.com, linux@armlinux.org.uk, jonathanh@nvidia.com, agross@kernel.org, kyungmin.park@samsung.com, linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, inki.dae@samsung.com, vdumpa@nvidia.com, linux-mediatek@lists.infradead.org, matthias.bgg@gmail.com, linux-arm-kernel@lists.infradead.org, sw0312.kim@samsung.com, linux-kernel@vger.kernel.org, t-kristo@ti.com, iommu@lists.linux-foundation.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org On Thu, 2020-08-20 at 16:08 +0100, Robin Murphy wrote: > Now that arch/arm is wired up for default domains and iommu-dma, > implement the corresponding driver-side support for groups and DMA > domains to replace the shared mapping workaround. > > Signed-off-by: Robin Murphy > --- > drivers/iommu/mtk_iommu.h | 2 - > drivers/iommu/mtk_iommu_v1.c | 153 +++++++++++------------------------ > 2 files changed, 48 insertions(+), 107 deletions(-) Hi Robin, Thanks very much for this patch, It makes the code much cleaner. Please help squash the little change in this patch, --- a/drivers/iommu/mtk_iommu_v1.c +++ b/drivers/iommu/mtk_iommu_v1.c @@ -555,6 +555,7 @@ static int mtk_iommu_probe(struct platform_device *pdev) return ret; iommu_device_set_ops(&data->iommu, &mtk_iommu_ops); + iommu_device_set_fwnode(&data->iommu, &dev->of_node->fwnode); ret = iommu_device_register(&data->iommu); if (ret) Then, Tested-by: Yong Wu > > diff --git a/drivers/iommu/mtk_iommu.h b/drivers/iommu/mtk_iommu.h > index 122925dbe547..6253e98d810c 100644 > --- a/drivers/iommu/mtk_iommu.h > +++ b/drivers/iommu/mtk_iommu.h > @@ -67,8 +67,6 @@ struct mtk_iommu_data { > struct iommu_device iommu; > const struct mtk_iommu_plat_data *plat_data; > > - struct dma_iommu_mapping *mapping; /* For mtk_iommu_v1.c */ > - > struct list_head list; > struct mtk_smi_larb_iommu larb_imu[MTK_LARB_NR_MAX]; > }; > diff --git a/drivers/iommu/mtk_iommu_v1.c b/drivers/iommu/mtk_iommu_v1.c > index 82ddfe9170d4..40c89b8d3ac4 100644 > --- a/drivers/iommu/mtk_iommu_v1.c > +++ b/drivers/iommu/mtk_iommu_v1.c > @@ -28,7 +28,6 @@ > #include > #include > #include > -#include > #include > #include > #include > @@ -240,13 +239,18 @@ static struct iommu_domain *mtk_iommu_domain_alloc(unsigned type) > { > struct mtk_iommu_domain *dom; > > - if (type != IOMMU_DOMAIN_UNMANAGED) > + if (type != IOMMU_DOMAIN_UNMANAGED && type != IOMMU_DOMAIN_DMA) > return NULL; > > dom = kzalloc(sizeof(*dom), GFP_KERNEL); > if (!dom) > return NULL; > > + if (type == IOMMU_DOMAIN_DMA && iommu_get_dma_cookie(&dom->domain)) { > + kfree(dom); > + return NULL; > + } > + > return &dom->domain; > } > > @@ -257,6 +261,7 @@ static void mtk_iommu_domain_free(struct iommu_domain *domain) > > dma_free_coherent(data->dev, M2701_IOMMU_PGT_SIZE, > dom->pgt_va, dom->pgt_pa); > + iommu_put_dma_cookie(domain); > kfree(to_mtk_domain(domain)); > } > > @@ -265,14 +270,8 @@ static int mtk_iommu_attach_device(struct iommu_domain *domain, > { > struct mtk_iommu_data *data = dev_iommu_priv_get(dev); > struct mtk_iommu_domain *dom = to_mtk_domain(domain); > - struct dma_iommu_mapping *mtk_mapping; > int ret; > > - /* Only allow the domain created internally. */ > - mtk_mapping = data->mapping; > - if (mtk_mapping->domain != domain) > - return 0; > - > if (!data->m4u_dom) { > data->m4u_dom = dom; > ret = mtk_iommu_domain_finalise(data); > @@ -358,18 +357,39 @@ static phys_addr_t mtk_iommu_iova_to_phys(struct iommu_domain *domain, > > static const struct iommu_ops mtk_iommu_ops; > > -/* > - * MTK generation one iommu HW only support one iommu domain, and all the client > - * sharing the same iova address space. > - */ > -static int mtk_iommu_create_mapping(struct device *dev, > - struct of_phandle_args *args) > +static struct iommu_device *mtk_iommu_probe_device(struct device *dev) > { > struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > struct mtk_iommu_data *data; > + > + if (!fwspec || fwspec->ops != &mtk_iommu_ops) > + return ERR_PTR(-ENODEV); /* Not a iommu client device */ > + > + data = dev_iommu_priv_get(dev); > + > + return &data->iommu; > +} > + > +static void mtk_iommu_release_device(struct device *dev) > +{ > + struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > + > + if (!fwspec || fwspec->ops != &mtk_iommu_ops) > + return; > + > + iommu_fwspec_free(dev); > +} > + > +static struct iommu_group *mtk_iommu_device_group(struct device *dev) > +{ > + struct mtk_iommu_data *data = dev_iommu_priv_get(dev); > + > + return iommu_group_ref_get(data->m4u_group); > +} > + > +static int mtk_iommu_of_xlate(struct device *dev, struct of_phandle_args *args) > +{ > struct platform_device *m4updev; > - struct dma_iommu_mapping *mtk_mapping; > - int ret; > > if (args->args_count != 1) { > dev_err(dev, "invalid #iommu-cells(%d) property for IOMMU\n", > @@ -377,15 +397,6 @@ static int mtk_iommu_create_mapping(struct device *dev, > return -EINVAL; > } > > - if (!fwspec) { > - ret = iommu_fwspec_init(dev, &args->np->fwnode, &mtk_iommu_ops); > - if (ret) > - return ret; > - fwspec = dev_iommu_fwspec_get(dev); > - } else if (dev_iommu_fwspec_get(dev)->ops != &mtk_iommu_ops) { > - return -EINVAL; > - } > - > if (!dev_iommu_priv_get(dev)) { > /* Get the m4u device */ > m4updev = of_find_device_by_node(args->np); > @@ -395,83 +406,7 @@ static int mtk_iommu_create_mapping(struct device *dev, > dev_iommu_priv_set(dev, platform_get_drvdata(m4updev)); > } > > - ret = iommu_fwspec_add_ids(dev, args->args, 1); > - if (ret) > - return ret; > - > - data = dev_iommu_priv_get(dev); > - mtk_mapping = data->mapping; > - if (!mtk_mapping) { > - /* MTK iommu support 4GB iova address space. */ > - mtk_mapping = arm_iommu_create_mapping(&platform_bus_type, > - 0, 1ULL << 32); > - if (IS_ERR(mtk_mapping)) > - return PTR_ERR(mtk_mapping); > - > - data->mapping = mtk_mapping; > - } > - > - return 0; > -} > - > -static int mtk_iommu_def_domain_type(struct device *dev) > -{ > - return IOMMU_DOMAIN_UNMANAGED; > -} > - > -static struct iommu_device *mtk_iommu_probe_device(struct device *dev) > -{ > - struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > - struct of_phandle_args iommu_spec; > - struct of_phandle_iterator it; > - struct mtk_iommu_data *data; > - int err; > - > - of_for_each_phandle(&it, err, dev->of_node, "iommus", > - "#iommu-cells", -1) { > - int count = of_phandle_iterator_args(&it, iommu_spec.args, > - MAX_PHANDLE_ARGS); > - iommu_spec.np = of_node_get(it.node); > - iommu_spec.args_count = count; > - > - mtk_iommu_create_mapping(dev, &iommu_spec); > - > - /* dev->iommu_fwspec might have changed */ > - fwspec = dev_iommu_fwspec_get(dev); > - > - of_node_put(iommu_spec.np); > - } > - > - if (!fwspec || fwspec->ops != &mtk_iommu_ops) > - return ERR_PTR(-ENODEV); /* Not a iommu client device */ > - > - data = dev_iommu_priv_get(dev); > - > - return &data->iommu; > -} > - > -static void mtk_iommu_probe_finalize(struct device *dev) > -{ > - struct dma_iommu_mapping *mtk_mapping; > - struct mtk_iommu_data *data; > - int err; > - > - data = dev_iommu_priv_get(dev); > - mtk_mapping = data->mapping; > - > - err = arm_iommu_attach_device(dev, mtk_mapping); > - if (err) > - dev_err(dev, "Can't create IOMMU mapping - DMA-OPS will not work\n"); > -} > - > -static void mtk_iommu_release_device(struct device *dev) > -{ > - struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > - > - if (!fwspec || fwspec->ops != &mtk_iommu_ops) > - return; > - > - iommu_fwspec_free(dev); > + return iommu_fwspec_add_ids(dev, args->args, 1); > } > > static int mtk_iommu_hw_init(const struct mtk_iommu_data *data) > @@ -524,10 +459,9 @@ static const struct iommu_ops mtk_iommu_ops = { > .unmap = mtk_iommu_unmap, > .iova_to_phys = mtk_iommu_iova_to_phys, > .probe_device = mtk_iommu_probe_device, > - .probe_finalize = mtk_iommu_probe_finalize, > .release_device = mtk_iommu_release_device, > - .def_domain_type = mtk_iommu_def_domain_type, > - .device_group = generic_device_group, > + .device_group = mtk_iommu_device_group, > + .of_xlate = mtk_iommu_of_xlate, > .pgsize_bitmap = ~0UL << MT2701_IOMMU_PAGE_SHIFT, > }; > > @@ -626,6 +560,14 @@ static int mtk_iommu_probe(struct platform_device *pdev) > if (ret) > return ret; > > + /* > + * MTK generation one iommu HW only support one iommu domain, > + * and all the client sharing the same iova address space. > + */ > + data->m4u_group = iommu_group_alloc(); > + if (IS_ERR(data->m4u_group)) > + return PTR_ERR(data->m4u_group); > + > if (!iommu_present(&platform_bus_type)) > bus_set_iommu(&platform_bus_type, &mtk_iommu_ops); > > @@ -636,6 +578,7 @@ static int mtk_iommu_remove(struct platform_device *pdev) > { > struct mtk_iommu_data *data = platform_get_drvdata(pdev); > > + iommu_group_put(data->m4u_group); > iommu_device_sysfs_remove(&data->iommu); > iommu_device_unregister(&data->iommu); > _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B43AAC433E6 for ; Sat, 29 Aug 2020 10:07:58 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7101D20825 for ; Sat, 29 Aug 2020 10:07:58 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="DRYwI/RZ"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="iJqgYe2I" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7101D20825 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Date:To:From: Subject:Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=ZYeBMe6StVbrMTXopuQ+tYJiEDu4yIZTJa+wtnCwWX8=; b=DRYwI/RZ6xMCsGk/pbYvU4yCG ZMkoaQLt/LbS9+TOAB/jc8DL6gMUIYHTeoU6Ecu0xzJq8YdG7ykOET7zSBaHu7gPESIB0UcwwoXHw RTJnFqcR6xBIZB/MbMwkhKKhEANTHbr7shFMHy6vn60LJkmaAj99qubnarzP1IgM0cCC6ewTTjr9K S00x6utZ3hWRQESkGgXOXCtP1mQA/MA6bfHhyjwSE7wBEf1AknF1mlGB+SFcOEkPkBJeRvD4F6moU AZlmfQoVFd71EWGdYuchXMKf2mCJOKGyp3wDRVX96hxF659uGIb649mP4Qnng8efXZy49sqvmvId7 dhwyFSGXw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kBxku-0003MO-Jn; Sat, 29 Aug 2020 10:06:40 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kBxkr-0003Ld-35; Sat, 29 Aug 2020 10:06:38 +0000 X-UUID: 60bc2226bf494daa84bb4c54766162bc-20200829 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=YQ4nWNJaU2/84I56GfA7izeF71Nu7GxMGRIJ/4QLhhI=; b=iJqgYe2INoU7y5RbgeFWvqv7yXDT7wXXuH6QVWH8MwimigaAtcURtEZCqOdT81bfUhVmsmSMN0cgKkkduDX0H0CGIdSOMIeqyALhmkFm3cZq6FZ8b5Y573JvKeY6fGwQjf1MnghwP2HLQpe0YZOO0SZ+7z8XJSjwGZQ7GXZNHEA=; X-UUID: 60bc2226bf494daa84bb4c54766162bc-20200829 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 1895685805; Sat, 29 Aug 2020 02:06:27 -0800 Received: from MTKMBS31N1.mediatek.inc (172.27.4.69) by MTKMBS62N2.mediatek.inc (172.29.193.42) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sat, 29 Aug 2020 02:56:24 -0700 Received: from MTKCAS36.mediatek.inc (172.27.4.186) by MTKMBS31N1.mediatek.inc (172.27.4.69) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sat, 29 Aug 2020 17:56:20 +0800 Received: from [10.17.3.153] (10.17.3.153) by MTKCAS36.mediatek.inc (172.27.4.170) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sat, 29 Aug 2020 17:56:20 +0800 Message-ID: <1598694891.19851.12.camel@mhfsdcap03> Subject: Re: [PATCH 09/18] iommu/mediatek-v1: Add IOMMU_DOMAIN_DMA support From: Yong Wu To: Robin Murphy Date: Sat, 29 Aug 2020 17:54:51 +0800 In-Reply-To: References: X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-TM-SNTS-SMTP: AA63C797C93CBD61B254A639A39F87490728FF8037E9BB375825F26FABF9D7122000:8 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200829_060637_615288_3705DA3C X-CRM114-Status: GOOD ( 29.14 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: geert+renesas@glider.be, dri-devel@lists.freedesktop.org, bjorn.andersson@linaro.org, linux-tegra@vger.kernel.org, thierry.reding@gmail.com, laurent.pinchart@ideasonboard.com, digetx@gmail.com, will@kernel.org, hch@lst.de, m.szyprowski@samsung.com, linux-samsung-soc@vger.kernel.org, joro@8bytes.org, magnus.damm@gmail.com, linux@armlinux.org.uk, jonathanh@nvidia.com, agross@kernel.org, kyungmin.park@samsung.com, linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, inki.dae@samsung.com, linux-mediatek@lists.infradead.org, matthias.bgg@gmail.com, linux-arm-kernel@lists.infradead.org, sw0312.kim@samsung.com, linux-kernel@vger.kernel.org, t-kristo@ti.com, iommu@lists.linux-foundation.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Thu, 2020-08-20 at 16:08 +0100, Robin Murphy wrote: > Now that arch/arm is wired up for default domains and iommu-dma, > implement the corresponding driver-side support for groups and DMA > domains to replace the shared mapping workaround. > > Signed-off-by: Robin Murphy > --- > drivers/iommu/mtk_iommu.h | 2 - > drivers/iommu/mtk_iommu_v1.c | 153 +++++++++++------------------------ > 2 files changed, 48 insertions(+), 107 deletions(-) Hi Robin, Thanks very much for this patch, It makes the code much cleaner. Please help squash the little change in this patch, --- a/drivers/iommu/mtk_iommu_v1.c +++ b/drivers/iommu/mtk_iommu_v1.c @@ -555,6 +555,7 @@ static int mtk_iommu_probe(struct platform_device *pdev) return ret; iommu_device_set_ops(&data->iommu, &mtk_iommu_ops); + iommu_device_set_fwnode(&data->iommu, &dev->of_node->fwnode); ret = iommu_device_register(&data->iommu); if (ret) Then, Tested-by: Yong Wu > > diff --git a/drivers/iommu/mtk_iommu.h b/drivers/iommu/mtk_iommu.h > index 122925dbe547..6253e98d810c 100644 > --- a/drivers/iommu/mtk_iommu.h > +++ b/drivers/iommu/mtk_iommu.h > @@ -67,8 +67,6 @@ struct mtk_iommu_data { > struct iommu_device iommu; > const struct mtk_iommu_plat_data *plat_data; > > - struct dma_iommu_mapping *mapping; /* For mtk_iommu_v1.c */ > - > struct list_head list; > struct mtk_smi_larb_iommu larb_imu[MTK_LARB_NR_MAX]; > }; > diff --git a/drivers/iommu/mtk_iommu_v1.c b/drivers/iommu/mtk_iommu_v1.c > index 82ddfe9170d4..40c89b8d3ac4 100644 > --- a/drivers/iommu/mtk_iommu_v1.c > +++ b/drivers/iommu/mtk_iommu_v1.c > @@ -28,7 +28,6 @@ > #include > #include > #include > -#include > #include > #include > #include > @@ -240,13 +239,18 @@ static struct iommu_domain *mtk_iommu_domain_alloc(unsigned type) > { > struct mtk_iommu_domain *dom; > > - if (type != IOMMU_DOMAIN_UNMANAGED) > + if (type != IOMMU_DOMAIN_UNMANAGED && type != IOMMU_DOMAIN_DMA) > return NULL; > > dom = kzalloc(sizeof(*dom), GFP_KERNEL); > if (!dom) > return NULL; > > + if (type == IOMMU_DOMAIN_DMA && iommu_get_dma_cookie(&dom->domain)) { > + kfree(dom); > + return NULL; > + } > + > return &dom->domain; > } > > @@ -257,6 +261,7 @@ static void mtk_iommu_domain_free(struct iommu_domain *domain) > > dma_free_coherent(data->dev, M2701_IOMMU_PGT_SIZE, > dom->pgt_va, dom->pgt_pa); > + iommu_put_dma_cookie(domain); > kfree(to_mtk_domain(domain)); > } > > @@ -265,14 +270,8 @@ static int mtk_iommu_attach_device(struct iommu_domain *domain, > { > struct mtk_iommu_data *data = dev_iommu_priv_get(dev); > struct mtk_iommu_domain *dom = to_mtk_domain(domain); > - struct dma_iommu_mapping *mtk_mapping; > int ret; > > - /* Only allow the domain created internally. */ > - mtk_mapping = data->mapping; > - if (mtk_mapping->domain != domain) > - return 0; > - > if (!data->m4u_dom) { > data->m4u_dom = dom; > ret = mtk_iommu_domain_finalise(data); > @@ -358,18 +357,39 @@ static phys_addr_t mtk_iommu_iova_to_phys(struct iommu_domain *domain, > > static const struct iommu_ops mtk_iommu_ops; > > -/* > - * MTK generation one iommu HW only support one iommu domain, and all the client > - * sharing the same iova address space. > - */ > -static int mtk_iommu_create_mapping(struct device *dev, > - struct of_phandle_args *args) > +static struct iommu_device *mtk_iommu_probe_device(struct device *dev) > { > struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > struct mtk_iommu_data *data; > + > + if (!fwspec || fwspec->ops != &mtk_iommu_ops) > + return ERR_PTR(-ENODEV); /* Not a iommu client device */ > + > + data = dev_iommu_priv_get(dev); > + > + return &data->iommu; > +} > + > +static void mtk_iommu_release_device(struct device *dev) > +{ > + struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > + > + if (!fwspec || fwspec->ops != &mtk_iommu_ops) > + return; > + > + iommu_fwspec_free(dev); > +} > + > +static struct iommu_group *mtk_iommu_device_group(struct device *dev) > +{ > + struct mtk_iommu_data *data = dev_iommu_priv_get(dev); > + > + return iommu_group_ref_get(data->m4u_group); > +} > + > +static int mtk_iommu_of_xlate(struct device *dev, struct of_phandle_args *args) > +{ > struct platform_device *m4updev; > - struct dma_iommu_mapping *mtk_mapping; > - int ret; > > if (args->args_count != 1) { > dev_err(dev, "invalid #iommu-cells(%d) property for IOMMU\n", > @@ -377,15 +397,6 @@ static int mtk_iommu_create_mapping(struct device *dev, > return -EINVAL; > } > > - if (!fwspec) { > - ret = iommu_fwspec_init(dev, &args->np->fwnode, &mtk_iommu_ops); > - if (ret) > - return ret; > - fwspec = dev_iommu_fwspec_get(dev); > - } else if (dev_iommu_fwspec_get(dev)->ops != &mtk_iommu_ops) { > - return -EINVAL; > - } > - > if (!dev_iommu_priv_get(dev)) { > /* Get the m4u device */ > m4updev = of_find_device_by_node(args->np); > @@ -395,83 +406,7 @@ static int mtk_iommu_create_mapping(struct device *dev, > dev_iommu_priv_set(dev, platform_get_drvdata(m4updev)); > } > > - ret = iommu_fwspec_add_ids(dev, args->args, 1); > - if (ret) > - return ret; > - > - data = dev_iommu_priv_get(dev); > - mtk_mapping = data->mapping; > - if (!mtk_mapping) { > - /* MTK iommu support 4GB iova address space. */ > - mtk_mapping = arm_iommu_create_mapping(&platform_bus_type, > - 0, 1ULL << 32); > - if (IS_ERR(mtk_mapping)) > - return PTR_ERR(mtk_mapping); > - > - data->mapping = mtk_mapping; > - } > - > - return 0; > -} > - > -static int mtk_iommu_def_domain_type(struct device *dev) > -{ > - return IOMMU_DOMAIN_UNMANAGED; > -} > - > -static struct iommu_device *mtk_iommu_probe_device(struct device *dev) > -{ > - struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > - struct of_phandle_args iommu_spec; > - struct of_phandle_iterator it; > - struct mtk_iommu_data *data; > - int err; > - > - of_for_each_phandle(&it, err, dev->of_node, "iommus", > - "#iommu-cells", -1) { > - int count = of_phandle_iterator_args(&it, iommu_spec.args, > - MAX_PHANDLE_ARGS); > - iommu_spec.np = of_node_get(it.node); > - iommu_spec.args_count = count; > - > - mtk_iommu_create_mapping(dev, &iommu_spec); > - > - /* dev->iommu_fwspec might have changed */ > - fwspec = dev_iommu_fwspec_get(dev); > - > - of_node_put(iommu_spec.np); > - } > - > - if (!fwspec || fwspec->ops != &mtk_iommu_ops) > - return ERR_PTR(-ENODEV); /* Not a iommu client device */ > - > - data = dev_iommu_priv_get(dev); > - > - return &data->iommu; > -} > - > -static void mtk_iommu_probe_finalize(struct device *dev) > -{ > - struct dma_iommu_mapping *mtk_mapping; > - struct mtk_iommu_data *data; > - int err; > - > - data = dev_iommu_priv_get(dev); > - mtk_mapping = data->mapping; > - > - err = arm_iommu_attach_device(dev, mtk_mapping); > - if (err) > - dev_err(dev, "Can't create IOMMU mapping - DMA-OPS will not work\n"); > -} > - > -static void mtk_iommu_release_device(struct device *dev) > -{ > - struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > - > - if (!fwspec || fwspec->ops != &mtk_iommu_ops) > - return; > - > - iommu_fwspec_free(dev); > + return iommu_fwspec_add_ids(dev, args->args, 1); > } > > static int mtk_iommu_hw_init(const struct mtk_iommu_data *data) > @@ -524,10 +459,9 @@ static const struct iommu_ops mtk_iommu_ops = { > .unmap = mtk_iommu_unmap, > .iova_to_phys = mtk_iommu_iova_to_phys, > .probe_device = mtk_iommu_probe_device, > - .probe_finalize = mtk_iommu_probe_finalize, > .release_device = mtk_iommu_release_device, > - .def_domain_type = mtk_iommu_def_domain_type, > - .device_group = generic_device_group, > + .device_group = mtk_iommu_device_group, > + .of_xlate = mtk_iommu_of_xlate, > .pgsize_bitmap = ~0UL << MT2701_IOMMU_PAGE_SHIFT, > }; > > @@ -626,6 +560,14 @@ static int mtk_iommu_probe(struct platform_device *pdev) > if (ret) > return ret; > > + /* > + * MTK generation one iommu HW only support one iommu domain, > + * and all the client sharing the same iova address space. > + */ > + data->m4u_group = iommu_group_alloc(); > + if (IS_ERR(data->m4u_group)) > + return PTR_ERR(data->m4u_group); > + > if (!iommu_present(&platform_bus_type)) > bus_set_iommu(&platform_bus_type, &mtk_iommu_ops); > > @@ -636,6 +578,7 @@ static int mtk_iommu_remove(struct platform_device *pdev) > { > struct mtk_iommu_data *data = platform_get_drvdata(pdev); > > + iommu_group_put(data->m4u_group); > iommu_device_sysfs_remove(&data->iommu); > iommu_device_unregister(&data->iommu); > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-11.3 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED, USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id F3D28C433E6 for ; Mon, 31 Aug 2020 09:12:37 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C3DB3208CA for ; Mon, 31 Aug 2020 09:12:37 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="iJqgYe2I" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C3DB3208CA Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id A1FFA89C27; Mon, 31 Aug 2020 09:12:29 +0000 (UTC) X-Greylist: delayed 301 seconds by postgrey-1.36 at gabe; Sat, 29 Aug 2020 10:11:31 UTC Received: from mailgw02.mediatek.com (unknown [1.203.163.81]) by gabe.freedesktop.org (Postfix) with ESMTP id 828B26E077 for ; Sat, 29 Aug 2020 10:11:31 +0000 (UTC) X-UUID: 06a97a601b30491ab643e29003ee3d10-20200829 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=YQ4nWNJaU2/84I56GfA7izeF71Nu7GxMGRIJ/4QLhhI=; b=iJqgYe2INoU7y5RbgeFWvqv7yXDT7wXXuH6QVWH8MwimigaAtcURtEZCqOdT81bfUhVmsmSMN0cgKkkduDX0H0CGIdSOMIeqyALhmkFm3cZq6FZ8b5Y573JvKeY6fGwQjf1MnghwP2HLQpe0YZOO0SZ+7z8XJSjwGZQ7GXZNHEA=; X-UUID: 06a97a601b30491ab643e29003ee3d10-20200829 Received: from mtkcas35.mediatek.inc [(172.27.4.253)] by mailgw02.mediatek.com (envelope-from ) (mailgw01.mediatek.com ESMTP with TLS) with ESMTP id 818620872; Sat, 29 Aug 2020 17:56:23 +0800 Received: from MTKCAS36.mediatek.inc (172.27.4.186) by MTKMBS31N1.mediatek.inc (172.27.4.69) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sat, 29 Aug 2020 17:56:20 +0800 Received: from [10.17.3.153] (10.17.3.153) by MTKCAS36.mediatek.inc (172.27.4.170) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sat, 29 Aug 2020 17:56:20 +0800 Message-ID: <1598694891.19851.12.camel@mhfsdcap03> Subject: Re: [PATCH 09/18] iommu/mediatek-v1: Add IOMMU_DOMAIN_DMA support From: Yong Wu To: Robin Murphy Date: Sat, 29 Aug 2020 17:54:51 +0800 In-Reply-To: References: X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-TM-SNTS-SMTP: AA63C797C93CBD61B254A639A39F87490728FF8037E9BB375825F26FABF9D7122000:8 X-MTK: N X-Mailman-Approved-At: Mon, 31 Aug 2020 09:12:28 +0000 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: geert+renesas@glider.be, dri-devel@lists.freedesktop.org, bjorn.andersson@linaro.org, linux-tegra@vger.kernel.org, thierry.reding@gmail.com, laurent.pinchart@ideasonboard.com, digetx@gmail.com, s-anna@ti.com, will@kernel.org, hch@lst.de, m.szyprowski@samsung.com, linux-samsung-soc@vger.kernel.org, joro@8bytes.org, magnus.damm@gmail.com, linux@armlinux.org.uk, jonathanh@nvidia.com, agross@kernel.org, kyungmin.park@samsung.com, linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, vdumpa@nvidia.com, linux-mediatek@lists.infradead.org, matthias.bgg@gmail.com, linux-arm-kernel@lists.infradead.org, sw0312.kim@samsung.com, linux-kernel@vger.kernel.org, t-kristo@ti.com, iommu@lists.linux-foundation.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On Thu, 2020-08-20 at 16:08 +0100, Robin Murphy wrote: > Now that arch/arm is wired up for default domains and iommu-dma, > implement the corresponding driver-side support for groups and DMA > domains to replace the shared mapping workaround. > > Signed-off-by: Robin Murphy > --- > drivers/iommu/mtk_iommu.h | 2 - > drivers/iommu/mtk_iommu_v1.c | 153 +++++++++++------------------------ > 2 files changed, 48 insertions(+), 107 deletions(-) Hi Robin, Thanks very much for this patch, It makes the code much cleaner. Please help squash the little change in this patch, --- a/drivers/iommu/mtk_iommu_v1.c +++ b/drivers/iommu/mtk_iommu_v1.c @@ -555,6 +555,7 @@ static int mtk_iommu_probe(struct platform_device *pdev) return ret; iommu_device_set_ops(&data->iommu, &mtk_iommu_ops); + iommu_device_set_fwnode(&data->iommu, &dev->of_node->fwnode); ret = iommu_device_register(&data->iommu); if (ret) Then, Tested-by: Yong Wu > > diff --git a/drivers/iommu/mtk_iommu.h b/drivers/iommu/mtk_iommu.h > index 122925dbe547..6253e98d810c 100644 > --- a/drivers/iommu/mtk_iommu.h > +++ b/drivers/iommu/mtk_iommu.h > @@ -67,8 +67,6 @@ struct mtk_iommu_data { > struct iommu_device iommu; > const struct mtk_iommu_plat_data *plat_data; > > - struct dma_iommu_mapping *mapping; /* For mtk_iommu_v1.c */ > - > struct list_head list; > struct mtk_smi_larb_iommu larb_imu[MTK_LARB_NR_MAX]; > }; > diff --git a/drivers/iommu/mtk_iommu_v1.c b/drivers/iommu/mtk_iommu_v1.c > index 82ddfe9170d4..40c89b8d3ac4 100644 > --- a/drivers/iommu/mtk_iommu_v1.c > +++ b/drivers/iommu/mtk_iommu_v1.c > @@ -28,7 +28,6 @@ > #include > #include > #include > -#include > #include > #include > #include > @@ -240,13 +239,18 @@ static struct iommu_domain *mtk_iommu_domain_alloc(unsigned type) > { > struct mtk_iommu_domain *dom; > > - if (type != IOMMU_DOMAIN_UNMANAGED) > + if (type != IOMMU_DOMAIN_UNMANAGED && type != IOMMU_DOMAIN_DMA) > return NULL; > > dom = kzalloc(sizeof(*dom), GFP_KERNEL); > if (!dom) > return NULL; > > + if (type == IOMMU_DOMAIN_DMA && iommu_get_dma_cookie(&dom->domain)) { > + kfree(dom); > + return NULL; > + } > + > return &dom->domain; > } > > @@ -257,6 +261,7 @@ static void mtk_iommu_domain_free(struct iommu_domain *domain) > > dma_free_coherent(data->dev, M2701_IOMMU_PGT_SIZE, > dom->pgt_va, dom->pgt_pa); > + iommu_put_dma_cookie(domain); > kfree(to_mtk_domain(domain)); > } > > @@ -265,14 +270,8 @@ static int mtk_iommu_attach_device(struct iommu_domain *domain, > { > struct mtk_iommu_data *data = dev_iommu_priv_get(dev); > struct mtk_iommu_domain *dom = to_mtk_domain(domain); > - struct dma_iommu_mapping *mtk_mapping; > int ret; > > - /* Only allow the domain created internally. */ > - mtk_mapping = data->mapping; > - if (mtk_mapping->domain != domain) > - return 0; > - > if (!data->m4u_dom) { > data->m4u_dom = dom; > ret = mtk_iommu_domain_finalise(data); > @@ -358,18 +357,39 @@ static phys_addr_t mtk_iommu_iova_to_phys(struct iommu_domain *domain, > > static const struct iommu_ops mtk_iommu_ops; > > -/* > - * MTK generation one iommu HW only support one iommu domain, and all the client > - * sharing the same iova address space. > - */ > -static int mtk_iommu_create_mapping(struct device *dev, > - struct of_phandle_args *args) > +static struct iommu_device *mtk_iommu_probe_device(struct device *dev) > { > struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > struct mtk_iommu_data *data; > + > + if (!fwspec || fwspec->ops != &mtk_iommu_ops) > + return ERR_PTR(-ENODEV); /* Not a iommu client device */ > + > + data = dev_iommu_priv_get(dev); > + > + return &data->iommu; > +} > + > +static void mtk_iommu_release_device(struct device *dev) > +{ > + struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > + > + if (!fwspec || fwspec->ops != &mtk_iommu_ops) > + return; > + > + iommu_fwspec_free(dev); > +} > + > +static struct iommu_group *mtk_iommu_device_group(struct device *dev) > +{ > + struct mtk_iommu_data *data = dev_iommu_priv_get(dev); > + > + return iommu_group_ref_get(data->m4u_group); > +} > + > +static int mtk_iommu_of_xlate(struct device *dev, struct of_phandle_args *args) > +{ > struct platform_device *m4updev; > - struct dma_iommu_mapping *mtk_mapping; > - int ret; > > if (args->args_count != 1) { > dev_err(dev, "invalid #iommu-cells(%d) property for IOMMU\n", > @@ -377,15 +397,6 @@ static int mtk_iommu_create_mapping(struct device *dev, > return -EINVAL; > } > > - if (!fwspec) { > - ret = iommu_fwspec_init(dev, &args->np->fwnode, &mtk_iommu_ops); > - if (ret) > - return ret; > - fwspec = dev_iommu_fwspec_get(dev); > - } else if (dev_iommu_fwspec_get(dev)->ops != &mtk_iommu_ops) { > - return -EINVAL; > - } > - > if (!dev_iommu_priv_get(dev)) { > /* Get the m4u device */ > m4updev = of_find_device_by_node(args->np); > @@ -395,83 +406,7 @@ static int mtk_iommu_create_mapping(struct device *dev, > dev_iommu_priv_set(dev, platform_get_drvdata(m4updev)); > } > > - ret = iommu_fwspec_add_ids(dev, args->args, 1); > - if (ret) > - return ret; > - > - data = dev_iommu_priv_get(dev); > - mtk_mapping = data->mapping; > - if (!mtk_mapping) { > - /* MTK iommu support 4GB iova address space. */ > - mtk_mapping = arm_iommu_create_mapping(&platform_bus_type, > - 0, 1ULL << 32); > - if (IS_ERR(mtk_mapping)) > - return PTR_ERR(mtk_mapping); > - > - data->mapping = mtk_mapping; > - } > - > - return 0; > -} > - > -static int mtk_iommu_def_domain_type(struct device *dev) > -{ > - return IOMMU_DOMAIN_UNMANAGED; > -} > - > -static struct iommu_device *mtk_iommu_probe_device(struct device *dev) > -{ > - struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > - struct of_phandle_args iommu_spec; > - struct of_phandle_iterator it; > - struct mtk_iommu_data *data; > - int err; > - > - of_for_each_phandle(&it, err, dev->of_node, "iommus", > - "#iommu-cells", -1) { > - int count = of_phandle_iterator_args(&it, iommu_spec.args, > - MAX_PHANDLE_ARGS); > - iommu_spec.np = of_node_get(it.node); > - iommu_spec.args_count = count; > - > - mtk_iommu_create_mapping(dev, &iommu_spec); > - > - /* dev->iommu_fwspec might have changed */ > - fwspec = dev_iommu_fwspec_get(dev); > - > - of_node_put(iommu_spec.np); > - } > - > - if (!fwspec || fwspec->ops != &mtk_iommu_ops) > - return ERR_PTR(-ENODEV); /* Not a iommu client device */ > - > - data = dev_iommu_priv_get(dev); > - > - return &data->iommu; > -} > - > -static void mtk_iommu_probe_finalize(struct device *dev) > -{ > - struct dma_iommu_mapping *mtk_mapping; > - struct mtk_iommu_data *data; > - int err; > - > - data = dev_iommu_priv_get(dev); > - mtk_mapping = data->mapping; > - > - err = arm_iommu_attach_device(dev, mtk_mapping); > - if (err) > - dev_err(dev, "Can't create IOMMU mapping - DMA-OPS will not work\n"); > -} > - > -static void mtk_iommu_release_device(struct device *dev) > -{ > - struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > - > - if (!fwspec || fwspec->ops != &mtk_iommu_ops) > - return; > - > - iommu_fwspec_free(dev); > + return iommu_fwspec_add_ids(dev, args->args, 1); > } > > static int mtk_iommu_hw_init(const struct mtk_iommu_data *data) > @@ -524,10 +459,9 @@ static const struct iommu_ops mtk_iommu_ops = { > .unmap = mtk_iommu_unmap, > .iova_to_phys = mtk_iommu_iova_to_phys, > .probe_device = mtk_iommu_probe_device, > - .probe_finalize = mtk_iommu_probe_finalize, > .release_device = mtk_iommu_release_device, > - .def_domain_type = mtk_iommu_def_domain_type, > - .device_group = generic_device_group, > + .device_group = mtk_iommu_device_group, > + .of_xlate = mtk_iommu_of_xlate, > .pgsize_bitmap = ~0UL << MT2701_IOMMU_PAGE_SHIFT, > }; > > @@ -626,6 +560,14 @@ static int mtk_iommu_probe(struct platform_device *pdev) > if (ret) > return ret; > > + /* > + * MTK generation one iommu HW only support one iommu domain, > + * and all the client sharing the same iova address space. > + */ > + data->m4u_group = iommu_group_alloc(); > + if (IS_ERR(data->m4u_group)) > + return PTR_ERR(data->m4u_group); > + > if (!iommu_present(&platform_bus_type)) > bus_set_iommu(&platform_bus_type, &mtk_iommu_ops); > > @@ -636,6 +578,7 @@ static int mtk_iommu_remove(struct platform_device *pdev) > { > struct mtk_iommu_data *data = platform_get_drvdata(pdev); > > + iommu_group_put(data->m4u_group); > iommu_device_sysfs_remove(&data->iommu); > iommu_device_unregister(&data->iommu); > _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel