From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rob Herring Subject: [PATCH v3 1/3] iommu: io-pgtable: Add ARM Mali midgard MMU page table format Date: Mon, 1 Apr 2019 02:47:28 -0500 Message-ID: <20190401074730.12241-2-robh@kernel.org> References: <20190401074730.12241-1-robh@kernel.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20190401074730.12241-1-robh@kernel.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: Sean Paul , Maxime Ripard , Neil Armstrong , Will Deacon , linux-kernel@vger.kernel.org, David Airlie , iommu@lists.linux-foundation.org, Alyssa Rosenzweig , Robin Murphy , linux-arm-kernel@lists.infradead.org List-Id: iommu@lists.linux-foundation.org QVJNIE1hbGkgbWlkZ2FyZCBHUFUgaXMgc2ltaWxhciB0byBzdGFuZGFyZCA2NC1iaXQgc3RhZ2Ug MSBwYWdlIHRhYmxlcywgYnV0CmhhdmUgYSBmZXcgZGlmZmVyZW5jZXMuIEFkZCBhIG5ldyBmb3Jt YXQgdHlwZSB0byByZXByZXNlbnQgdGhlIGZvcm1hdC4gVGhlCmlucHV0IGFkZHJlc3Mgc2l6ZSBp cyA0OC1iaXRzIGFuZCB0aGUgb3V0cHV0IGFkZHJlc3Mgc2l6ZSBpcyA0MC1iaXRzIChhbmQKcG9z c2libHkgbGVzcz8pLiBOb3RlIHRoYXQgdGhlIGxhdGVyIGJpZnJvc3QgR1BVcyBmb2xsb3cgdGhl IHN0YW5kYXJkCjY0LWJpdCBzdGFnZSAxIGZvcm1hdC4KClRoZSBkaWZmZXJlbmNlcyBpbiB0aGUg Zm9ybWF0IGNvbXBhcmVkIHRvIDY0LWJpdCBzdGFnZSAxIGZvcm1hdCBhcmU6CgpUaGUgM3JkIGxl dmVsIHBhZ2UgZW50cnkgYml0cyBhcmUgMHgxIGluc3RlYWQgb2YgMHgzIGZvciBwYWdlIGVudHJp ZXMuCgpUaGUgYWNjZXNzIGZsYWdzIGFyZSBub3QgcmVhZC1vbmx5IGFuZCB1bnByaXZpbGVnZWQs IGJ1dCByZWFkIGFuZCB3cml0ZS4KVGhpcyBpcyBzaW1pbGFyIHRvIHN0YWdlIDIgZW50cmllcywg YnV0IHRoZSBtZW1vcnkgYXR0cmlidXRlcyBmaWVsZCBtYXRjaGVzCnN0YWdlIDEgYmVpbmcgYW4g aW5kZXguCgpUaGUgbkcgYml0IGlzIG5vdCBzZXQgYnkgdGhlIHZlbmRvciBkcml2ZXIuIFRoaXMg b25lIGRpZG4ndCBzZWVtIHRvIG1hdHRlciwKYnV0IHdlJ2xsIGtlZXAgaXQgYWxpZ25lZCB0byB0 aGUgdmVuZG9yIGRyaXZlci4KCkNjOiBXaWxsIERlYWNvbiA8d2lsbC5kZWFjb25AYXJtLmNvbT4K Q2M6IFJvYmluIE11cnBoeSA8cm9iaW4ubXVycGh5QGFybS5jb20+CkNjOiBKb2VyZyBSb2VkZWwg PGpvcm9AOGJ5dGVzLm9yZz4KQ2M6IGxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9y ZwpDYzogaW9tbXVAbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKU2lnbmVkLW9mZi1ieTogUm9i IEhlcnJpbmcgPHJvYmhAa2VybmVsLm9yZz4KLS0tClBsZWFzZSBhY2sgdGhpcyBhcyBJIG5lZWQg dG8gYXBwbHkgaXQgdG8gdGhlIGRybS1taXNjIHRyZWUuIE9yIHdlIG5lZWQgYQpzdGFibGUgYnJh bmNoIHdpdGggdGhpcyBwYXRjaC4KCnYzOgotIFJld29yayBhcm1fbHBhZV9wcm90X3RvX3B0ZSBh cyB3cml0dGVuIGJ5IFJvYmluCi0gRmlsbCBpbiBjb21wbGV0ZSByZWdpc3RlciB2YWx1ZXMgZm9y IFRSQU5TVEFCIGFuZCBNRU1BVFRSIHJlZ2lzdGVycwoKCiBkcml2ZXJzL2lvbW11L2lvLXBndGFi bGUtYXJtLmMgfCA5MyArKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tCiBkcml2ZXJz L2lvbW11L2lvLXBndGFibGUuYyAgICAgfCAgMSArCiBpbmNsdWRlL2xpbnV4L2lvLXBndGFibGUu aCAgICAgfCAgNyArKysKIDMgZmlsZXMgY2hhbmdlZCwgNzcgaW5zZXJ0aW9ucygrKSwgMjQgZGVs ZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLWFybS5jIGIv ZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLWFybS5jCmluZGV4IGQzNzAwZWMxNWNiZC4uOTg1NTFk MGNmZjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2lvLXBndGFibGUtYXJtLmMKKysrIGIv ZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLWFybS5jCkBAIC0xNzIsNiArMTcyLDEwIEBACiAjZGVm aW5lIEFSTV9MUEFFX01BSVJfQVRUUl9JRFhfQ0FDSEUJMQogI2RlZmluZSBBUk1fTFBBRV9NQUlS X0FUVFJfSURYX0RFVgkyCgorI2RlZmluZSBBUk1fTUFMSV9MUEFFX1RUQlJfQURSTU9ERV9UQUJM RSAoM3UgPDwgMCkKKyNkZWZpbmUgQVJNX01BTElfTFBBRV9UVEJSX1JFQURfSU5ORVIJQklUKDIp CisjZGVmaW5lIEFSTV9NQUxJX0xQQUVfVFRCUl9TSEFSRV9PVVRFUglCSVQoNCkKKwogLyogSU9Q VEUgYWNjZXNzb3JzICovCiAjZGVmaW5lIGlvcHRlX2RlcmVmKHB0ZSxkKSBfX3ZhKGlvcHRlX3Rv X3BhZGRyKHB0ZSwgZCkpCgpAQCAtMTgwLDExICsxODQsNiBAQAoKICNkZWZpbmUgaW9wdGVfcHJv dChwdGUpCSgocHRlKSAmIEFSTV9MUEFFX1BURV9BVFRSX01BU0spCgotI2RlZmluZSBpb3B0ZV9s ZWFmKHB0ZSxsKQkJCQkJXAotCShsID09IChBUk1fTFBBRV9NQVhfTEVWRUxTIC0gMSkgPwkJCVwK LQkJKGlvcHRlX3R5cGUocHRlLGwpID09IEFSTV9MUEFFX1BURV9UWVBFX1BBR0UpIDoJXAotCQko aW9wdGVfdHlwZShwdGUsbCkgPT0gQVJNX0xQQUVfUFRFX1RZUEVfQkxPQ0spKQotCiBzdHJ1Y3Qg YXJtX2xwYWVfaW9fcGd0YWJsZSB7CiAJc3RydWN0IGlvX3BndGFibGUJaW9wOwoKQEAgLTE5OCw2 ICsxOTcsMTQgQEAgc3RydWN0IGFybV9scGFlX2lvX3BndGFibGUgewoKIHR5cGVkZWYgdTY0IGFy bV9scGFlX2lvcHRlOwoKK3N0YXRpYyBpbmxpbmUgYm9vbCBpb3B0ZV9sZWFmKGFybV9scGFlX2lv cHRlIHB0ZSwgaW50IGwsIGVudW0gaW9fcGd0YWJsZV9mbXQgZm10KQoreworCWlmICgobCA9PSAo QVJNX0xQQUVfTUFYX0xFVkVMUyAtIDEpKSAmJiAoZm10ICE9IEFSTV9NQUxJX0xQQUUpKQorCQly ZXR1cm4gaW9wdGVfdHlwZShwdGUsbCkgPT0gQVJNX0xQQUVfUFRFX1RZUEVfUEFHRTsKKworCXJl dHVybiBpb3B0ZV90eXBlKHB0ZSxsKSA9PSBBUk1fTFBBRV9QVEVfVFlQRV9CTE9DSzsKK30KKwog c3RhdGljIGFybV9scGFlX2lvcHRlIHBhZGRyX3RvX2lvcHRlKHBoeXNfYWRkcl90IHBhZGRyLAog CQkJCSAgICAgc3RydWN0IGFybV9scGFlX2lvX3BndGFibGUgKmRhdGEpCiB7CkBAIC0zMDMsMTIg KzMxMCwxNyBAQCBzdGF0aWMgdm9pZCBfX2FybV9scGFlX2luaXRfcHRlKHN0cnVjdCBhcm1fbHBh ZV9pb19wZ3RhYmxlICpkYXRhLAogCWlmIChkYXRhLT5pb3AuY2ZnLnF1aXJrcyAmIElPX1BHVEFC TEVfUVVJUktfQVJNX05TKQogCQlwdGUgfD0gQVJNX0xQQUVfUFRFX05TOwoKLQlpZiAobHZsID09 IEFSTV9MUEFFX01BWF9MRVZFTFMgLSAxKQotCQlwdGUgfD0gQVJNX0xQQUVfUFRFX1RZUEVfUEFH RTsKLQllbHNlCisJaWYgKGx2bCA9PSBBUk1fTFBBRV9NQVhfTEVWRUxTIC0gMSkgeworCQlpZiAo ZGF0YS0+aW9wLmZtdCA9PSBBUk1fTUFMSV9MUEFFKQorCQkJcHRlIHw9IEFSTV9MUEFFX1BURV9U WVBFX0JMT0NLOworCQllbHNlCisJCQlwdGUgfD0gQVJNX0xQQUVfUFRFX1RZUEVfUEFHRTsKKwl9 IGVsc2UKIAkJcHRlIHw9IEFSTV9MUEFFX1BURV9UWVBFX0JMT0NLOwoKLQlwdGUgfD0gQVJNX0xQ QUVfUFRFX0FGIHwgQVJNX0xQQUVfUFRFX1NIX0lTOworCWlmIChkYXRhLT5pb3AuZm10ICE9IEFS TV9NQUxJX0xQQUUpCisJCXB0ZSB8PSBBUk1fTFBBRV9QVEVfQUY7CisJcHRlIHw9IEFSTV9MUEFF X1BURV9TSF9JUzsKIAlwdGUgfD0gcGFkZHJfdG9faW9wdGUocGFkZHIsIGRhdGEpOwoKIAlfX2Fy bV9scGFlX3NldF9wdGUocHRlcCwgcHRlLCAmZGF0YS0+aW9wLmNmZyk7CkBAIC0zMjEsNyArMzMz LDcgQEAgc3RhdGljIGludCBhcm1fbHBhZV9pbml0X3B0ZShzdHJ1Y3QgYXJtX2xwYWVfaW9fcGd0 YWJsZSAqZGF0YSwKIHsKIAlhcm1fbHBhZV9pb3B0ZSBwdGUgPSAqcHRlcDsKCi0JaWYgKGlvcHRl X2xlYWYocHRlLCBsdmwpKSB7CisJaWYgKGlvcHRlX2xlYWYocHRlLCBsdmwsIGRhdGEtPmlvcC5m bXQpKSB7CiAJCS8qIFdlIHJlcXVpcmUgYW4gdW5tYXAgZmlyc3QgKi8KIAkJV0FSTl9PTighc2Vs ZnRlc3RfcnVubmluZyk7CiAJCXJldHVybiAtRUVYSVNUOwpAQCAtNDA5LDcgKzQyMSw3IEBAIHN0 YXRpYyBpbnQgX19hcm1fbHBhZV9tYXAoc3RydWN0IGFybV9scGFlX2lvX3BndGFibGUgKmRhdGEs IHVuc2lnbmVkIGxvbmcgaW92YSwKIAkJX19hcm1fbHBhZV9zeW5jX3B0ZShwdGVwLCBjZmcpOwog CX0KCi0JaWYgKHB0ZSAmJiAhaW9wdGVfbGVhZihwdGUsIGx2bCkpIHsKKwlpZiAocHRlICYmICFp b3B0ZV9sZWFmKHB0ZSwgbHZsLCBkYXRhLT5pb3AuZm10KSkgewogCQljcHRlcCA9IGlvcHRlX2Rl cmVmKHB0ZSwgZGF0YSk7CiAJfSBlbHNlIGlmIChwdGUpIHsKIAkJLyogV2UgcmVxdWlyZSBhbiB1 bm1hcCBmaXJzdCAqLwpAQCAtNDI5LDMxICs0NDEsMzMgQEAgc3RhdGljIGFybV9scGFlX2lvcHRl IGFybV9scGFlX3Byb3RfdG9fcHRlKHN0cnVjdCBhcm1fbHBhZV9pb19wZ3RhYmxlICpkYXRhLAog CWlmIChkYXRhLT5pb3AuZm10ID09IEFSTV82NF9MUEFFX1MxIHx8CiAJICAgIGRhdGEtPmlvcC5m bXQgPT0gQVJNXzMyX0xQQUVfUzEpIHsKIAkJcHRlID0gQVJNX0xQQUVfUFRFX25HOwotCiAJCWlm ICghKHByb3QgJiBJT01NVV9XUklURSkgJiYgKHByb3QgJiBJT01NVV9SRUFEKSkKIAkJCXB0ZSB8 PSBBUk1fTFBBRV9QVEVfQVBfUkRPTkxZOwotCiAJCWlmICghKHByb3QgJiBJT01NVV9QUklWKSkK IAkJCXB0ZSB8PSBBUk1fTFBBRV9QVEVfQVBfVU5QUklWOwotCi0JCWlmIChwcm90ICYgSU9NTVVf TU1JTykKLQkJCXB0ZSB8PSAoQVJNX0xQQUVfTUFJUl9BVFRSX0lEWF9ERVYKLQkJCQk8PCBBUk1f TFBBRV9QVEVfQVRUUklORFhfU0hJRlQpOwotCQllbHNlIGlmIChwcm90ICYgSU9NTVVfQ0FDSEUp Ci0JCQlwdGUgfD0gKEFSTV9MUEFFX01BSVJfQVRUUl9JRFhfQ0FDSEUKLQkJCQk8PCBBUk1fTFBB RV9QVEVfQVRUUklORFhfU0hJRlQpOwogCX0gZWxzZSB7CiAJCXB0ZSA9IEFSTV9MUEFFX1BURV9I QVBfRkFVTFQ7CiAJCWlmIChwcm90ICYgSU9NTVVfUkVBRCkKIAkJCXB0ZSB8PSBBUk1fTFBBRV9Q VEVfSEFQX1JFQUQ7CiAJCWlmIChwcm90ICYgSU9NTVVfV1JJVEUpCiAJCQlwdGUgfD0gQVJNX0xQ QUVfUFRFX0hBUF9XUklURTsKKwl9CisKKwlpZiAoZGF0YS0+aW9wLmZtdCA9PSBBUk1fNjRfTFBB RV9TMiB8fAorCSAgICBkYXRhLT5pb3AuZm10ID09IEFSTV8zMl9MUEFFX1MyKSB7CiAJCWlmIChw cm90ICYgSU9NTVVfTU1JTykKIAkJCXB0ZSB8PSBBUk1fTFBBRV9QVEVfTUVNQVRUUl9ERVY7CiAJ CWVsc2UgaWYgKHByb3QgJiBJT01NVV9DQUNIRSkKIAkJCXB0ZSB8PSBBUk1fTFBBRV9QVEVfTUVN QVRUUl9PSVdCOwogCQllbHNlCiAJCQlwdGUgfD0gQVJNX0xQQUVfUFRFX01FTUFUVFJfTkM7CisJ fSBlbHNlIHsKKwkJaWYgKHByb3QgJiBJT01NVV9NTUlPKQorCQkJcHRlIHw9IChBUk1fTFBBRV9N QUlSX0FUVFJfSURYX0RFVgorCQkJCTw8IEFSTV9MUEFFX1BURV9BVFRSSU5EWF9TSElGVCk7CisJ CWVsc2UgaWYgKHByb3QgJiBJT01NVV9DQUNIRSkKKwkJCXB0ZSB8PSAoQVJNX0xQQUVfTUFJUl9B VFRSX0lEWF9DQUNIRQorCQkJCTw8IEFSTV9MUEFFX1BURV9BVFRSSU5EWF9TSElGVCk7CiAJfQoK IAlpZiAocHJvdCAmIElPTU1VX05PRVhFQykKQEAgLTUxMSw3ICs1MjUsNyBAQCBzdGF0aWMgdm9p ZCBfX2FybV9scGFlX2ZyZWVfcGd0YWJsZShzdHJ1Y3QgYXJtX2xwYWVfaW9fcGd0YWJsZSAqZGF0 YSwgaW50IGx2bCwKIAl3aGlsZSAocHRlcCAhPSBlbmQpIHsKIAkJYXJtX2xwYWVfaW9wdGUgcHRl ID0gKnB0ZXArKzsKCi0JCWlmICghcHRlIHx8IGlvcHRlX2xlYWYocHRlLCBsdmwpKQorCQlpZiAo IXB0ZSB8fCBpb3B0ZV9sZWFmKHB0ZSwgbHZsLCBkYXRhLT5pb3AuZm10KSkKIAkJCWNvbnRpbnVl OwoKIAkJX19hcm1fbHBhZV9mcmVlX3BndGFibGUoZGF0YSwgbHZsICsgMSwgaW9wdGVfZGVyZWYo cHRlLCBkYXRhKSk7CkBAIC02MDIsNyArNjE2LDcgQEAgc3RhdGljIHNpemVfdCBfX2FybV9scGFl X3VubWFwKHN0cnVjdCBhcm1fbHBhZV9pb19wZ3RhYmxlICpkYXRhLAogCWlmIChzaXplID09IEFS TV9MUEFFX0JMT0NLX1NJWkUobHZsLCBkYXRhKSkgewogCQlfX2FybV9scGFlX3NldF9wdGUocHRl cCwgMCwgJmlvcC0+Y2ZnKTsKCi0JCWlmICghaW9wdGVfbGVhZihwdGUsIGx2bCkpIHsKKwkJaWYg KCFpb3B0ZV9sZWFmKHB0ZSwgbHZsLCBpb3AtPmZtdCkpIHsKIAkJCS8qIEFsc28gZmx1c2ggYW55 IHBhcnRpYWwgd2Fsa3MgKi8KIAkJCWlvX3BndGFibGVfdGxiX2FkZF9mbHVzaChpb3AsIGlvdmEs IHNpemUsCiAJCQkJCQlBUk1fTFBBRV9HUkFOVUxFKGRhdGEpLCBmYWxzZSk7CkBAIC02MjEsNyAr NjM1LDcgQEAgc3RhdGljIHNpemVfdCBfX2FybV9scGFlX3VubWFwKHN0cnVjdCBhcm1fbHBhZV9p b19wZ3RhYmxlICpkYXRhLAogCQl9CgogCQlyZXR1cm4gc2l6ZTsKLQl9IGVsc2UgaWYgKGlvcHRl X2xlYWYocHRlLCBsdmwpKSB7CisJfSBlbHNlIGlmIChpb3B0ZV9sZWFmKHB0ZSwgbHZsLCBpb3At PmZtdCkpIHsKIAkJLyoKIAkJICogSW5zZXJ0IGEgdGFibGUgYXQgdGhlIG5leHQgbGV2ZWwgdG8g bWFwIHRoZSBvbGQgcmVnaW9uLAogCQkgKiBtaW51cyB0aGUgcGFydCB3ZSB3YW50IHRvIHVubWFw CkBAIC02NjksNyArNjgzLDcgQEAgc3RhdGljIHBoeXNfYWRkcl90IGFybV9scGFlX2lvdmFfdG9f cGh5cyhzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMgKm9wcywKIAkJCXJldHVybiAwOwoKIAkJLyogTGVh ZiBlbnRyeT8gKi8KLQkJaWYgKGlvcHRlX2xlYWYocHRlLGx2bCkpCisJCWlmIChpb3B0ZV9sZWFm KHB0ZSwgbHZsLCBkYXRhLT5pb3AuZm10KSkKIAkJCWdvdG8gZm91bmRfdHJhbnNsYXRpb247Cgog CQkvKiBUYWtlIGl0IHRvIHRoZSBuZXh0IGxldmVsICovCkBAIC05OTUsNiArMTAwOSwzMiBAQCBh cm1fMzJfbHBhZV9hbGxvY19wZ3RhYmxlX3MyKHN0cnVjdCBpb19wZ3RhYmxlX2NmZyAqY2ZnLCB2 b2lkICpjb29raWUpCiAJcmV0dXJuIGlvcDsKIH0KCitzdGF0aWMgc3RydWN0IGlvX3BndGFibGUg KgorYXJtX21hbGlfbHBhZV9hbGxvY19wZ3RhYmxlKHN0cnVjdCBpb19wZ3RhYmxlX2NmZyAqY2Zn LCB2b2lkICpjb29raWUpCit7CisJc3RydWN0IGlvX3BndGFibGUgKmlvcDsKKworCWlmIChjZmct PmlhcyAhPSA0OCB8fCBjZmctPm9hcyA+IDQwKQorCQlyZXR1cm4gTlVMTDsKKworCWNmZy0+cGdz aXplX2JpdG1hcCAmPSAoU1pfNEsgfCBTWl8yTSB8IFNaXzFHKTsKKwlpb3AgPSBhcm1fNjRfbHBh ZV9hbGxvY19wZ3RhYmxlX3MxKGNmZywgY29va2llKTsKKwlpZiAoaW9wKSB7CisJCXU2NCBtYWly LCB0dGJyOworCisJCS8qIENvcHkgdmFsdWVzIGFzIHVuaW9uIGZpZWxkcyBvdmVybGFwICovCisJ CW1haXIgPSBjZmctPmFybV9scGFlX3MxX2NmZy5tYWlyWzBdOworCQl0dGJyID0gY2ZnLT5hcm1f bHBhZV9zMV9jZmcudHRiclswXTsKKworCQljZmctPmFybV9tYWxpX2xwYWVfY2ZnLm1lbWF0dHIg PSBtYWlyOworCQljZmctPmFybV9tYWxpX2xwYWVfY2ZnLnRyYW5zdGFiID0gdHRiciB8CisJCQlB Uk1fTUFMSV9MUEFFX1RUQlJfUkVBRF9JTk5FUiB8CisJCQlBUk1fTUFMSV9MUEFFX1RUQlJfQURS TU9ERV9UQUJMRTsKKwl9CisKKwlyZXR1cm4gaW9wOworfQorCiBzdHJ1Y3QgaW9fcGd0YWJsZV9p bml0X2ZucyBpb19wZ3RhYmxlX2FybV82NF9scGFlX3MxX2luaXRfZm5zID0gewogCS5hbGxvYwk9 IGFybV82NF9scGFlX2FsbG9jX3BndGFibGVfczEsCiAJLmZyZWUJPSBhcm1fbHBhZV9mcmVlX3Bn dGFibGUsCkBAIC0xMDE1LDYgKzEwNTUsMTEgQEAgc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMg aW9fcGd0YWJsZV9hcm1fMzJfbHBhZV9zMl9pbml0X2ZucyA9IHsKIAkuZnJlZQk9IGFybV9scGFl X2ZyZWVfcGd0YWJsZSwKIH07Cgorc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgaW9fcGd0YWJs ZV9hcm1fbWFsaV9scGFlX2luaXRfZm5zID0geworCS5hbGxvYwk9IGFybV9tYWxpX2xwYWVfYWxs b2NfcGd0YWJsZSwKKwkuZnJlZQk9IGFybV9scGFlX2ZyZWVfcGd0YWJsZSwKK307CisKICNpZmRl ZiBDT05GSUdfSU9NTVVfSU9fUEdUQUJMRV9MUEFFX1NFTEZURVNUCgogc3RhdGljIHN0cnVjdCBp b19wZ3RhYmxlX2NmZyAqY2ZnX2Nvb2tpZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvaW8t cGd0YWJsZS5jIGIvZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLmMKaW5kZXggOTNmMjg4MGJlNmM2 Li41MjI3Y2ZkYmI2NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS5jCisr KyBiL2RyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS5jCkBAIC0zMCw2ICszMCw3IEBAIGlvX3BndGFi bGVfaW5pdF90YWJsZVtJT19QR1RBQkxFX05VTV9GTVRTXSA9IHsKIAlbQVJNXzMyX0xQQUVfUzJd ID0gJmlvX3BndGFibGVfYXJtXzMyX2xwYWVfczJfaW5pdF9mbnMsCiAJW0FSTV82NF9MUEFFX1Mx XSA9ICZpb19wZ3RhYmxlX2FybV82NF9scGFlX3MxX2luaXRfZm5zLAogCVtBUk1fNjRfTFBBRV9T Ml0gPSAmaW9fcGd0YWJsZV9hcm1fNjRfbHBhZV9zMl9pbml0X2ZucywKKwlbQVJNX01BTElfTFBB RV0gPSAmaW9fcGd0YWJsZV9hcm1fbWFsaV9scGFlX2luaXRfZm5zLAogI2VuZGlmCiAjaWZkZWYg Q09ORklHX0lPTU1VX0lPX1BHVEFCTEVfQVJNVjdTCiAJW0FSTV9WN1NdID0gJmlvX3BndGFibGVf YXJtX3Y3c19pbml0X2ZucywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW8tcGd0YWJsZS5o IGIvaW5jbHVkZS9saW51eC9pby1wZ3RhYmxlLmgKaW5kZXggNDdkNWFlNTU5MzI5Li43Njk2OWE1 NjQ4MzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW8tcGd0YWJsZS5oCisrKyBiL2luY2x1 ZGUvbGludXgvaW8tcGd0YWJsZS5oCkBAIC0xMiw2ICsxMiw3IEBAIGVudW0gaW9fcGd0YWJsZV9m bXQgewogCUFSTV82NF9MUEFFX1MxLAogCUFSTV82NF9MUEFFX1MyLAogCUFSTV9WN1MsCisJQVJN X01BTElfTFBBRSwKIAlJT19QR1RBQkxFX05VTV9GTVRTLAogfTsKCkBAIC0xMDgsNiArMTA5LDEx IEBAIHN0cnVjdCBpb19wZ3RhYmxlX2NmZyB7CiAJCQl1MzIJbm1ycjsKIAkJCXUzMglwcnJyOwog CQl9IGFybV92N3NfY2ZnOworCisJCXN0cnVjdCB7CisJCQl1NjQJdHJhbnN0YWI7CisJCQl1NjQJ bWVtYXR0cjsKKwkJfSBhcm1fbWFsaV9scGFlX2NmZzsKIAl9OwogfTsKCkBAIC0yMDksNSArMjE1 LDYgQEAgZXh0ZXJuIHN0cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJtXzMy X2xwYWVfczJfaW5pdF9mbnM7CiBleHRlcm4gc3RydWN0IGlvX3BndGFibGVfaW5pdF9mbnMgaW9f cGd0YWJsZV9hcm1fNjRfbHBhZV9zMV9pbml0X2ZuczsKIGV4dGVybiBzdHJ1Y3QgaW9fcGd0YWJs ZV9pbml0X2ZucyBpb19wZ3RhYmxlX2FybV82NF9scGFlX3MyX2luaXRfZm5zOwogZXh0ZXJuIHN0 cnVjdCBpb19wZ3RhYmxlX2luaXRfZm5zIGlvX3BndGFibGVfYXJtX3Y3c19pbml0X2ZuczsKK2V4 dGVybiBzdHJ1Y3QgaW9fcGd0YWJsZV9pbml0X2ZucyBpb19wZ3RhYmxlX2FybV9tYWxpX2xwYWVf aW5pdF9mbnM7CgogI2VuZGlmIC8qIF9fSU9fUEdUQUJMRV9IICovCi0tCjIuMTkuMQpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGlu ZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWw= 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=-9.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS, 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 B7CBCC4360F for ; Mon, 1 Apr 2019 07:48:02 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.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 842B220700 for ; Mon, 1 Apr 2019 07:48:02 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="VcPg3zu5" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 842B220700 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-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=bombadil.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=Dh+hzJMga5aFZbz8MTiVbp08gp8DTA6uNEB1U5mBXR0=; b=VcPg3zu5zdm7ZL bCmQIJpxGQXSQ5rQ9a/nGeCh/kGv9w3zje/fIkvvkyD+aaWlcGcEyzWWAFGVV2gJECkdv2lUoywO1 BGmT1lnfM+h6gKbGDcErJXvYf6uBbtb2GvD+TYdChS1NlhLzfwkswTjX5hLTYC4IiN2NpAGv/Mr8x ILClcWcGK4G0I5gv8BykJDuHFJQgJmCdkZk2upNFKXohFZL9j+wTPNULamB6mGXIN81lNx8pHUsNl Uro/A0iqfFkGT9msy++sFsgu6DjnMqc1ggJzal2nudziDM9WCIXvEMEvmN5JhP3mgKtT+q1nBA5Iz zfM056d+YDaxXvO50rgg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1hArfd-0005Wg-J0; Mon, 01 Apr 2019 07:47:53 +0000 Received: from mail-pg1-f193.google.com ([209.85.215.193]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1hArfS-0005HF-Go for linux-arm-kernel@lists.infradead.org; Mon, 01 Apr 2019 07:47:48 +0000 Received: by mail-pg1-f193.google.com with SMTP id q1so4308187pgv.13 for ; Mon, 01 Apr 2019 00:47:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=QJEFFn+etEkm7mhrb2GpOa9E7t7qf7JW4mjHjTZjeK0=; b=LOosxYeaw6J+OZFE95odud5tipD6C3m727wbjvEGFQV0MSTlboUVB4PeSov3z9Ykqz 9dlivMlmFeusxanvNsDY8OpdubgwwzDA5flxEAHAIsN81UdvNNf5OPdMto9XgzaDCpk3 zCGyKeQR689GFTjVYDfXIVX759b3vwkuDIijcZwrRNWelcO3+5NuqCx7uIOggI3zLCG0 /9f4npxyIzdhYLh2TpgQK1hdd/MUfg75sjR0/b61b71Mc6FYAylx5PXv7cHCuf/LtEYj ZeZ1MOQZRIMUDaDnezFZss9s31HE2E3HlOlxM519A7Ov5qOrmj3BiPvClA8qC2hbI/3B tUSg== X-Gm-Message-State: APjAAAV7uNH3OW1Lyl3qj+7J9XBVunlZDglmHi/HImDPjJVLCYHqch2I +EpcOuBcqqhhkrV/aHyUrg== X-Google-Smtp-Source: APXvYqwuIcHuBxkweiCkOdjW78uVbU1EnUm0AWDZsxOt1hhECDFEb7dmmM/jDvilQpewAeyIhBbWdw== X-Received: by 2002:a63:5150:: with SMTP id r16mr50565255pgl.307.1554104861600; Mon, 01 Apr 2019 00:47:41 -0700 (PDT) Received: from xps15.imgcgcw.net ([147.50.13.10]) by smtp.googlemail.com with ESMTPSA id o5sm33428950pfa.135.2019.04.01.00.47.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 01 Apr 2019 00:47:40 -0700 (PDT) From: Rob Herring To: dri-devel@lists.freedesktop.org Subject: [PATCH v3 1/3] iommu: io-pgtable: Add ARM Mali midgard MMU page table format Date: Mon, 1 Apr 2019 02:47:28 -0500 Message-Id: <20190401074730.12241-2-robh@kernel.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190401074730.12241-1-robh@kernel.org> References: <20190401074730.12241-1-robh@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190401_004742_721578_99DF6A2A X-CRM114-Status: GOOD ( 22.90 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Sean Paul , Lyude Paul , Eric Anholt , Maxime Ripard , Maarten Lankhorst , Joerg Roedel , Neil Armstrong , Will Deacon , linux-kernel@vger.kernel.org, David Airlie , iommu@lists.linux-foundation.org, Alyssa Rosenzweig , Daniel Vetter , Robin Murphy , 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+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org ARM Mali midgard GPU is similar to standard 64-bit stage 1 page tables, but have a few differences. Add a new format type to represent the format. The input address size is 48-bits and the output address size is 40-bits (and possibly less?). Note that the later bifrost GPUs follow the standard 64-bit stage 1 format. The differences in the format compared to 64-bit stage 1 format are: The 3rd level page entry bits are 0x1 instead of 0x3 for page entries. The access flags are not read-only and unprivileged, but read and write. This is similar to stage 2 entries, but the memory attributes field matches stage 1 being an index. The nG bit is not set by the vendor driver. This one didn't seem to matter, but we'll keep it aligned to the vendor driver. Cc: Will Deacon Cc: Robin Murphy Cc: Joerg Roedel Cc: linux-arm-kernel@lists.infradead.org Cc: iommu@lists.linux-foundation.org Signed-off-by: Rob Herring --- Please ack this as I need to apply it to the drm-misc tree. Or we need a stable branch with this patch. v3: - Rework arm_lpae_prot_to_pte as written by Robin - Fill in complete register values for TRANSTAB and MEMATTR registers drivers/iommu/io-pgtable-arm.c | 93 +++++++++++++++++++++++++--------- drivers/iommu/io-pgtable.c | 1 + include/linux/io-pgtable.h | 7 +++ 3 files changed, 77 insertions(+), 24 deletions(-) diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c index d3700ec15cbd..98551d0cff59 100644 --- a/drivers/iommu/io-pgtable-arm.c +++ b/drivers/iommu/io-pgtable-arm.c @@ -172,6 +172,10 @@ #define ARM_LPAE_MAIR_ATTR_IDX_CACHE 1 #define ARM_LPAE_MAIR_ATTR_IDX_DEV 2 +#define ARM_MALI_LPAE_TTBR_ADRMODE_TABLE (3u << 0) +#define ARM_MALI_LPAE_TTBR_READ_INNER BIT(2) +#define ARM_MALI_LPAE_TTBR_SHARE_OUTER BIT(4) + /* IOPTE accessors */ #define iopte_deref(pte,d) __va(iopte_to_paddr(pte, d)) @@ -180,11 +184,6 @@ #define iopte_prot(pte) ((pte) & ARM_LPAE_PTE_ATTR_MASK) -#define iopte_leaf(pte,l) \ - (l == (ARM_LPAE_MAX_LEVELS - 1) ? \ - (iopte_type(pte,l) == ARM_LPAE_PTE_TYPE_PAGE) : \ - (iopte_type(pte,l) == ARM_LPAE_PTE_TYPE_BLOCK)) - struct arm_lpae_io_pgtable { struct io_pgtable iop; @@ -198,6 +197,14 @@ struct arm_lpae_io_pgtable { typedef u64 arm_lpae_iopte; +static inline bool iopte_leaf(arm_lpae_iopte pte, int l, enum io_pgtable_fmt fmt) +{ + if ((l == (ARM_LPAE_MAX_LEVELS - 1)) && (fmt != ARM_MALI_LPAE)) + return iopte_type(pte,l) == ARM_LPAE_PTE_TYPE_PAGE; + + return iopte_type(pte,l) == ARM_LPAE_PTE_TYPE_BLOCK; +} + static arm_lpae_iopte paddr_to_iopte(phys_addr_t paddr, struct arm_lpae_io_pgtable *data) { @@ -303,12 +310,17 @@ static void __arm_lpae_init_pte(struct arm_lpae_io_pgtable *data, if (data->iop.cfg.quirks & IO_PGTABLE_QUIRK_ARM_NS) pte |= ARM_LPAE_PTE_NS; - if (lvl == ARM_LPAE_MAX_LEVELS - 1) - pte |= ARM_LPAE_PTE_TYPE_PAGE; - else + if (lvl == ARM_LPAE_MAX_LEVELS - 1) { + if (data->iop.fmt == ARM_MALI_LPAE) + pte |= ARM_LPAE_PTE_TYPE_BLOCK; + else + pte |= ARM_LPAE_PTE_TYPE_PAGE; + } else pte |= ARM_LPAE_PTE_TYPE_BLOCK; - pte |= ARM_LPAE_PTE_AF | ARM_LPAE_PTE_SH_IS; + if (data->iop.fmt != ARM_MALI_LPAE) + pte |= ARM_LPAE_PTE_AF; + pte |= ARM_LPAE_PTE_SH_IS; pte |= paddr_to_iopte(paddr, data); __arm_lpae_set_pte(ptep, pte, &data->iop.cfg); @@ -321,7 +333,7 @@ static int arm_lpae_init_pte(struct arm_lpae_io_pgtable *data, { arm_lpae_iopte pte = *ptep; - if (iopte_leaf(pte, lvl)) { + if (iopte_leaf(pte, lvl, data->iop.fmt)) { /* We require an unmap first */ WARN_ON(!selftest_running); return -EEXIST; @@ -409,7 +421,7 @@ static int __arm_lpae_map(struct arm_lpae_io_pgtable *data, unsigned long iova, __arm_lpae_sync_pte(ptep, cfg); } - if (pte && !iopte_leaf(pte, lvl)) { + if (pte && !iopte_leaf(pte, lvl, data->iop.fmt)) { cptep = iopte_deref(pte, data); } else if (pte) { /* We require an unmap first */ @@ -429,31 +441,33 @@ static arm_lpae_iopte arm_lpae_prot_to_pte(struct arm_lpae_io_pgtable *data, if (data->iop.fmt == ARM_64_LPAE_S1 || data->iop.fmt == ARM_32_LPAE_S1) { pte = ARM_LPAE_PTE_nG; - if (!(prot & IOMMU_WRITE) && (prot & IOMMU_READ)) pte |= ARM_LPAE_PTE_AP_RDONLY; - if (!(prot & IOMMU_PRIV)) pte |= ARM_LPAE_PTE_AP_UNPRIV; - - if (prot & IOMMU_MMIO) - pte |= (ARM_LPAE_MAIR_ATTR_IDX_DEV - << ARM_LPAE_PTE_ATTRINDX_SHIFT); - else if (prot & IOMMU_CACHE) - pte |= (ARM_LPAE_MAIR_ATTR_IDX_CACHE - << ARM_LPAE_PTE_ATTRINDX_SHIFT); } else { pte = ARM_LPAE_PTE_HAP_FAULT; if (prot & IOMMU_READ) pte |= ARM_LPAE_PTE_HAP_READ; if (prot & IOMMU_WRITE) pte |= ARM_LPAE_PTE_HAP_WRITE; + } + + if (data->iop.fmt == ARM_64_LPAE_S2 || + data->iop.fmt == ARM_32_LPAE_S2) { if (prot & IOMMU_MMIO) pte |= ARM_LPAE_PTE_MEMATTR_DEV; else if (prot & IOMMU_CACHE) pte |= ARM_LPAE_PTE_MEMATTR_OIWB; else pte |= ARM_LPAE_PTE_MEMATTR_NC; + } else { + if (prot & IOMMU_MMIO) + pte |= (ARM_LPAE_MAIR_ATTR_IDX_DEV + << ARM_LPAE_PTE_ATTRINDX_SHIFT); + else if (prot & IOMMU_CACHE) + pte |= (ARM_LPAE_MAIR_ATTR_IDX_CACHE + << ARM_LPAE_PTE_ATTRINDX_SHIFT); } if (prot & IOMMU_NOEXEC) @@ -511,7 +525,7 @@ static void __arm_lpae_free_pgtable(struct arm_lpae_io_pgtable *data, int lvl, while (ptep != end) { arm_lpae_iopte pte = *ptep++; - if (!pte || iopte_leaf(pte, lvl)) + if (!pte || iopte_leaf(pte, lvl, data->iop.fmt)) continue; __arm_lpae_free_pgtable(data, lvl + 1, iopte_deref(pte, data)); @@ -602,7 +616,7 @@ static size_t __arm_lpae_unmap(struct arm_lpae_io_pgtable *data, if (size == ARM_LPAE_BLOCK_SIZE(lvl, data)) { __arm_lpae_set_pte(ptep, 0, &iop->cfg); - if (!iopte_leaf(pte, lvl)) { + if (!iopte_leaf(pte, lvl, iop->fmt)) { /* Also flush any partial walks */ io_pgtable_tlb_add_flush(iop, iova, size, ARM_LPAE_GRANULE(data), false); @@ -621,7 +635,7 @@ static size_t __arm_lpae_unmap(struct arm_lpae_io_pgtable *data, } return size; - } else if (iopte_leaf(pte, lvl)) { + } else if (iopte_leaf(pte, lvl, iop->fmt)) { /* * Insert a table at the next level to map the old region, * minus the part we want to unmap @@ -669,7 +683,7 @@ static phys_addr_t arm_lpae_iova_to_phys(struct io_pgtable_ops *ops, return 0; /* Leaf entry? */ - if (iopte_leaf(pte,lvl)) + if (iopte_leaf(pte, lvl, data->iop.fmt)) goto found_translation; /* Take it to the next level */ @@ -995,6 +1009,32 @@ arm_32_lpae_alloc_pgtable_s2(struct io_pgtable_cfg *cfg, void *cookie) return iop; } +static struct io_pgtable * +arm_mali_lpae_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie) +{ + struct io_pgtable *iop; + + if (cfg->ias != 48 || cfg->oas > 40) + return NULL; + + cfg->pgsize_bitmap &= (SZ_4K | SZ_2M | SZ_1G); + iop = arm_64_lpae_alloc_pgtable_s1(cfg, cookie); + if (iop) { + u64 mair, ttbr; + + /* Copy values as union fields overlap */ + mair = cfg->arm_lpae_s1_cfg.mair[0]; + ttbr = cfg->arm_lpae_s1_cfg.ttbr[0]; + + cfg->arm_mali_lpae_cfg.memattr = mair; + cfg->arm_mali_lpae_cfg.transtab = ttbr | + ARM_MALI_LPAE_TTBR_READ_INNER | + ARM_MALI_LPAE_TTBR_ADRMODE_TABLE; + } + + return iop; +} + struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s1_init_fns = { .alloc = arm_64_lpae_alloc_pgtable_s1, .free = arm_lpae_free_pgtable, @@ -1015,6 +1055,11 @@ struct io_pgtable_init_fns io_pgtable_arm_32_lpae_s2_init_fns = { .free = arm_lpae_free_pgtable, }; +struct io_pgtable_init_fns io_pgtable_arm_mali_lpae_init_fns = { + .alloc = arm_mali_lpae_alloc_pgtable, + .free = arm_lpae_free_pgtable, +}; + #ifdef CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST static struct io_pgtable_cfg *cfg_cookie; diff --git a/drivers/iommu/io-pgtable.c b/drivers/iommu/io-pgtable.c index 93f2880be6c6..5227cfdbb65b 100644 --- a/drivers/iommu/io-pgtable.c +++ b/drivers/iommu/io-pgtable.c @@ -30,6 +30,7 @@ io_pgtable_init_table[IO_PGTABLE_NUM_FMTS] = { [ARM_32_LPAE_S2] = &io_pgtable_arm_32_lpae_s2_init_fns, [ARM_64_LPAE_S1] = &io_pgtable_arm_64_lpae_s1_init_fns, [ARM_64_LPAE_S2] = &io_pgtable_arm_64_lpae_s2_init_fns, + [ARM_MALI_LPAE] = &io_pgtable_arm_mali_lpae_init_fns, #endif #ifdef CONFIG_IOMMU_IO_PGTABLE_ARMV7S [ARM_V7S] = &io_pgtable_arm_v7s_init_fns, diff --git a/include/linux/io-pgtable.h b/include/linux/io-pgtable.h index 47d5ae559329..76969a564831 100644 --- a/include/linux/io-pgtable.h +++ b/include/linux/io-pgtable.h @@ -12,6 +12,7 @@ enum io_pgtable_fmt { ARM_64_LPAE_S1, ARM_64_LPAE_S2, ARM_V7S, + ARM_MALI_LPAE, IO_PGTABLE_NUM_FMTS, }; @@ -108,6 +109,11 @@ struct io_pgtable_cfg { u32 nmrr; u32 prrr; } arm_v7s_cfg; + + struct { + u64 transtab; + u64 memattr; + } arm_mali_lpae_cfg; }; }; @@ -209,5 +215,6 @@ extern struct io_pgtable_init_fns io_pgtable_arm_32_lpae_s2_init_fns; extern struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s1_init_fns; extern struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s2_init_fns; extern struct io_pgtable_init_fns io_pgtable_arm_v7s_init_fns; +extern struct io_pgtable_init_fns io_pgtable_arm_mali_lpae_init_fns; #endif /* __IO_PGTABLE_H */ -- 2.19.1 _______________________________________________ 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=-9.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,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 0D018C43381 for ; Mon, 1 Apr 2019 07:47:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id BA26B21873 for ; Mon, 1 Apr 2019 07:47:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554104864; bh=cUlo5W/fFFnW9IpeHgR6cZv8aqUJwhJeu1m8mtnmf+o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=PeXbWibfMshqt4fFgwtrD3NXQtlLQCyFB/UPFih6yN/zO3On+lSE88Qhxz1YlisgA AFujrs6PaZDaGUXpcBr6bgdM5ewbhEbc6CPfapJWhJuk7PYUV8ATkYe1Q5RpI/UZKo M+cSXgxCu0wTA9Vv28aSaUf+vrITZ7eHeBxmVHBE= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732047AbfDAHrn (ORCPT ); Mon, 1 Apr 2019 03:47:43 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:46716 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731769AbfDAHrm (ORCPT ); Mon, 1 Apr 2019 03:47:42 -0400 Received: by mail-pf1-f194.google.com with SMTP id 9so4117790pfj.13 for ; Mon, 01 Apr 2019 00:47:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=QJEFFn+etEkm7mhrb2GpOa9E7t7qf7JW4mjHjTZjeK0=; b=rlym33oI1QDUdvwCBJMsybpZ6qOymYol8cGJRSaifnWhRiLIqwaniBCiT1XSYQA2vI V/wQJsc/Bd3JTM1VestRNu/p9ce7c9mfcu6WwcLYQFWoFWKmIOKaAypoM/DbhNsgAQ9n dnx11gRuGtX1633aWqMm1ydqjXSSwLiKLzWauUtCBEOo0WR+h9hD1NYuVspSgqJz0veo ny5xDEPO2Akb1RXutPC0BULeXnyW/ZBQ/XeOuH4mTAfNI/KZteFMj90NicI/Eso6QeiC 78yLV50Xn2FiwzL4ZgA8sk4HYpL5YUNf1Y+L/V7Uj9JMQODBM+VteCkPCS1F3X8H/Vbc O4XA== X-Gm-Message-State: APjAAAUL3J3SK6Qo/XzsI0fvOcHjgCXWEQBFo4etaxOUnAJFuJpVSssH k83ADTroos6BePcB7MRXeA== X-Google-Smtp-Source: APXvYqwuIcHuBxkweiCkOdjW78uVbU1EnUm0AWDZsxOt1hhECDFEb7dmmM/jDvilQpewAeyIhBbWdw== X-Received: by 2002:a63:5150:: with SMTP id r16mr50565255pgl.307.1554104861600; Mon, 01 Apr 2019 00:47:41 -0700 (PDT) Received: from xps15.imgcgcw.net ([147.50.13.10]) by smtp.googlemail.com with ESMTPSA id o5sm33428950pfa.135.2019.04.01.00.47.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 01 Apr 2019 00:47:40 -0700 (PDT) From: Rob Herring To: dri-devel@lists.freedesktop.org Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Will Deacon , Robin Murphy , Joerg Roedel , iommu@lists.linux-foundation.org, Maarten Lankhorst , Maxime Ripard , Sean Paul , David Airlie , Daniel Vetter , Alyssa Rosenzweig , Lyude Paul , Eric Anholt , Neil Armstrong Subject: [PATCH v3 1/3] iommu: io-pgtable: Add ARM Mali midgard MMU page table format Date: Mon, 1 Apr 2019 02:47:28 -0500 Message-Id: <20190401074730.12241-2-robh@kernel.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190401074730.12241-1-robh@kernel.org> References: <20190401074730.12241-1-robh@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org ARM Mali midgard GPU is similar to standard 64-bit stage 1 page tables, but have a few differences. Add a new format type to represent the format. The input address size is 48-bits and the output address size is 40-bits (and possibly less?). Note that the later bifrost GPUs follow the standard 64-bit stage 1 format. The differences in the format compared to 64-bit stage 1 format are: The 3rd level page entry bits are 0x1 instead of 0x3 for page entries. The access flags are not read-only and unprivileged, but read and write. This is similar to stage 2 entries, but the memory attributes field matches stage 1 being an index. The nG bit is not set by the vendor driver. This one didn't seem to matter, but we'll keep it aligned to the vendor driver. Cc: Will Deacon Cc: Robin Murphy Cc: Joerg Roedel Cc: linux-arm-kernel@lists.infradead.org Cc: iommu@lists.linux-foundation.org Signed-off-by: Rob Herring --- Please ack this as I need to apply it to the drm-misc tree. Or we need a stable branch with this patch. v3: - Rework arm_lpae_prot_to_pte as written by Robin - Fill in complete register values for TRANSTAB and MEMATTR registers drivers/iommu/io-pgtable-arm.c | 93 +++++++++++++++++++++++++--------- drivers/iommu/io-pgtable.c | 1 + include/linux/io-pgtable.h | 7 +++ 3 files changed, 77 insertions(+), 24 deletions(-) diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c index d3700ec15cbd..98551d0cff59 100644 --- a/drivers/iommu/io-pgtable-arm.c +++ b/drivers/iommu/io-pgtable-arm.c @@ -172,6 +172,10 @@ #define ARM_LPAE_MAIR_ATTR_IDX_CACHE 1 #define ARM_LPAE_MAIR_ATTR_IDX_DEV 2 +#define ARM_MALI_LPAE_TTBR_ADRMODE_TABLE (3u << 0) +#define ARM_MALI_LPAE_TTBR_READ_INNER BIT(2) +#define ARM_MALI_LPAE_TTBR_SHARE_OUTER BIT(4) + /* IOPTE accessors */ #define iopte_deref(pte,d) __va(iopte_to_paddr(pte, d)) @@ -180,11 +184,6 @@ #define iopte_prot(pte) ((pte) & ARM_LPAE_PTE_ATTR_MASK) -#define iopte_leaf(pte,l) \ - (l == (ARM_LPAE_MAX_LEVELS - 1) ? \ - (iopte_type(pte,l) == ARM_LPAE_PTE_TYPE_PAGE) : \ - (iopte_type(pte,l) == ARM_LPAE_PTE_TYPE_BLOCK)) - struct arm_lpae_io_pgtable { struct io_pgtable iop; @@ -198,6 +197,14 @@ struct arm_lpae_io_pgtable { typedef u64 arm_lpae_iopte; +static inline bool iopte_leaf(arm_lpae_iopte pte, int l, enum io_pgtable_fmt fmt) +{ + if ((l == (ARM_LPAE_MAX_LEVELS - 1)) && (fmt != ARM_MALI_LPAE)) + return iopte_type(pte,l) == ARM_LPAE_PTE_TYPE_PAGE; + + return iopte_type(pte,l) == ARM_LPAE_PTE_TYPE_BLOCK; +} + static arm_lpae_iopte paddr_to_iopte(phys_addr_t paddr, struct arm_lpae_io_pgtable *data) { @@ -303,12 +310,17 @@ static void __arm_lpae_init_pte(struct arm_lpae_io_pgtable *data, if (data->iop.cfg.quirks & IO_PGTABLE_QUIRK_ARM_NS) pte |= ARM_LPAE_PTE_NS; - if (lvl == ARM_LPAE_MAX_LEVELS - 1) - pte |= ARM_LPAE_PTE_TYPE_PAGE; - else + if (lvl == ARM_LPAE_MAX_LEVELS - 1) { + if (data->iop.fmt == ARM_MALI_LPAE) + pte |= ARM_LPAE_PTE_TYPE_BLOCK; + else + pte |= ARM_LPAE_PTE_TYPE_PAGE; + } else pte |= ARM_LPAE_PTE_TYPE_BLOCK; - pte |= ARM_LPAE_PTE_AF | ARM_LPAE_PTE_SH_IS; + if (data->iop.fmt != ARM_MALI_LPAE) + pte |= ARM_LPAE_PTE_AF; + pte |= ARM_LPAE_PTE_SH_IS; pte |= paddr_to_iopte(paddr, data); __arm_lpae_set_pte(ptep, pte, &data->iop.cfg); @@ -321,7 +333,7 @@ static int arm_lpae_init_pte(struct arm_lpae_io_pgtable *data, { arm_lpae_iopte pte = *ptep; - if (iopte_leaf(pte, lvl)) { + if (iopte_leaf(pte, lvl, data->iop.fmt)) { /* We require an unmap first */ WARN_ON(!selftest_running); return -EEXIST; @@ -409,7 +421,7 @@ static int __arm_lpae_map(struct arm_lpae_io_pgtable *data, unsigned long iova, __arm_lpae_sync_pte(ptep, cfg); } - if (pte && !iopte_leaf(pte, lvl)) { + if (pte && !iopte_leaf(pte, lvl, data->iop.fmt)) { cptep = iopte_deref(pte, data); } else if (pte) { /* We require an unmap first */ @@ -429,31 +441,33 @@ static arm_lpae_iopte arm_lpae_prot_to_pte(struct arm_lpae_io_pgtable *data, if (data->iop.fmt == ARM_64_LPAE_S1 || data->iop.fmt == ARM_32_LPAE_S1) { pte = ARM_LPAE_PTE_nG; - if (!(prot & IOMMU_WRITE) && (prot & IOMMU_READ)) pte |= ARM_LPAE_PTE_AP_RDONLY; - if (!(prot & IOMMU_PRIV)) pte |= ARM_LPAE_PTE_AP_UNPRIV; - - if (prot & IOMMU_MMIO) - pte |= (ARM_LPAE_MAIR_ATTR_IDX_DEV - << ARM_LPAE_PTE_ATTRINDX_SHIFT); - else if (prot & IOMMU_CACHE) - pte |= (ARM_LPAE_MAIR_ATTR_IDX_CACHE - << ARM_LPAE_PTE_ATTRINDX_SHIFT); } else { pte = ARM_LPAE_PTE_HAP_FAULT; if (prot & IOMMU_READ) pte |= ARM_LPAE_PTE_HAP_READ; if (prot & IOMMU_WRITE) pte |= ARM_LPAE_PTE_HAP_WRITE; + } + + if (data->iop.fmt == ARM_64_LPAE_S2 || + data->iop.fmt == ARM_32_LPAE_S2) { if (prot & IOMMU_MMIO) pte |= ARM_LPAE_PTE_MEMATTR_DEV; else if (prot & IOMMU_CACHE) pte |= ARM_LPAE_PTE_MEMATTR_OIWB; else pte |= ARM_LPAE_PTE_MEMATTR_NC; + } else { + if (prot & IOMMU_MMIO) + pte |= (ARM_LPAE_MAIR_ATTR_IDX_DEV + << ARM_LPAE_PTE_ATTRINDX_SHIFT); + else if (prot & IOMMU_CACHE) + pte |= (ARM_LPAE_MAIR_ATTR_IDX_CACHE + << ARM_LPAE_PTE_ATTRINDX_SHIFT); } if (prot & IOMMU_NOEXEC) @@ -511,7 +525,7 @@ static void __arm_lpae_free_pgtable(struct arm_lpae_io_pgtable *data, int lvl, while (ptep != end) { arm_lpae_iopte pte = *ptep++; - if (!pte || iopte_leaf(pte, lvl)) + if (!pte || iopte_leaf(pte, lvl, data->iop.fmt)) continue; __arm_lpae_free_pgtable(data, lvl + 1, iopte_deref(pte, data)); @@ -602,7 +616,7 @@ static size_t __arm_lpae_unmap(struct arm_lpae_io_pgtable *data, if (size == ARM_LPAE_BLOCK_SIZE(lvl, data)) { __arm_lpae_set_pte(ptep, 0, &iop->cfg); - if (!iopte_leaf(pte, lvl)) { + if (!iopte_leaf(pte, lvl, iop->fmt)) { /* Also flush any partial walks */ io_pgtable_tlb_add_flush(iop, iova, size, ARM_LPAE_GRANULE(data), false); @@ -621,7 +635,7 @@ static size_t __arm_lpae_unmap(struct arm_lpae_io_pgtable *data, } return size; - } else if (iopte_leaf(pte, lvl)) { + } else if (iopte_leaf(pte, lvl, iop->fmt)) { /* * Insert a table at the next level to map the old region, * minus the part we want to unmap @@ -669,7 +683,7 @@ static phys_addr_t arm_lpae_iova_to_phys(struct io_pgtable_ops *ops, return 0; /* Leaf entry? */ - if (iopte_leaf(pte,lvl)) + if (iopte_leaf(pte, lvl, data->iop.fmt)) goto found_translation; /* Take it to the next level */ @@ -995,6 +1009,32 @@ arm_32_lpae_alloc_pgtable_s2(struct io_pgtable_cfg *cfg, void *cookie) return iop; } +static struct io_pgtable * +arm_mali_lpae_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie) +{ + struct io_pgtable *iop; + + if (cfg->ias != 48 || cfg->oas > 40) + return NULL; + + cfg->pgsize_bitmap &= (SZ_4K | SZ_2M | SZ_1G); + iop = arm_64_lpae_alloc_pgtable_s1(cfg, cookie); + if (iop) { + u64 mair, ttbr; + + /* Copy values as union fields overlap */ + mair = cfg->arm_lpae_s1_cfg.mair[0]; + ttbr = cfg->arm_lpae_s1_cfg.ttbr[0]; + + cfg->arm_mali_lpae_cfg.memattr = mair; + cfg->arm_mali_lpae_cfg.transtab = ttbr | + ARM_MALI_LPAE_TTBR_READ_INNER | + ARM_MALI_LPAE_TTBR_ADRMODE_TABLE; + } + + return iop; +} + struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s1_init_fns = { .alloc = arm_64_lpae_alloc_pgtable_s1, .free = arm_lpae_free_pgtable, @@ -1015,6 +1055,11 @@ struct io_pgtable_init_fns io_pgtable_arm_32_lpae_s2_init_fns = { .free = arm_lpae_free_pgtable, }; +struct io_pgtable_init_fns io_pgtable_arm_mali_lpae_init_fns = { + .alloc = arm_mali_lpae_alloc_pgtable, + .free = arm_lpae_free_pgtable, +}; + #ifdef CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST static struct io_pgtable_cfg *cfg_cookie; diff --git a/drivers/iommu/io-pgtable.c b/drivers/iommu/io-pgtable.c index 93f2880be6c6..5227cfdbb65b 100644 --- a/drivers/iommu/io-pgtable.c +++ b/drivers/iommu/io-pgtable.c @@ -30,6 +30,7 @@ io_pgtable_init_table[IO_PGTABLE_NUM_FMTS] = { [ARM_32_LPAE_S2] = &io_pgtable_arm_32_lpae_s2_init_fns, [ARM_64_LPAE_S1] = &io_pgtable_arm_64_lpae_s1_init_fns, [ARM_64_LPAE_S2] = &io_pgtable_arm_64_lpae_s2_init_fns, + [ARM_MALI_LPAE] = &io_pgtable_arm_mali_lpae_init_fns, #endif #ifdef CONFIG_IOMMU_IO_PGTABLE_ARMV7S [ARM_V7S] = &io_pgtable_arm_v7s_init_fns, diff --git a/include/linux/io-pgtable.h b/include/linux/io-pgtable.h index 47d5ae559329..76969a564831 100644 --- a/include/linux/io-pgtable.h +++ b/include/linux/io-pgtable.h @@ -12,6 +12,7 @@ enum io_pgtable_fmt { ARM_64_LPAE_S1, ARM_64_LPAE_S2, ARM_V7S, + ARM_MALI_LPAE, IO_PGTABLE_NUM_FMTS, }; @@ -108,6 +109,11 @@ struct io_pgtable_cfg { u32 nmrr; u32 prrr; } arm_v7s_cfg; + + struct { + u64 transtab; + u64 memattr; + } arm_mali_lpae_cfg; }; }; @@ -209,5 +215,6 @@ extern struct io_pgtable_init_fns io_pgtable_arm_32_lpae_s2_init_fns; extern struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s1_init_fns; extern struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s2_init_fns; extern struct io_pgtable_init_fns io_pgtable_arm_v7s_init_fns; +extern struct io_pgtable_init_fns io_pgtable_arm_mali_lpae_init_fns; #endif /* __IO_PGTABLE_H */ -- 2.19.1