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.4 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,MIME_BASE64_TEXT,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, UNPARSEABLE_RELAY,URIBL_BLOCKED,USER_AGENT_GIT 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 84F07C4727F for ; Wed, 30 Sep 2020 07:11:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 463C02075F for ; Wed, 30 Sep 2020 07:11:21 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="OVfYiy7A" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728835AbgI3HLU (ORCPT ); Wed, 30 Sep 2020 03:11:20 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:42131 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1728358AbgI3HLQ (ORCPT ); Wed, 30 Sep 2020 03:11:16 -0400 X-UUID: 0174116d7c4a4158a523df129da28cf5-20200930 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=2hXK/k5kh9YX+o1mfg47pv2P1bPYrxMP0olMJnC2mT8=; b=OVfYiy7AfKTEw8b/6SsTn7+74GW4KnNpI7a+pFJk0tU8v4AteZpk2qgHF3RSOmZAN1/WG06r9EwoQ0GrSFB9OwOaeI1He7kq/jFT4/1drKxxyNZ6f7vwp03Alumd+HdhyGVyjIpJ9d5TrfstC7wZ7/8hNa7CyoNjC+MDn/27ix4=; X-UUID: 0174116d7c4a4158a523df129da28cf5-20200930 Received: from mtkcas07.mediatek.inc [(172.21.101.84)] by mailgw02.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.14 Build 0819 with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1746852712; Wed, 30 Sep 2020 15:11:12 +0800 Received: from mtkcas08.mediatek.inc (172.21.101.126) by mtkmbs08n1.mediatek.inc (172.21.101.55) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 30 Sep 2020 15:11:09 +0800 Received: from localhost.localdomain (10.17.3.153) by mtkcas08.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 30 Sep 2020 15:11:10 +0800 From: Yong Wu To: Joerg Roedel , Matthias Brugger , Rob Herring , Robin Murphy , Krzysztof Kozlowski , Will Deacon CC: Evan Green , Tomasz Figa , , , , , , , , , Nicolas Boichat , , , , Greg Kroah-Hartman , Subject: [PATCH v3 21/24] iommu/mediatek: Add support for multi domain Date: Wed, 30 Sep 2020 15:06:44 +0800 Message-ID: <20200930070647.10188-22-yong.wu@mediatek.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20200930070647.10188-1-yong.wu@mediatek.com> References: <20200930070647.10188-1-yong.wu@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain X-MTK: N Content-Transfer-Encoding: base64 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org U29tZSBIVyBJUChleDogQ0NVKSByZXF1aXJlIHRoZSBzcGVjaWFsIGlvdmEgcmFuZ2UuIFRoYXQg bWVhbnMgdGhlDQppb3ZhIGdvdCBmcm9tIGRtYV9hbGxvY19hdHRycyBmb3IgdGhhdCBkZXZpY2Vz IG11c3QgbG9jYXRlIGluIGhpcw0Kc3BlY2lhbCByYW5nZS4gSW4gdGhpcyBwYXRjaCwgd2UgYWxs b2NhdGUgYSBzcGVjaWFsIGlvdmFfcmFuZ2UgZm9yDQplYWNoIGEgc3BlY2lhbCByZXF1aXJlbWVu dCBhbmQgY3JlYXRlIGVhY2ggYSBpb21tdSBkb21haW4gZm9yIGVhY2gNCmEgaW92YV9yYW5nZS4N Cg0KbWVhbndoaWxlIHdlIHN0aWxsIHVzZSBvbmUgcGFnZXRhYmxlIHdoaWNoIHN1cHBvcnQgMTZH QiBpb3ZhLg0KDQpBZnRlciB0aGlzIHBhdGNoLCBJZiB0aGUgaW92YSByYW5nZSBvZiBhIG1hc3Rl ciBpcyBvdmVyIDRHLCB0aGUgbWFzdGVyDQpzaG91bGQ6DQphKSBEZWNsYXJlIGl0cyBzcGVjaWFs IGRtYV9yYW5nZXMgaW4gaXRzIGR0c2kgbm9kZS4gRm9yIGV4YW1wbGUsIElmIHdlDQogICBwcmVh c3NpZ24gdGhlIGlvdmEgNEctOEcgZm9yIHZjb2RlYywgdGhlbiB0aGUgdmNvZGVjIGR0c2kgbm9k ZSBzaG91bGQNCiAgIGFkZCB0aGlzOg0KICAgLyoNCiAgICAqIGlvdmEgc3RhcnQgYXQgMHgxXzAw MDBfMDAwMCwgcGEgc3RpbGwgc3RhcnQgYXQgMHg0MDAwXzAwMDANCiAgICAqIHNpemUgaXMgMHgx XzAwMDBfMDAwMC4NCiAgICAqLw0KICAgZG1hLXJhbmdlcyA9IDwweDEgMHgwIDB4MCAweDQwMDAw MDAwIDB4MSAweDA+OyAgLyogNEcgfiA4RyAqLw0KIE5vdGU6IHdlIGRvbid0IGhhdmUgYSBhY3R1 YWwgYnVzIGNvbmNlcHQgaGVyZS4gdGhlIG1hc3RlciBkb2Vzbid0IGhhdmUgaXRzDQogc3BlY2lh bCBwYXJlbnQgbm9kZSwgdGh1cyB0aGlzIGRtYS1yYW5nZXMgY2FuIG9ubHkgYmUgcHV0IGluIHRo ZSBtYXN0ZXIncw0KIG5vZGUuDQoNCmIpIFVwZGF0ZSB0aGUgZG1hX21hc2s6DQogIGRtYV9zZXRf bWFza19hbmRfY29oZXJlbnQoZGV2LCBETUFfQklUX01BU0soMzMpKTsNCg0KU2lnbmVkLW9mZi1i eTogWW9uZyBXdSA8eW9uZy53dUBtZWRpYXRlay5jb20+DQotLS0NCiBkcml2ZXJzL2lvbW11L210 a19pb21tdS5jIHwgNDcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tDQog ZHJpdmVycy9pb21tdS9tdGtfaW9tbXUuaCB8ICAzICsrLQ0KIDIgZmlsZXMgY2hhbmdlZCwgNDAg aW5zZXJ0aW9ucygrKSwgMTAgZGVsZXRpb25zKC0pDQoNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lv bW11L210a19pb21tdS5jIGIvZHJpdmVycy9pb21tdS9tdGtfaW9tbXUuYw0KaW5kZXggMTY3NjBl MzE4NjQ4Li4xZDVkM2U3NmQyZDEgMTAwNjQ0DQotLS0gYS9kcml2ZXJzL2lvbW11L210a19pb21t dS5jDQorKysgYi9kcml2ZXJzL2lvbW11L210a19pb21tdS5jDQpAQCAtMzUwLDYgKzM1MCwxNCBA QCBzdGF0aWMgaW50IG10a19pb21tdV9kb21haW5fZmluYWxpc2Uoc3RydWN0IG10a19pb21tdV9k b21haW4gKmRvbSkNCiB7DQogCXN0cnVjdCBtdGtfaW9tbXVfZGF0YSAqZGF0YSA9IG10a19pb21t dV9nZXRfbTR1X2RhdGEoKTsNCiANCisJLyogVXNlIHRoZSBleGlzdCBkb21haW4gYXMgdGhlcmUg aXMgb25seSBvbmUgbTR1IHBndGFibGUgaGVyZS4gKi8NCisJaWYgKGRhdGEtPm00dV9kb20pIHsN CisJCWRvbS0+aW9wID0gZGF0YS0+bTR1X2RvbS0+aW9wOw0KKwkJZG9tLT5jZmcgPSBkYXRhLT5t NHVfZG9tLT5jZmc7DQorCQlkb20tPmRvbWFpbi5wZ3NpemVfYml0bWFwID0gZGF0YS0+bTR1X2Rv bS0+Y2ZnLnBnc2l6ZV9iaXRtYXA7DQorCQlyZXR1cm4gMDsNCisJfQ0KKw0KIAlkb20tPmNmZyA9 IChzdHJ1Y3QgaW9fcGd0YWJsZV9jZmcpIHsNCiAJCS5xdWlya3MgPSBJT19QR1RBQkxFX1FVSVJL X0FSTV9OUyB8DQogCQkJSU9fUEdUQUJMRV9RVUlSS19OT19QRVJNUyB8DQpAQCAtMzc1LDYgKzM4 Myw4IEBAIHN0YXRpYyBpbnQgbXRrX2lvbW11X2RvbWFpbl9maW5hbGlzZShzdHJ1Y3QgbXRrX2lv bW11X2RvbWFpbiAqZG9tKQ0KIA0KIHN0YXRpYyBzdHJ1Y3QgaW9tbXVfZG9tYWluICptdGtfaW9t bXVfZG9tYWluX2FsbG9jKHVuc2lnbmVkIHR5cGUpDQogew0KKwlzdHJ1Y3QgbXRrX2lvbW11X2Rh dGEgKmRhdGEgPSBtdGtfaW9tbXVfZ2V0X200dV9kYXRhKCk7DQorCWNvbnN0IHN0cnVjdCBtdGtf aW9tbXVfaW92YV9yZWdpb24gKnJlZ2lvbjsNCiAJc3RydWN0IG10a19pb21tdV9kb21haW4gKmRv bTsNCiANCiAJaWYgKHR5cGUgIT0gSU9NTVVfRE9NQUlOX0RNQSkNCkBAIC0zOTAsOCArNDAwLDkg QEAgc3RhdGljIHN0cnVjdCBpb21tdV9kb21haW4gKm10a19pb21tdV9kb21haW5fYWxsb2ModW5z aWduZWQgdHlwZSkNCiAJaWYgKG10a19pb21tdV9kb21haW5fZmluYWxpc2UoZG9tKSkNCiAJCWdv dG8gIHB1dF9kbWFfY29va2llOw0KIA0KLQlkb20tPmRvbWFpbi5nZW9tZXRyeS5hcGVydHVyZV9z dGFydCA9IDA7DQotCWRvbS0+ZG9tYWluLmdlb21ldHJ5LmFwZXJ0dXJlX2VuZCA9IERNQV9CSVRf TUFTSygzMik7DQorCXJlZ2lvbiA9IGRhdGEtPnBsYXRfZGF0YS0+aW92YV9yZWdpb24gKyBkYXRh LT5jdXJfZG9taWQ7DQorCWRvbS0+ZG9tYWluLmdlb21ldHJ5LmFwZXJ0dXJlX3N0YXJ0ID0gcmVn aW9uLT5pb3ZhX2Jhc2U7DQorCWRvbS0+ZG9tYWluLmdlb21ldHJ5LmFwZXJ0dXJlX2VuZCA9IHJl Z2lvbi0+aW92YV9iYXNlICsgcmVnaW9uLT5zaXplIC0gMTsNCiAJZG9tLT5kb21haW4uZ2VvbWV0 cnkuZm9yY2VfYXBlcnR1cmUgPSB0cnVlOw0KIA0KIAlyZXR1cm4gJmRvbS0+ZG9tYWluOw0KQEAg LTUzNSwxOSArNTQ2LDMxIEBAIHN0YXRpYyB2b2lkIG10a19pb21tdV9yZWxlYXNlX2RldmljZShz dHJ1Y3QgZGV2aWNlICpkZXYpDQogc3RhdGljIHN0cnVjdCBpb21tdV9ncm91cCAqbXRrX2lvbW11 X2RldmljZV9ncm91cChzdHJ1Y3QgZGV2aWNlICpkZXYpDQogew0KIAlzdHJ1Y3QgbXRrX2lvbW11 X2RhdGEgKmRhdGEgPSBtdGtfaW9tbXVfZ2V0X200dV9kYXRhKCk7DQorCXN0cnVjdCBpb21tdV9m d3NwZWMgKmZ3c3BlYyA9IGRldl9pb21tdV9md3NwZWNfZ2V0KGRldik7DQorCXN0cnVjdCBpb21t dV9ncm91cCAqZ3JvdXA7DQorCWludCBkb21pZDsNCiANCiAJaWYgKCFkYXRhKQ0KIAkJcmV0dXJu IEVSUl9QVFIoLUVOT0RFVik7DQogDQotCS8qIEFsbCB0aGUgY2xpZW50IGRldmljZXMgYXJlIGlu IHRoZSBzYW1lIG00dSBpb21tdS1ncm91cCAqLw0KLQlpZiAoIWRhdGEtPm00dV9ncm91cCkgew0K LQkJZGF0YS0+bTR1X2dyb3VwID0gaW9tbXVfZ3JvdXBfYWxsb2MoKTsNCi0JCWlmIChJU19FUlIo ZGF0YS0+bTR1X2dyb3VwKSkNCisJZG9taWQgPSBNVEtfTTRVX1RPX0RPTShmd3NwZWMtPmlkc1sw XSk7DQorCWlmIChkb21pZCA+PSBkYXRhLT5wbGF0X2RhdGEtPmlvdmFfcmVnaW9uX25yKSB7DQor CQlkZXZfZXJyKGRldiwgImlvbW11IGRvbWFpbiBpZCglZC8lZCkgaXMgZXJyb3IuXG4iLCBkb21p ZCwNCisJCQlkYXRhLT5wbGF0X2RhdGEtPmlvdmFfcmVnaW9uX25yKTsNCisJCXJldHVybiBFUlJf UFRSKC1FSU5WQUwpOw0KKwl9DQorDQorCWdyb3VwID0gZGF0YS0+bTR1X2dyb3VwW2RvbWlkXTsN CisJaWYgKCFncm91cCkgew0KKwkJZ3JvdXAgPSBpb21tdV9ncm91cF9hbGxvYygpOw0KKwkJaWYg KElTX0VSUihncm91cCkpDQogCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgTTRV IElPTU1VIGdyb3VwXG4iKTsNCisJCWRhdGEtPm00dV9ncm91cFtkb21pZF0gPSBncm91cDsNCiAJ fSBlbHNlIHsNCi0JCWlvbW11X2dyb3VwX3JlZl9nZXQoZGF0YS0+bTR1X2dyb3VwKTsNCisJCWlv bW11X2dyb3VwX3JlZl9nZXQoZ3JvdXApOw0KIAl9DQotCXJldHVybiBkYXRhLT5tNHVfZ3JvdXA7 DQorCWRhdGEtPmN1cl9kb21pZCA9IGRvbWlkOw0KKwlyZXR1cm4gZ3JvdXA7DQogfQ0KIA0KIHN0 YXRpYyBpbnQgbXRrX2lvbW11X29mX3hsYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG9m X3BoYW5kbGVfYXJncyAqYXJncykNCkBAIC01NzYsMTQgKzU5OSwyMCBAQCBzdGF0aWMgdm9pZCBt dGtfaW9tbXVfZ2V0X3Jlc3ZfcmVnaW9ucyhzdHJ1Y3QgZGV2aWNlICpkZXYsDQogCQkJCSAgICAg ICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQ0KIHsNCiAJc3RydWN0IG10a19pb21tdV9kYXRhICpk YXRhID0gZGV2X2lvbW11X3ByaXZfZ2V0KGRldik7DQotCWNvbnN0IHN0cnVjdCBtdGtfaW9tbXVf aW92YV9yZWdpb24gKnJlc3Y7DQorCWNvbnN0IHN0cnVjdCBtdGtfaW9tbXVfaW92YV9yZWdpb24g KnJlc3YsICpjdXJkb207DQogCXN0cnVjdCBpb21tdV9yZXN2X3JlZ2lvbiAqcmVnaW9uOw0KIAlp bnQgcHJvdCA9IElPTU1VX1dSSVRFIHwgSU9NTVVfUkVBRDsNCiAJdW5zaWduZWQgaW50IGk7DQog DQorCWN1cmRvbSA9IGRhdGEtPnBsYXRfZGF0YS0+aW92YV9yZWdpb24gKyBkYXRhLT5jdXJfZG9t aWQ7DQogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5wbGF0X2RhdGEtPmlvdmFfcmVnaW9uX25yOyBp KyspIHsNCiAJCXJlc3YgPSBkYXRhLT5wbGF0X2RhdGEtPmlvdmFfcmVnaW9uICsgaTsNCiANCisJ CS8qIE9ubHkgcmVzZXJ2ZSB3aGVuIHRoZSByZWdpb24gaXMgaW4gdGhlIGN1cnJlbnQgZG9tYWlu ICovDQorCQlpZiAocmVzdi0+aW92YV9iYXNlIDw9IGN1cmRvbS0+aW92YV9iYXNlIHx8DQorCQkg ICAgcmVzdi0+aW92YV9iYXNlICsgcmVzdi0+c2l6ZSA+PSBjdXJkb20tPmlvdmFfYmFzZSArIGN1 cmRvbS0+c2l6ZSkNCisJCQljb250aW51ZTsNCisNCiAJCXJlZ2lvbiA9IGlvbW11X2FsbG9jX3Jl c3ZfcmVnaW9uKHJlc3YtPmlvdmFfYmFzZSwgcmVzdi0+c2l6ZSwNCiAJCQkJCQkgcHJvdCwgSU9N TVVfUkVTVl9SRVNFUlZFRCk7DQogCQlpZiAoIXJlZ2lvbikNCmRpZmYgLS1naXQgYS9kcml2ZXJz L2lvbW11L210a19pb21tdS5oIGIvZHJpdmVycy9pb21tdS9tdGtfaW9tbXUuaA0KaW5kZXggZDQ1 YzEzYzlkMzI0Li41ZTM0NjQ2NGNkZjggMTAwNjQ0DQotLS0gYS9kcml2ZXJzL2lvbW11L210a19p b21tdS5oDQorKysgYi9kcml2ZXJzL2lvbW11L210a19pb21tdS5oDQpAQCAtNjYsNyArNjYsNyBA QCBzdHJ1Y3QgbXRrX2lvbW11X2RhdGEgew0KIAlwaHlzX2FkZHJfdAkJCXByb3RlY3RfYmFzZTsg LyogcHJvdGVjdCBtZW1vcnkgYmFzZSAqLw0KIAlzdHJ1Y3QgbXRrX2lvbW11X3N1c3BlbmRfcmVn CXJlZzsNCiAJc3RydWN0IG10a19pb21tdV9kb21haW4JCSptNHVfZG9tOw0KLQlzdHJ1Y3QgaW9t bXVfZ3JvdXAJCSptNHVfZ3JvdXA7DQorCXN0cnVjdCBpb21tdV9ncm91cAkJKm00dV9ncm91cFtN VEtfTTRVX0RPTV9OUl9NQVhdOw0KIAlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVu YWJsZV80R0I7DQogCXNwaW5sb2NrX3QJCQl0bGJfbG9jazsgLyogbG9jayBmb3IgdGxiIHJhbmdl IGZsdXNoICovDQogDQpAQCAtNzYsNiArNzYsNyBAQCBzdHJ1Y3QgbXRrX2lvbW11X2RhdGEgew0K IA0KIAlzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcJKm1hcHBpbmc7IC8qIEZvciBtdGtfaW9tbXVf djEuYyAqLw0KIA0KKwl1bnNpZ25lZCBpbnQJCQljdXJfZG9taWQ7DQogCXN0cnVjdCBsaXN0X2hl YWQJCWxpc3Q7DQogCXN0cnVjdCBtdGtfc21pX2xhcmJfaW9tbXUJbGFyYl9pbXVbTVRLX0xBUkJf TlJfTUFYXTsNCiB9Ow0KLS0gDQoyLjE4LjANCg== 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.8 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_GIT 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 117CEC2D0A8 for ; Wed, 30 Sep 2020 07:11:20 +0000 (UTC) Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (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 8F31A2076E for ; Wed, 30 Sep 2020 07:11:19 +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="OVfYiy7A" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8F31A2076E 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 hemlock.osuosl.org (Postfix) with ESMTP id 617EA86EC0; Wed, 30 Sep 2020 07:11:19 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from hemlock.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Cm+7Rcx-GVlS; Wed, 30 Sep 2020 07:11:18 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 38D30868F7; Wed, 30 Sep 2020 07:11:18 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 33B60C0889; Wed, 30 Sep 2020 07:11:18 +0000 (UTC) Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 7D54AC0051 for ; Wed, 30 Sep 2020 07:11:16 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 789878683F for ; Wed, 30 Sep 2020 07:11:16 +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 PfGbxRCTZxdq for ; Wed, 30 Sep 2020 07:11:15 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mailgw02.mediatek.com (unknown [210.61.82.184]) by whitealder.osuosl.org (Postfix) with ESMTP id 3F7C186792 for ; Wed, 30 Sep 2020 07:11:15 +0000 (UTC) X-UUID: 0174116d7c4a4158a523df129da28cf5-20200930 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=2hXK/k5kh9YX+o1mfg47pv2P1bPYrxMP0olMJnC2mT8=; b=OVfYiy7AfKTEw8b/6SsTn7+74GW4KnNpI7a+pFJk0tU8v4AteZpk2qgHF3RSOmZAN1/WG06r9EwoQ0GrSFB9OwOaeI1He7kq/jFT4/1drKxxyNZ6f7vwp03Alumd+HdhyGVyjIpJ9d5TrfstC7wZ7/8hNa7CyoNjC+MDn/27ix4=; X-UUID: 0174116d7c4a4158a523df129da28cf5-20200930 Received: from mtkcas07.mediatek.inc [(172.21.101.84)] by mailgw02.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.14 Build 0819 with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1746852712; Wed, 30 Sep 2020 15:11:12 +0800 Received: from mtkcas08.mediatek.inc (172.21.101.126) by mtkmbs08n1.mediatek.inc (172.21.101.55) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 30 Sep 2020 15:11:09 +0800 Received: from localhost.localdomain (10.17.3.153) by mtkcas08.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 30 Sep 2020 15:11:10 +0800 From: Yong Wu To: Joerg Roedel , Matthias Brugger , Rob Herring , Robin Murphy , Krzysztof Kozlowski , Will Deacon Subject: [PATCH v3 21/24] iommu/mediatek: Add support for multi domain Date: Wed, 30 Sep 2020 15:06:44 +0800 Message-ID: <20200930070647.10188-22-yong.wu@mediatek.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20200930070647.10188-1-yong.wu@mediatek.com> References: <20200930070647.10188-1-yong.wu@mediatek.com> MIME-Version: 1.0 X-MTK: N Cc: youlin.pei@mediatek.com, devicetree@vger.kernel.org, Nicolas Boichat , srv_heupstream@mediatek.com, chao.hao@mediatek.com, kernel-team@android.com, linux-kernel@vger.kernel.org, Evan Green , Tomasz Figa , iommu@lists.linux-foundation.org, linux-mediatek@lists.infradead.org, ming-fan.chen@mediatek.com, anan.sun@mediatek.com, Greg Kroah-Hartman , linux-arm-kernel@lists.infradead.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" Some HW IP(ex: CCU) require the special iova range. That means the iova got from dma_alloc_attrs for that devices must locate in his special range. In this patch, we allocate a special iova_range for each a special requirement and create each a iommu domain for each a iova_range. meanwhile we still use one pagetable which support 16GB iova. After this patch, If the iova range of a master is over 4G, the master should: a) Declare its special dma_ranges in its dtsi node. For example, If we preassign the iova 4G-8G for vcodec, then the vcodec dtsi node should add this: /* * iova start at 0x1_0000_0000, pa still start at 0x4000_0000 * size is 0x1_0000_0000. */ dma-ranges = <0x1 0x0 0x0 0x40000000 0x1 0x0>; /* 4G ~ 8G */ Note: we don't have a actual bus concept here. the master doesn't have its special parent node, thus this dma-ranges can only be put in the master's node. b) Update the dma_mask: dma_set_mask_and_coherent(dev, DMA_BIT_MASK(33)); Signed-off-by: Yong Wu --- drivers/iommu/mtk_iommu.c | 47 +++++++++++++++++++++++++++++++-------- drivers/iommu/mtk_iommu.h | 3 ++- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c index 16760e318648..1d5d3e76d2d1 100644 --- a/drivers/iommu/mtk_iommu.c +++ b/drivers/iommu/mtk_iommu.c @@ -350,6 +350,14 @@ static int mtk_iommu_domain_finalise(struct mtk_iommu_domain *dom) { struct mtk_iommu_data *data = mtk_iommu_get_m4u_data(); + /* Use the exist domain as there is only one m4u pgtable here. */ + if (data->m4u_dom) { + dom->iop = data->m4u_dom->iop; + dom->cfg = data->m4u_dom->cfg; + dom->domain.pgsize_bitmap = data->m4u_dom->cfg.pgsize_bitmap; + return 0; + } + dom->cfg = (struct io_pgtable_cfg) { .quirks = IO_PGTABLE_QUIRK_ARM_NS | IO_PGTABLE_QUIRK_NO_PERMS | @@ -375,6 +383,8 @@ static int mtk_iommu_domain_finalise(struct mtk_iommu_domain *dom) static struct iommu_domain *mtk_iommu_domain_alloc(unsigned type) { + struct mtk_iommu_data *data = mtk_iommu_get_m4u_data(); + const struct mtk_iommu_iova_region *region; struct mtk_iommu_domain *dom; if (type != IOMMU_DOMAIN_DMA) @@ -390,8 +400,9 @@ static struct iommu_domain *mtk_iommu_domain_alloc(unsigned type) if (mtk_iommu_domain_finalise(dom)) goto put_dma_cookie; - dom->domain.geometry.aperture_start = 0; - dom->domain.geometry.aperture_end = DMA_BIT_MASK(32); + region = data->plat_data->iova_region + data->cur_domid; + dom->domain.geometry.aperture_start = region->iova_base; + dom->domain.geometry.aperture_end = region->iova_base + region->size - 1; dom->domain.geometry.force_aperture = true; return &dom->domain; @@ -535,19 +546,31 @@ static void mtk_iommu_release_device(struct device *dev) static struct iommu_group *mtk_iommu_device_group(struct device *dev) { struct mtk_iommu_data *data = mtk_iommu_get_m4u_data(); + struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); + struct iommu_group *group; + int domid; if (!data) return ERR_PTR(-ENODEV); - /* All the client devices are in the same m4u iommu-group */ - if (!data->m4u_group) { - data->m4u_group = iommu_group_alloc(); - if (IS_ERR(data->m4u_group)) + domid = MTK_M4U_TO_DOM(fwspec->ids[0]); + if (domid >= data->plat_data->iova_region_nr) { + dev_err(dev, "iommu domain id(%d/%d) is error.\n", domid, + data->plat_data->iova_region_nr); + return ERR_PTR(-EINVAL); + } + + group = data->m4u_group[domid]; + if (!group) { + group = iommu_group_alloc(); + if (IS_ERR(group)) dev_err(dev, "Failed to allocate M4U IOMMU group\n"); + data->m4u_group[domid] = group; } else { - iommu_group_ref_get(data->m4u_group); + iommu_group_ref_get(group); } - return data->m4u_group; + data->cur_domid = domid; + return group; } static int mtk_iommu_of_xlate(struct device *dev, struct of_phandle_args *args) @@ -576,14 +599,20 @@ static void mtk_iommu_get_resv_regions(struct device *dev, struct list_head *head) { struct mtk_iommu_data *data = dev_iommu_priv_get(dev); - const struct mtk_iommu_iova_region *resv; + const struct mtk_iommu_iova_region *resv, *curdom; struct iommu_resv_region *region; int prot = IOMMU_WRITE | IOMMU_READ; unsigned int i; + curdom = data->plat_data->iova_region + data->cur_domid; for (i = 0; i < data->plat_data->iova_region_nr; i++) { resv = data->plat_data->iova_region + i; + /* Only reserve when the region is in the current domain */ + if (resv->iova_base <= curdom->iova_base || + resv->iova_base + resv->size >= curdom->iova_base + curdom->size) + continue; + region = iommu_alloc_resv_region(resv->iova_base, resv->size, prot, IOMMU_RESV_RESERVED); if (!region) diff --git a/drivers/iommu/mtk_iommu.h b/drivers/iommu/mtk_iommu.h index d45c13c9d324..5e346464cdf8 100644 --- a/drivers/iommu/mtk_iommu.h +++ b/drivers/iommu/mtk_iommu.h @@ -66,7 +66,7 @@ struct mtk_iommu_data { phys_addr_t protect_base; /* protect memory base */ struct mtk_iommu_suspend_reg reg; struct mtk_iommu_domain *m4u_dom; - struct iommu_group *m4u_group; + struct iommu_group *m4u_group[MTK_M4U_DOM_NR_MAX]; bool enable_4GB; spinlock_t tlb_lock; /* lock for tlb range flush */ @@ -76,6 +76,7 @@ struct mtk_iommu_data { struct dma_iommu_mapping *mapping; /* For mtk_iommu_v1.c */ + unsigned int cur_domid; struct list_head list; struct mtk_smi_larb_iommu larb_imu[MTK_LARB_NR_MAX]; }; -- 2.18.0 _______________________________________________ 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=-13.5 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, URIBL_BLOCKED,USER_AGENT_GIT 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 7BFCDC2D0A8 for ; Wed, 30 Sep 2020 07:13:23 +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 15BCE2076E for ; Wed, 30 Sep 2020 07:13:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="POkvG+dU"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="OVfYiy7A" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 15BCE2076E 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:Message-ID:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=qiVslGTEU9uGw9o+OhdJbYISo6W5x4AOvFBbDaV3zys=; b=POkvG+dUuFDoZWzh2bJuh9vSQ B6h6v4kAfzhSiD67Dam14E09nhGIdSgmlaScp582NN3NvK8rvCgv2t7HNGcvW72z8ek8Qu3QfCBQt dZ5iKiwStuGXjMxj6lHUgx4k6CqtqUGFCGS/sgiM6ZcNl+EwI5zB1YE1nUqVmqvPIfb+Qi+XdUqCa QR1vxFdKRGRmxpbpXFIMRpDR59+ooxU75ge4CY5B4Y8S+sgP2Woxi58TZRTOCBOJHtLTgWhCu0YFO In0kpajcjnWIluhQoI9dV+RWc53MxCoNpYQMwQkWKcROF/pfl3DpI215Z5fvJE9txxP/8Wtj5zvLY 9WAncRD+A==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kNWIX-0008S9-9j; Wed, 30 Sep 2020 07:13:09 +0000 Received: from mailgw02.mediatek.com ([216.200.240.185]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kNWI5-0008EG-Rg; Wed, 30 Sep 2020 07:12:45 +0000 X-UUID: dcdfdc91891345b9a80cfa96f9823ced-20200929 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=2hXK/k5kh9YX+o1mfg47pv2P1bPYrxMP0olMJnC2mT8=; b=OVfYiy7AfKTEw8b/6SsTn7+74GW4KnNpI7a+pFJk0tU8v4AteZpk2qgHF3RSOmZAN1/WG06r9EwoQ0GrSFB9OwOaeI1He7kq/jFT4/1drKxxyNZ6f7vwp03Alumd+HdhyGVyjIpJ9d5TrfstC7wZ7/8hNa7CyoNjC+MDn/27ix4=; X-UUID: dcdfdc91891345b9a80cfa96f9823ced-20200929 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw02.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 847712818; Tue, 29 Sep 2020 23:12:34 -0800 Received: from mtkmbs08n1.mediatek.inc (172.21.101.55) by MTKMBS62N1.mediatek.inc (172.29.193.41) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 30 Sep 2020 00:11:12 -0700 Received: from mtkcas08.mediatek.inc (172.21.101.126) by mtkmbs08n1.mediatek.inc (172.21.101.55) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 30 Sep 2020 15:11:09 +0800 Received: from localhost.localdomain (10.17.3.153) by mtkcas08.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 30 Sep 2020 15:11:10 +0800 From: Yong Wu To: Joerg Roedel , Matthias Brugger , Rob Herring , Robin Murphy , Krzysztof Kozlowski , Will Deacon Subject: [PATCH v3 21/24] iommu/mediatek: Add support for multi domain Date: Wed, 30 Sep 2020 15:06:44 +0800 Message-ID: <20200930070647.10188-22-yong.wu@mediatek.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20200930070647.10188-1-yong.wu@mediatek.com> References: <20200930070647.10188-1-yong.wu@mediatek.com> MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200930_031242_094109_3A6148C2 X-CRM114-Status: GOOD ( 24.76 ) 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: youlin.pei@mediatek.com, devicetree@vger.kernel.org, Nicolas Boichat , srv_heupstream@mediatek.com, chao.hao@mediatek.com, kernel-team@android.com, linux-kernel@vger.kernel.org, Evan Green , Tomasz Figa , iommu@lists.linux-foundation.org, linux-mediatek@lists.infradead.org, yong.wu@mediatek.com, ming-fan.chen@mediatek.com, anan.sun@mediatek.com, Greg Kroah-Hartman , linux-arm-kernel@lists.infradead.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 Some HW IP(ex: CCU) require the special iova range. That means the iova got from dma_alloc_attrs for that devices must locate in his special range. In this patch, we allocate a special iova_range for each a special requirement and create each a iommu domain for each a iova_range. meanwhile we still use one pagetable which support 16GB iova. After this patch, If the iova range of a master is over 4G, the master should: a) Declare its special dma_ranges in its dtsi node. For example, If we preassign the iova 4G-8G for vcodec, then the vcodec dtsi node should add this: /* * iova start at 0x1_0000_0000, pa still start at 0x4000_0000 * size is 0x1_0000_0000. */ dma-ranges = <0x1 0x0 0x0 0x40000000 0x1 0x0>; /* 4G ~ 8G */ Note: we don't have a actual bus concept here. the master doesn't have its special parent node, thus this dma-ranges can only be put in the master's node. b) Update the dma_mask: dma_set_mask_and_coherent(dev, DMA_BIT_MASK(33)); Signed-off-by: Yong Wu --- drivers/iommu/mtk_iommu.c | 47 +++++++++++++++++++++++++++++++-------- drivers/iommu/mtk_iommu.h | 3 ++- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c index 16760e318648..1d5d3e76d2d1 100644 --- a/drivers/iommu/mtk_iommu.c +++ b/drivers/iommu/mtk_iommu.c @@ -350,6 +350,14 @@ static int mtk_iommu_domain_finalise(struct mtk_iommu_domain *dom) { struct mtk_iommu_data *data = mtk_iommu_get_m4u_data(); + /* Use the exist domain as there is only one m4u pgtable here. */ + if (data->m4u_dom) { + dom->iop = data->m4u_dom->iop; + dom->cfg = data->m4u_dom->cfg; + dom->domain.pgsize_bitmap = data->m4u_dom->cfg.pgsize_bitmap; + return 0; + } + dom->cfg = (struct io_pgtable_cfg) { .quirks = IO_PGTABLE_QUIRK_ARM_NS | IO_PGTABLE_QUIRK_NO_PERMS | @@ -375,6 +383,8 @@ static int mtk_iommu_domain_finalise(struct mtk_iommu_domain *dom) static struct iommu_domain *mtk_iommu_domain_alloc(unsigned type) { + struct mtk_iommu_data *data = mtk_iommu_get_m4u_data(); + const struct mtk_iommu_iova_region *region; struct mtk_iommu_domain *dom; if (type != IOMMU_DOMAIN_DMA) @@ -390,8 +400,9 @@ static struct iommu_domain *mtk_iommu_domain_alloc(unsigned type) if (mtk_iommu_domain_finalise(dom)) goto put_dma_cookie; - dom->domain.geometry.aperture_start = 0; - dom->domain.geometry.aperture_end = DMA_BIT_MASK(32); + region = data->plat_data->iova_region + data->cur_domid; + dom->domain.geometry.aperture_start = region->iova_base; + dom->domain.geometry.aperture_end = region->iova_base + region->size - 1; dom->domain.geometry.force_aperture = true; return &dom->domain; @@ -535,19 +546,31 @@ static void mtk_iommu_release_device(struct device *dev) static struct iommu_group *mtk_iommu_device_group(struct device *dev) { struct mtk_iommu_data *data = mtk_iommu_get_m4u_data(); + struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); + struct iommu_group *group; + int domid; if (!data) return ERR_PTR(-ENODEV); - /* All the client devices are in the same m4u iommu-group */ - if (!data->m4u_group) { - data->m4u_group = iommu_group_alloc(); - if (IS_ERR(data->m4u_group)) + domid = MTK_M4U_TO_DOM(fwspec->ids[0]); + if (domid >= data->plat_data->iova_region_nr) { + dev_err(dev, "iommu domain id(%d/%d) is error.\n", domid, + data->plat_data->iova_region_nr); + return ERR_PTR(-EINVAL); + } + + group = data->m4u_group[domid]; + if (!group) { + group = iommu_group_alloc(); + if (IS_ERR(group)) dev_err(dev, "Failed to allocate M4U IOMMU group\n"); + data->m4u_group[domid] = group; } else { - iommu_group_ref_get(data->m4u_group); + iommu_group_ref_get(group); } - return data->m4u_group; + data->cur_domid = domid; + return group; } static int mtk_iommu_of_xlate(struct device *dev, struct of_phandle_args *args) @@ -576,14 +599,20 @@ static void mtk_iommu_get_resv_regions(struct device *dev, struct list_head *head) { struct mtk_iommu_data *data = dev_iommu_priv_get(dev); - const struct mtk_iommu_iova_region *resv; + const struct mtk_iommu_iova_region *resv, *curdom; struct iommu_resv_region *region; int prot = IOMMU_WRITE | IOMMU_READ; unsigned int i; + curdom = data->plat_data->iova_region + data->cur_domid; for (i = 0; i < data->plat_data->iova_region_nr; i++) { resv = data->plat_data->iova_region + i; + /* Only reserve when the region is in the current domain */ + if (resv->iova_base <= curdom->iova_base || + resv->iova_base + resv->size >= curdom->iova_base + curdom->size) + continue; + region = iommu_alloc_resv_region(resv->iova_base, resv->size, prot, IOMMU_RESV_RESERVED); if (!region) diff --git a/drivers/iommu/mtk_iommu.h b/drivers/iommu/mtk_iommu.h index d45c13c9d324..5e346464cdf8 100644 --- a/drivers/iommu/mtk_iommu.h +++ b/drivers/iommu/mtk_iommu.h @@ -66,7 +66,7 @@ struct mtk_iommu_data { phys_addr_t protect_base; /* protect memory base */ struct mtk_iommu_suspend_reg reg; struct mtk_iommu_domain *m4u_dom; - struct iommu_group *m4u_group; + struct iommu_group *m4u_group[MTK_M4U_DOM_NR_MAX]; bool enable_4GB; spinlock_t tlb_lock; /* lock for tlb range flush */ @@ -76,6 +76,7 @@ struct mtk_iommu_data { struct dma_iommu_mapping *mapping; /* For mtk_iommu_v1.c */ + unsigned int cur_domid; struct list_head list; struct mtk_smi_larb_iommu larb_imu[MTK_LARB_NR_MAX]; }; -- 2.18.0 _______________________________________________ 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=-13.5 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, URIBL_BLOCKED,USER_AGENT_GIT 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 D69E5C2D0A8 for ; Wed, 30 Sep 2020 07:15:50 +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 576F120739 for ; Wed, 30 Sep 2020 07:15:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="fY3DovrV"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="OVfYiy7A" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 576F120739 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:Message-ID:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=VSo30JSE2lVamsiBS+RRPvxfoK+37OphgTHD9DJa4d4=; b=fY3DovrVYgblTmLnSeHHJ7xuN acyr2EGhKBCiqJvK/LJ9b9NHODQI6pKrjkdbB6N1KA9ExsqWiHHBI7AxBo98Zo3J36g7QcVnbsYBH D9lXdnYrCbP6SytVuevHLhKeaqNwHZEDXAjevA+dK9OeOB7mrkDC/slMjJeumFH0Y/OGNnHtItfQm 1Swe3u7NdgqycXwbVFFgV9Ih+F0P7RFDU4+Ci9l7Rbftmy6OFiDxBBoBsvSXscGWPUkIWhUDJdwoU x+0ulaGvyjQjjfKsUpyWveCflJAQLm+KvUGBu2+ED0ZdFNXOjAogyW/nyxHIR5SInsxOoPJvGYGWn YVv4mSYAQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kNWJ6-0000HT-Cp; Wed, 30 Sep 2020 07:13:44 +0000 Received: from mailgw02.mediatek.com ([216.200.240.185]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kNWI5-0008EG-Rg; Wed, 30 Sep 2020 07:12:45 +0000 X-UUID: dcdfdc91891345b9a80cfa96f9823ced-20200929 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=2hXK/k5kh9YX+o1mfg47pv2P1bPYrxMP0olMJnC2mT8=; b=OVfYiy7AfKTEw8b/6SsTn7+74GW4KnNpI7a+pFJk0tU8v4AteZpk2qgHF3RSOmZAN1/WG06r9EwoQ0GrSFB9OwOaeI1He7kq/jFT4/1drKxxyNZ6f7vwp03Alumd+HdhyGVyjIpJ9d5TrfstC7wZ7/8hNa7CyoNjC+MDn/27ix4=; X-UUID: dcdfdc91891345b9a80cfa96f9823ced-20200929 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw02.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 847712818; Tue, 29 Sep 2020 23:12:34 -0800 Received: from mtkmbs08n1.mediatek.inc (172.21.101.55) by MTKMBS62N1.mediatek.inc (172.29.193.41) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 30 Sep 2020 00:11:12 -0700 Received: from mtkcas08.mediatek.inc (172.21.101.126) by mtkmbs08n1.mediatek.inc (172.21.101.55) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 30 Sep 2020 15:11:09 +0800 Received: from localhost.localdomain (10.17.3.153) by mtkcas08.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 30 Sep 2020 15:11:10 +0800 From: Yong Wu To: Joerg Roedel , Matthias Brugger , Rob Herring , Robin Murphy , Krzysztof Kozlowski , Will Deacon Subject: [PATCH v3 21/24] iommu/mediatek: Add support for multi domain Date: Wed, 30 Sep 2020 15:06:44 +0800 Message-ID: <20200930070647.10188-22-yong.wu@mediatek.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20200930070647.10188-1-yong.wu@mediatek.com> References: <20200930070647.10188-1-yong.wu@mediatek.com> MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200930_031242_094109_3A6148C2 X-CRM114-Status: GOOD ( 24.76 ) 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: youlin.pei@mediatek.com, devicetree@vger.kernel.org, Nicolas Boichat , srv_heupstream@mediatek.com, chao.hao@mediatek.com, kernel-team@android.com, linux-kernel@vger.kernel.org, Evan Green , Tomasz Figa , iommu@lists.linux-foundation.org, linux-mediatek@lists.infradead.org, yong.wu@mediatek.com, ming-fan.chen@mediatek.com, anan.sun@mediatek.com, Greg Kroah-Hartman , linux-arm-kernel@lists.infradead.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 Some HW IP(ex: CCU) require the special iova range. That means the iova got from dma_alloc_attrs for that devices must locate in his special range. In this patch, we allocate a special iova_range for each a special requirement and create each a iommu domain for each a iova_range. meanwhile we still use one pagetable which support 16GB iova. After this patch, If the iova range of a master is over 4G, the master should: a) Declare its special dma_ranges in its dtsi node. For example, If we preassign the iova 4G-8G for vcodec, then the vcodec dtsi node should add this: /* * iova start at 0x1_0000_0000, pa still start at 0x4000_0000 * size is 0x1_0000_0000. */ dma-ranges = <0x1 0x0 0x0 0x40000000 0x1 0x0>; /* 4G ~ 8G */ Note: we don't have a actual bus concept here. the master doesn't have its special parent node, thus this dma-ranges can only be put in the master's node. b) Update the dma_mask: dma_set_mask_and_coherent(dev, DMA_BIT_MASK(33)); Signed-off-by: Yong Wu --- drivers/iommu/mtk_iommu.c | 47 +++++++++++++++++++++++++++++++-------- drivers/iommu/mtk_iommu.h | 3 ++- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c index 16760e318648..1d5d3e76d2d1 100644 --- a/drivers/iommu/mtk_iommu.c +++ b/drivers/iommu/mtk_iommu.c @@ -350,6 +350,14 @@ static int mtk_iommu_domain_finalise(struct mtk_iommu_domain *dom) { struct mtk_iommu_data *data = mtk_iommu_get_m4u_data(); + /* Use the exist domain as there is only one m4u pgtable here. */ + if (data->m4u_dom) { + dom->iop = data->m4u_dom->iop; + dom->cfg = data->m4u_dom->cfg; + dom->domain.pgsize_bitmap = data->m4u_dom->cfg.pgsize_bitmap; + return 0; + } + dom->cfg = (struct io_pgtable_cfg) { .quirks = IO_PGTABLE_QUIRK_ARM_NS | IO_PGTABLE_QUIRK_NO_PERMS | @@ -375,6 +383,8 @@ static int mtk_iommu_domain_finalise(struct mtk_iommu_domain *dom) static struct iommu_domain *mtk_iommu_domain_alloc(unsigned type) { + struct mtk_iommu_data *data = mtk_iommu_get_m4u_data(); + const struct mtk_iommu_iova_region *region; struct mtk_iommu_domain *dom; if (type != IOMMU_DOMAIN_DMA) @@ -390,8 +400,9 @@ static struct iommu_domain *mtk_iommu_domain_alloc(unsigned type) if (mtk_iommu_domain_finalise(dom)) goto put_dma_cookie; - dom->domain.geometry.aperture_start = 0; - dom->domain.geometry.aperture_end = DMA_BIT_MASK(32); + region = data->plat_data->iova_region + data->cur_domid; + dom->domain.geometry.aperture_start = region->iova_base; + dom->domain.geometry.aperture_end = region->iova_base + region->size - 1; dom->domain.geometry.force_aperture = true; return &dom->domain; @@ -535,19 +546,31 @@ static void mtk_iommu_release_device(struct device *dev) static struct iommu_group *mtk_iommu_device_group(struct device *dev) { struct mtk_iommu_data *data = mtk_iommu_get_m4u_data(); + struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); + struct iommu_group *group; + int domid; if (!data) return ERR_PTR(-ENODEV); - /* All the client devices are in the same m4u iommu-group */ - if (!data->m4u_group) { - data->m4u_group = iommu_group_alloc(); - if (IS_ERR(data->m4u_group)) + domid = MTK_M4U_TO_DOM(fwspec->ids[0]); + if (domid >= data->plat_data->iova_region_nr) { + dev_err(dev, "iommu domain id(%d/%d) is error.\n", domid, + data->plat_data->iova_region_nr); + return ERR_PTR(-EINVAL); + } + + group = data->m4u_group[domid]; + if (!group) { + group = iommu_group_alloc(); + if (IS_ERR(group)) dev_err(dev, "Failed to allocate M4U IOMMU group\n"); + data->m4u_group[domid] = group; } else { - iommu_group_ref_get(data->m4u_group); + iommu_group_ref_get(group); } - return data->m4u_group; + data->cur_domid = domid; + return group; } static int mtk_iommu_of_xlate(struct device *dev, struct of_phandle_args *args) @@ -576,14 +599,20 @@ static void mtk_iommu_get_resv_regions(struct device *dev, struct list_head *head) { struct mtk_iommu_data *data = dev_iommu_priv_get(dev); - const struct mtk_iommu_iova_region *resv; + const struct mtk_iommu_iova_region *resv, *curdom; struct iommu_resv_region *region; int prot = IOMMU_WRITE | IOMMU_READ; unsigned int i; + curdom = data->plat_data->iova_region + data->cur_domid; for (i = 0; i < data->plat_data->iova_region_nr; i++) { resv = data->plat_data->iova_region + i; + /* Only reserve when the region is in the current domain */ + if (resv->iova_base <= curdom->iova_base || + resv->iova_base + resv->size >= curdom->iova_base + curdom->size) + continue; + region = iommu_alloc_resv_region(resv->iova_base, resv->size, prot, IOMMU_RESV_RESERVED); if (!region) diff --git a/drivers/iommu/mtk_iommu.h b/drivers/iommu/mtk_iommu.h index d45c13c9d324..5e346464cdf8 100644 --- a/drivers/iommu/mtk_iommu.h +++ b/drivers/iommu/mtk_iommu.h @@ -66,7 +66,7 @@ struct mtk_iommu_data { phys_addr_t protect_base; /* protect memory base */ struct mtk_iommu_suspend_reg reg; struct mtk_iommu_domain *m4u_dom; - struct iommu_group *m4u_group; + struct iommu_group *m4u_group[MTK_M4U_DOM_NR_MAX]; bool enable_4GB; spinlock_t tlb_lock; /* lock for tlb range flush */ @@ -76,6 +76,7 @@ struct mtk_iommu_data { struct dma_iommu_mapping *mapping; /* For mtk_iommu_v1.c */ + unsigned int cur_domid; struct list_head list; struct mtk_smi_larb_iommu larb_imu[MTK_LARB_NR_MAX]; }; -- 2.18.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel