From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mark yao Subject: Re: [PATCH 1/4] drm/rockchip: Do not use DMA mapping API if attached to IOMMU domain Date: Tue, 7 Feb 2017 16:03:02 +0800 Message-ID: <58997F36.50007@rock-chips.com> References: <1486447776-30543-1-git-send-email-mark.yao@rock-chips.com> <1486447776-30543-2-git-send-email-mark.yao@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Tomasz Figa Cc: "linux-kernel@vger.kernel.org" , dri-devel , "open list:ARM/Rockchip SoC..." , Shunqian Zheng , "linux-arm-kernel@lists.infradead.org" List-Id: linux-rockchip.vger.kernel.org T24gMjAxN+W5tDAy5pyIMDfml6UgMTQ6NTMsIFRvbWFzeiBGaWdhIHdyb3RlOgo+IEhpIE1hcmss Cj4KPiBUaGFua3MgZm9yIHJldml2aW5nIHRoaXMgc2VyaWVzIGFuZCBzb3JyeSBmb3Igbm90IHRh a2luZyBjYXJlIG9mIGl0Cj4gbXlzZWxmLiBQbGVhc2Ugc2VlIHNvbWUgY29tbWVudHMgaW5saW5l LgoKSGkgVG9tYXN6CgpUaGFua3MgZm9yIHJldmlldywKCkkgd2lsbCBhZGQgdGhlIHBhdGNoZXMg eW91IG1lbnRpb25lZCAgaW50byB2MiB2ZXJzaW9uLgoKPgo+IE9uIFR1ZSwgRmViIDcsIDIwMTcg YXQgMzowOSBQTSwgTWFyayBZYW8gPG1hcmsueWFvQHJvY2stY2hpcHMuY29tPiB3cm90ZToKPj4g RnJvbTogVG9tYXN6IEZpZ2EgPHRmaWdhQGNocm9taXVtLm9yZz4KPj4KPj4gVGhlIEFQSSBpcyBu b3Qgc3VpdGFibGUgZm9yIHN1YnN5c3RlbXMgY29uc2lzdGluZyBvZiBtdWx0aXBsZSBkZXZpY2Vz Cj4+IGFuZCByZXF1aXJlcyBzZXZlcmUgaGFja3MgdG8gdXNlIGl0LiBUbyBtaXRpZ2F0ZSB0aGlz LCB0aGlzIHBhdGNoCj4+IGltcGxlbWVudHMgYWxsb2NhdGlvbiBhbmQgYWRkcmVzcyBzcGFjZSBt YW5hZ2VtZW50IGxvY2FsbHkgYnkgdXNpbmcKPj4gaGVscGVycyBwcm92aWRlZCBieSBEUk0gZnJh bWV3b3JrLCBsaWtlIG90aGVyIERSTSBkcml2ZXJzIGRvLCBlLmcuCj4+IFRlZ3JhLgo+Pgo+PiBU aGlzIHBhdGNoIHNob3VsZCBub3QgaW50cm9kdWNlIGFueSBmdW5jdGlvbmFsIGNoYW5nZXMgdW50 aWwgdGhlIGRyaXZlcgo+PiBpcyBtYWRlIHRvIGF0dGFjaCBzdWJkZXZpY2VzIGludG8gYW4gSU9N TVUgZG9tYWluIHdpdGggdGhlIGdlbmVyaWMgSU9NTVUKPj4gQVBJLCB3aGljaCB3aWxsIGhhcHBl biBpbiBmb2xsb3dpbmcgcGF0Y2guIEJhc2VkIGhlYXZpbHkgb24gR0VNCj4+IGltcGxlbWVudGF0 aW9uIG9mIFRlZ3JhIERSTSBkcml2ZXIuCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IFRvbWFzeiBGaWdh IDx0ZmlnYUBjaHJvbWl1bS5vcmc+Cj4+IFNpZ25lZC1vZmYtYnk6IFNodW5xaWFuIFpoZW5nIDx6 aGVuZ3NxQHJvY2stY2hpcHMuY29tPgo+PiBBY2tlZC1ieTogTWFyayBZYW8gPG1hcmsueWFvQHJv Y2stY2hpcHMuY29tPgo+IEkgYmVsaWV2ZSB5b3UgbmVlZCB5b3VyIFNpZ25lZC1vZmYtYnkgaGVy ZS4KPgo+PiAtLS0KPj4gICBkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Ry di5oIHwgICA0ICstCj4+ICAgZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9n ZW0uYyB8IDIxNyArKysrKysrKysrKysrKysrKysrKysrKysrKy0tCj4+ICAgZHJpdmVycy9ncHUv ZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9nZW0uaCB8ICAgOCArCj4+ICAgMyBmaWxlcyBjaGFu Z2VkLCAyMTkgaW5zZXJ0aW9ucygrKSwgMTAgZGVsZXRpb25zKC0pCj4+Cj4+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Rydi5oIGIvZHJpdmVycy9n cHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9kcnYuaAo+PiBpbmRleCBmYjYyMjZjLi43YzEy M2Q5IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJt X2Rydi5oCj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZHJ2 LmgKPj4gQEAgLTMwLDYgKzMwLDcgQEAKPj4KPj4gICBzdHJ1Y3QgZHJtX2RldmljZTsKPj4gICBz dHJ1Y3QgZHJtX2Nvbm5lY3RvcjsKPj4gK3N0cnVjdCBpb21tdV9kb21haW47Cj4+Cj4+ICAgLyoK Pj4gICAgKiBSb2NrY2hpcCBkcm0gcHJpdmF0ZSBjcnRjIGZ1bmNzLgo+PiBAQCAtNjAsNyArNjEs OCBAQCBzdHJ1Y3Qgcm9ja2NoaXBfZHJtX3ByaXZhdGUgewo+PiAgICAgICAgICBzdHJ1Y3QgZHJt X2dlbV9vYmplY3QgKmZiZGV2X2JvOwo+PiAgICAgICAgICBjb25zdCBzdHJ1Y3Qgcm9ja2NoaXBf Y3J0Y19mdW5jcyAqY3J0Y19mdW5jc1tST0NLQ0hJUF9NQVhfQ1JUQ107Cj4+ICAgICAgICAgIHN0 cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZTsKPj4gLQo+PiArICAgICAgIHN0cnVjdCBpb21t dV9kb21haW4gKmRvbWFpbjsKPj4gKyAgICAgICBzdHJ1Y3QgZHJtX21tIG1tOwo+PiAgICAgICAg ICBzdHJ1Y3QgbGlzdF9oZWFkIHBzcl9saXN0Owo+PiAgICAgICAgICBzcGlubG9ja190IHBzcl9s aXN0X2xvY2s7Cj4+ICAgfTsKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hp cC9yb2NrY2hpcF9kcm1fZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBf ZHJtX2dlbS5jCj4+IGluZGV4IGI3MGY5NDIuLjUyMDkzOTIgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZl cnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZ2VtLmMKPj4gKysrIGIvZHJpdmVycy9n cHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9nZW0uYwo+PiBAQCAtMTYsMTEgKzE2LDEzNSBA QAo+PiAgICNpbmNsdWRlIDxkcm0vZHJtUC5oPgo+PiAgICNpbmNsdWRlIDxkcm0vZHJtX2dlbS5o Pgo+PiAgICNpbmNsdWRlIDxkcm0vZHJtX3ZtYV9tYW5hZ2VyLmg+Cj4+ICsjaW5jbHVkZSA8bGlu dXgvaW9tbXUuaD4KPj4KPj4gICAjaW5jbHVkZSAicm9ja2NoaXBfZHJtX2Rydi5oIgo+PiAgICNp bmNsdWRlICJyb2NrY2hpcF9kcm1fZ2VtLmgiCj4+Cj4+IC1zdGF0aWMgaW50IHJvY2tjaGlwX2dl bV9hbGxvY19idWYoc3RydWN0IHJvY2tjaGlwX2dlbV9vYmplY3QgKnJrX29iaiwKPj4gK3N0YXRp YyBpbnQgcm9ja2NoaXBfZ2VtX2lvbW11X21hcChzdHJ1Y3Qgcm9ja2NoaXBfZ2VtX29iamVjdCAq cmtfb2JqKQo+PiArewo+PiArICAgICAgIHN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBya19vYmot PmJhc2UuZGV2Owo+PiArICAgICAgIHN0cnVjdCByb2NrY2hpcF9kcm1fcHJpdmF0ZSAqcHJpdmF0 ZSA9IGRybS0+ZGV2X3ByaXZhdGU7Cj4+ICsgICAgICAgaW50IHByb3QgPSBJT01NVV9SRUFEIHwg SU9NTVVfV1JJVEU7Cj4+ICsgICAgICAgc3NpemVfdCByZXQ7Cj4+ICsKPj4gKyAgICAgICByZXQg PSBkcm1fbW1faW5zZXJ0X25vZGVfZ2VuZXJpYygmcHJpdmF0ZS0+bW0sICZya19vYmotPm1tLAo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJrX29iai0+YmFzZS5z aXplLCBQQUdFX1NJWkUsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgMCwgMCk7Cj4+ICsgICAgICAgaWYgKHJldCA8IDApIHsKPj4gKyAgICAgICAgICAgICAgIERS TV9FUlJPUigib3V0IG9mIEkvTyB2aXJ0dWFsIG1lbW9yeTogJXpkXG4iLCByZXQpOwo+PiArICAg ICAgICAgICAgICAgcmV0dXJuIHJldDsKPj4gKyAgICAgICB9Cj4+ICsKPj4gKyAgICAgICBya19v YmotPmRtYV9hZGRyID0gcmtfb2JqLT5tbS5zdGFydDsKPj4gKwo+PiArICAgICAgIHJldCA9IGlv bW11X21hcF9zZyhwcml2YXRlLT5kb21haW4sIHJrX29iai0+ZG1hX2FkZHIsIHJrX29iai0+c2d0 LT5zZ2wsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIHJrX29iai0+c2d0LT5uZW50cywg cHJvdCk7Cj4+ICsgICAgICAgaWYgKHJldCA8IDApIHsKPj4gKyAgICAgICAgICAgICAgIERSTV9F UlJPUigiZmFpbGVkIHRvIG1hcCBidWZmZXI6ICV6ZFxuIiwgcmV0KTsKPj4gKyAgICAgICAgICAg ICAgIGdvdG8gZXJyX3JlbW92ZV9ub2RlOwo+PiArICAgICAgIH0KPj4gKwo+PiArICAgICAgIHJr X29iai0+c2l6ZSA9IHJldDsKPj4gKwo+PiArICAgICAgIHJldHVybiAwOwo+PiArCj4+ICtlcnJf cmVtb3ZlX25vZGU6Cj4+ICsgICAgICAgZHJtX21tX3JlbW92ZV9ub2RlKCZya19vYmotPm1tKTsK Pj4gKwo+PiArICAgICAgIHJldHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcm9j a2NoaXBfZ2VtX2lvbW11X3VubWFwKHN0cnVjdCByb2NrY2hpcF9nZW1fb2JqZWN0ICpya19vYmop Cj4+ICt7Cj4+ICsgICAgICAgc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IHJrX29iai0+YmFzZS5k ZXY7Cj4+ICsgICAgICAgc3RydWN0IHJvY2tjaGlwX2RybV9wcml2YXRlICpwcml2YXRlID0gZHJt LT5kZXZfcHJpdmF0ZTsKPj4gKwo+PiArICAgICAgIGlvbW11X3VubWFwKHByaXZhdGUtPmRvbWFp biwgcmtfb2JqLT5kbWFfYWRkciwgcmtfb2JqLT5zaXplKTsKPj4gKyAgICAgICBkcm1fbW1fcmVt b3ZlX25vZGUoJnJrX29iai0+bW0pOwo+PiArCj4+ICsgICAgICAgcmV0dXJuIDA7Cj4+ICt9Cj4+ ICsKPj4gK3N0YXRpYyBpbnQgcm9ja2NoaXBfZ2VtX2dldF9wYWdlcyhzdHJ1Y3Qgcm9ja2NoaXBf Z2VtX29iamVjdCAqcmtfb2JqKQo+PiArewo+PiArICAgICAgIHN0cnVjdCBkcm1fZGV2aWNlICpk cm0gPSBya19vYmotPmJhc2UuZGV2Owo+PiArICAgICAgIGludCByZXQsIGk7Cj4+ICsgICAgICAg c3RydWN0IHNjYXR0ZXJsaXN0ICpzOwo+PiArCj4+ICsgICAgICAgcmtfb2JqLT5wYWdlcyA9IGRy bV9nZW1fZ2V0X3BhZ2VzKCZya19vYmotPmJhc2UpOwo+PiArICAgICAgIGlmIChJU19FUlIocmtf b2JqLT5wYWdlcykpCj4+ICsgICAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUihya19vYmotPnBh Z2VzKTsKPj4gKwo+PiArICAgICAgIHJrX29iai0+bnVtX3BhZ2VzID0gcmtfb2JqLT5iYXNlLnNp emUgPj4gUEFHRV9TSElGVDsKPj4gKwo+PiArICAgICAgIHJrX29iai0+c2d0ID0gZHJtX3ByaW1l X3BhZ2VzX3RvX3NnKHJrX29iai0+cGFnZXMsIHJrX29iai0+bnVtX3BhZ2VzKTsKPj4gKyAgICAg ICBpZiAoSVNfRVJSKHJrX29iai0+c2d0KSkgewo+PiArICAgICAgICAgICAgICAgcmV0ID0gUFRS X0VSUihya19vYmotPnNndCk7Cj4+ICsgICAgICAgICAgICAgICBnb3RvIGVycl9wdXRfcGFnZXM7 Cj4+ICsgICAgICAgfQo+PiArCj4+ICsgICAgICAgLyoKPj4gKyAgICAgICAgKiBGYWtlIHVwIHRo ZSBTRyB0YWJsZSBzbyB0aGF0IGRtYV9zeW5jX3NnX2Zvcl9kZXZpY2UoKSBjYW4gYmUgdXNlZAo+ PiArICAgICAgICAqIHRvIGZsdXNoIHRoZSBwYWdlcyBhc3NvY2lhdGVkIHdpdGggaXQuCj4+ICsg ICAgICAgICoKPj4gKyAgICAgICAgKiBUT0RPOiBSZXBsYWNlIHRoaXMgYnkgZHJtX2NsZmx1c2hf c2coKSBvbmNlIGl0IGNhbiBiZSBpbXBsZW1lbnRlZAo+PiArICAgICAgICAqIHdpdGhvdXQgcmVs eWluZyBvbiBzeW1ib2xzIHRoYXQgYXJlIG5vdCBleHBvcnRlZC4KPj4gKyAgICAgICAgKi8KPj4g KyAgICAgICBmb3JfZWFjaF9zZyhya19vYmotPnNndC0+c2dsLCBzLCBya19vYmotPnNndC0+bmVu dHMsIGkpCj4+ICsgICAgICAgICAgICAgICBzZ19kbWFfYWRkcmVzcyhzKSA9IHNnX3BoeXMocyk7 Cj4+ICsKPj4gKyAgICAgICBkbWFfc3luY19zZ19mb3JfZGV2aWNlKGRybS0+ZGV2LCBya19vYmot PnNndC0+c2dsLCBya19vYmotPnNndC0+bmVudHMsCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBETUFfVE9fREVWSUNFKTsKPj4gKwo+PiArICAgICAgIHJldHVybiAwOwo+PiArCj4+ ICtlcnJfcHV0X3BhZ2VzOgo+PiArICAgICAgIGRybV9nZW1fcHV0X3BhZ2VzKCZya19vYmotPmJh c2UsIHJrX29iai0+cGFnZXMsIGZhbHNlLCBmYWxzZSk7Cj4+ICsgICAgICAgcmV0dXJuIHJldDsK Pj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgcm9ja2NoaXBfZ2VtX3B1dF9wYWdlcyhzdHJ1Y3Qg cm9ja2NoaXBfZ2VtX29iamVjdCAqcmtfb2JqKQo+PiArewo+PiArICAgICAgIHNnX2ZyZWVfdGFi bGUocmtfb2JqLT5zZ3QpOwo+PiArICAgICAgIGtmcmVlKHJrX29iai0+c2d0KTsKPj4gKyAgICAg ICBkcm1fZ2VtX3B1dF9wYWdlcygmcmtfb2JqLT5iYXNlLCBya19vYmotPnBhZ2VzLCBmYWxzZSwg ZmFsc2UpOwo+IFdlIG5lZWQgdG8gY2FsbCBkcm1fZ2VtX3B1dF9wYWdlcyB3aXRoIHR3byBsYXN0 IGFyZ3VtZW50cyB0cnVlLCBub3QKPiBmYWxzZSwgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGFueSB3 YXkgb2YgdHJhY2tpbmcgdGhlIGFjY2Vzc2VzLCBzbyB3ZQo+IG5lZWQgdG8gYXNzdW1lIHRoZSBw YWdlIHdhcyBib3RoIGFjY2Vzc2VkIGFuZCBkaXJ0eS4gU2VlCj4gaHR0cHM6Ly9jaHJvbWl1bS1y ZXZpZXcuZ29vZ2xlc291cmNlLmNvbS8zODI5MzQuCj4KPj4gK30KPj4gKwo+PiArc3RhdGljIGlu dCByb2NrY2hpcF9nZW1fYWxsb2NfaW9tbXUoc3RydWN0IHJvY2tjaGlwX2dlbV9vYmplY3QgKnJr X29iaiwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvY19r bWFwKQo+PiArewo+PiArICAgICAgIGludCByZXQ7Cj4+ICsKPj4gKyAgICAgICByZXQgPSByb2Nr Y2hpcF9nZW1fZ2V0X3BhZ2VzKHJrX29iaik7Cj4+ICsgICAgICAgaWYgKHJldCA8IDApCj4+ICsg ICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+PiArCj4+ICsgICAgICAgcmV0ID0gcm9ja2NoaXBf Z2VtX2lvbW11X21hcChya19vYmopOwo+PiArICAgICAgIGlmIChyZXQgPCAwKQo+PiArICAgICAg ICAgICAgICAgZ290byBlcnJfZnJlZTsKPj4gKwo+PiArICAgICAgIGlmIChhbGxvY19rbWFwKSB7 Cj4+ICsgICAgICAgICAgICAgICBya19vYmotPmt2YWRkciA9IHZtYXAocmtfb2JqLT5wYWdlcywg cmtfb2JqLT5udW1fcGFnZXMsIFZNX01BUCwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwZ3Byb3Rfd3JpdGVjb21iaW5lKFBBR0VfS0VSTkVMKSk7Cj4+ICsgICAgICAg ICAgICAgICBpZiAoIXJrX29iai0+a3ZhZGRyKSB7Cj4+ICsgICAgICAgICAgICAgICAgICAgICAg IERSTV9FUlJPUigiZmFpbGVkIHRvIHZtYXAoKSBidWZmZXJcbiIpOwo+PiArICAgICAgICAgICAg ICAgICAgICAgICByZXQgPSAtRU5PTUVNOwo+PiArICAgICAgICAgICAgICAgICAgICAgICBnb3Rv IGVycl91bm1hcDsKPj4gKyAgICAgICAgICAgICAgIH0KPj4gKyAgICAgICB9Cj4+ICsKPj4gKyAg ICAgICByZXR1cm4gMDsKPj4gKwo+PiArZXJyX3VubWFwOgo+PiArICAgICAgIHJvY2tjaGlwX2dl bV9pb21tdV91bm1hcChya19vYmopOwo+PiArZXJyX2ZyZWU6Cj4+ICsgICAgICAgcm9ja2NoaXBf Z2VtX3B1dF9wYWdlcyhya19vYmopOwo+PiArCj4+ICsgICAgICAgcmV0dXJuIHJldDsKPj4gK30K Pj4gKwo+PiArc3RhdGljIGludCByb2NrY2hpcF9nZW1fYWxsb2NfZG1hKHN0cnVjdCByb2NrY2hp cF9nZW1fb2JqZWN0ICpya19vYmosCj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgYm9vbCBhbGxvY19rbWFwKQo+PiAgIHsKPj4gICAgICAgICAgc3RydWN0IGRybV9nZW1fb2Jq ZWN0ICpvYmogPSAmcmtfb2JqLT5iYXNlOwo+PiBAQCAtNDIsNyArMTY2LDI3IEBAIHN0YXRpYyBp bnQgcm9ja2NoaXBfZ2VtX2FsbG9jX2J1ZihzdHJ1Y3Qgcm9ja2NoaXBfZ2VtX29iamVjdCAqcmtf b2JqLAo+PiAgICAgICAgICByZXR1cm4gMDsKPj4gICB9Cj4+Cj4+IC1zdGF0aWMgdm9pZCByb2Nr Y2hpcF9nZW1fZnJlZV9idWYoc3RydWN0IHJvY2tjaGlwX2dlbV9vYmplY3QgKnJrX29iaikKPj4g K3N0YXRpYyBpbnQgcm9ja2NoaXBfZ2VtX2FsbG9jX2J1ZihzdHJ1Y3Qgcm9ja2NoaXBfZ2VtX29i amVjdCAqcmtfb2JqLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBh bGxvY19rbWFwKQo+PiArewo+PiArICAgICAgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0g JnJrX29iai0+YmFzZTsKPj4gKyAgICAgICBzdHJ1Y3QgZHJtX2RldmljZSAqZHJtID0gb2JqLT5k ZXY7Cj4+ICsgICAgICAgc3RydWN0IHJvY2tjaGlwX2RybV9wcml2YXRlICpwcml2YXRlID0gZHJt LT5kZXZfcHJpdmF0ZTsKPj4gKwo+PiArICAgICAgIGlmIChwcml2YXRlLT5kb21haW4pCj4+ICsg ICAgICAgICAgICAgICByZXR1cm4gcm9ja2NoaXBfZ2VtX2FsbG9jX2lvbW11KHJrX29iaiwgYWxs b2Nfa21hcCk7Cj4+ICsgICAgICAgZWxzZQo+PiArICAgICAgICAgICAgICAgcmV0dXJuIHJvY2tj aGlwX2dlbV9hbGxvY19kbWEocmtfb2JqLCBhbGxvY19rbWFwKTsKPj4gK30KPj4gKwo+PiArc3Rh dGljIHZvaWQgcm9ja2NoaXBfZ2VtX2ZyZWVfaW9tbXUoc3RydWN0IHJvY2tjaGlwX2dlbV9vYmpl Y3QgKnJrX29iaikKPj4gK3sKPj4gKyAgICAgICB2dW5tYXAocmtfb2JqLT5rdmFkZHIpOwo+PiAr ICAgICAgIHJvY2tjaGlwX2dlbV9pb21tdV91bm1hcChya19vYmopOwo+PiArICAgICAgIHJvY2tj aGlwX2dlbV9wdXRfcGFnZXMocmtfb2JqKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgcm9j a2NoaXBfZ2VtX2ZyZWVfZG1hKHN0cnVjdCByb2NrY2hpcF9nZW1fb2JqZWN0ICpya19vYmopCj4+ ICAgewo+PiAgICAgICAgICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiA9ICZya19vYmotPmJh c2U7Cj4+ICAgICAgICAgIHN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBvYmotPmRldjsKPj4gQEAg LTUxLDIzICsxOTUsNjQgQEAgc3RhdGljIHZvaWQgcm9ja2NoaXBfZ2VtX2ZyZWVfYnVmKHN0cnVj dCByb2NrY2hpcF9nZW1fb2JqZWN0ICpya19vYmopCj4+ICAgICAgICAgICAgICAgICAgICAgICAg IHJrX29iai0+ZG1hX2F0dHJzKTsKPj4gICB9Cj4+Cj4+IC1zdGF0aWMgaW50IHJvY2tjaGlwX2Ry bV9nZW1fb2JqZWN0X21tYXAoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCj4+IC0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZt YSkKPj4gK3N0YXRpYyB2b2lkIHJvY2tjaGlwX2dlbV9mcmVlX2J1ZihzdHJ1Y3Qgcm9ja2NoaXBf Z2VtX29iamVjdCAqcmtfb2JqKQo+PiArewo+PiArICAgICAgIGlmIChya19vYmotPnBhZ2VzKQo+ PiArICAgICAgICAgICAgICAgcm9ja2NoaXBfZ2VtX2ZyZWVfaW9tbXUocmtfb2JqKTsKPj4gKyAg ICAgICBlbHNlCj4+ICsgICAgICAgICAgICAgICByb2NrY2hpcF9nZW1fZnJlZV9kbWEocmtfb2Jq KTsKPj4gK30KPj4KPj4gK3N0YXRpYyBpbnQgcm9ja2NoaXBfZHJtX2dlbV9vYmplY3RfbW1hcF9p b21tdShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQo+PiAg IHsKPj4gKyAgICAgICBzdHJ1Y3Qgcm9ja2NoaXBfZ2VtX29iamVjdCAqcmtfb2JqID0gdG9fcm9j a2NoaXBfb2JqKG9iaik7Cj4+ICsgICAgICAgdW5zaWduZWQgaW50IGksIGNvdW50ID0gb2JqLT5z aXplID4+IFBBR0VfU0hJRlQ7Cj4+ICsgICAgICAgdW5zaWduZWQgbG9uZyB1c2VyX2NvdW50ID0g KHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKPj4gKyAgICAgICB1 bnNpZ25lZCBsb25nIHVhZGRyID0gdm1hLT52bV9zdGFydDsKPj4gICAgICAgICAgaW50IHJldDsK Pj4gKwo+PiArICAgICAgIGlmICh1c2VyX2NvdW50ID09IDAgfHwgdXNlcl9jb3VudCA+IGNvdW50 KQo+PiArICAgICAgICAgICAgICAgcmV0dXJuIC1FTlhJTzsKPj4gKwo+PiArICAgICAgIGZvciAo aSA9IDA7IGkgPCB1c2VyX2NvdW50OyBpKyspIHsKPiBFdmVuIHRob3VnaCBEUk0gbW1hcCBkb2Vz bid0IHN1cHBvcnQgcGFnZSBvZmZzZXQsIHdlIG5lZWQgdG8gcmVzcGVjdAo+IGl0IGhlcmUgZm9y IFBSSU1FL0RNQS1idWYgbW1hcC4gU2VlCj4gaHR0cHM6Ly9jaHJvbWl1bS1yZXZpZXcuZ29vZ2xl c291cmNlLmNvbS8zODY0NzcuCj4KPj4gKyAgICAgICAgICAgICAgIHJldCA9IHZtX2luc2VydF9w YWdlKHZtYSwgdWFkZHIsIHJrX29iai0+cGFnZXNbaV0pOwo+PiArICAgICAgICAgICAgICAgaWYg KHJldCkKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPj4gKyAgICAgICAg ICAgICAgIHVhZGRyICs9IFBBR0VfU0laRTsKPj4gKyAgICAgICB9Cj4+ICsKPj4gKyAgICAgICBy ZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCByb2NrY2hpcF9kcm1fZ2VtX29iamVj dF9tbWFwX2RtYShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkK Pj4gK3sKPj4gICAgICAgICAgc3RydWN0IHJvY2tjaGlwX2dlbV9vYmplY3QgKnJrX29iaiA9IHRv X3JvY2tjaGlwX29iaihvYmopOwo+PiAgICAgICAgICBzdHJ1Y3QgZHJtX2RldmljZSAqZHJtID0g b2JqLT5kZXY7Cj4+Cj4+ICsgICAgICAgcmV0dXJuIGRtYV9tbWFwX2F0dHJzKGRybS0+ZGV2LCB2 bWEsIHJrX29iai0+a3ZhZGRyLCBya19vYmotPmRtYV9hZGRyLAo+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBvYmotPnNpemUsIHJrX29iai0+ZG1hX2F0dHJzKTsKPj4gK30KPj4gKwo+ PiArc3RhdGljIGludCByb2NrY2hpcF9kcm1fZ2VtX29iamVjdF9tbWFwKHN0cnVjdCBkcm1fZ2Vt X29iamVjdCAqb2JqLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCj4+ICt7Cj4+ICsgICAgICAgaW50IHJldDsKPj4g KyAgICAgICBzdHJ1Y3Qgcm9ja2NoaXBfZ2VtX29iamVjdCAqcmtfb2JqID0gdG9fcm9ja2NoaXBf b2JqKG9iaik7Cj4+ICsKPj4gICAgICAgICAgLyoKPj4gLSAgICAgICAgKiBkbWFfYWxsb2NfYXR0 cnMoKSBhbGxvY2F0ZWQgYSBzdHJ1Y3QgcGFnZSB0YWJsZSBmb3Igcmtfb2JqLCBzbyBjbGVhcgo+ PiArICAgICAgICAqIFdlIGFsbG9jYXRlZCBhIHN0cnVjdCBwYWdlIHRhYmxlIGZvciBya19vYmos IHNvIGNsZWFyCj4+ICAgICAgICAgICAqIFZNX1BGTk1BUCBmbGFnIHRoYXQgd2FzIHNldCBieSBk cm1fZ2VtX21tYXBfb2JqKCkvZHJtX2dlbV9tbWFwKCkuCj4+ICAgICAgICAgICAqLwo+PiAgICAg ICAgICB2bWEtPnZtX2ZsYWdzICY9IH5WTV9QRk5NQVA7Cj4+ICAgICAgICAgIHZtYS0+dm1fcGdv ZmYgPSAwOwo+Pgo+PiAtICAgICAgIHJldCA9IGRtYV9tbWFwX2F0dHJzKGRybS0+ZGV2LCB2bWEs IHJrX29iai0+a3ZhZGRyLCBya19vYmotPmRtYV9hZGRyLAo+PiAtICAgICAgICAgICAgICAgICAg ICAgICAgICAgIG9iai0+c2l6ZSwgcmtfb2JqLT5kbWFfYXR0cnMpOwo+PiArICAgICAgIGlmIChy a19vYmotPnBhZ2VzKQo+PiArICAgICAgICAgICAgICAgcmV0ID0gcm9ja2NoaXBfZHJtX2dlbV9v YmplY3RfbW1hcF9pb21tdShvYmosIHZtYSk7Cj4+ICsgICAgICAgZWxzZQo+PiArICAgICAgICAg ICAgICAgcmV0ID0gcm9ja2NoaXBfZHJtX2dlbV9vYmplY3RfbW1hcF9kbWEob2JqLCB2bWEpOwo+ PiArCj4+ICAgICAgICAgIGlmIChyZXQpCj4+ICAgICAgICAgICAgICAgICAgZHJtX2dlbV92bV9j bG9zZSh2bWEpOwo+Pgo+PiBAQCAtMTE3LDcgKzMwMiw3IEBAIHN0cnVjdCByb2NrY2hpcF9nZW1f b2JqZWN0ICoKPj4KPj4gICAgICAgICAgb2JqID0gJnJrX29iai0+YmFzZTsKPj4KPj4gLSAgICAg ICBkcm1fZ2VtX3ByaXZhdGVfb2JqZWN0X2luaXQoZHJtLCBvYmosIHNpemUpOwo+PiArICAgICAg IGRybV9nZW1fb2JqZWN0X2luaXQoZHJtLCBvYmosIHNpemUpOwo+IEluIGVycm9yIHBhdGggb2Yg dGhpcyBmdW5jdGlvbiBhbmQgaW4gYWxsIGZ1bmN0aW9ucyB0aGF0IGRlc3Ryb3kgdGhlCj4gR0VN IHdlIG5lZWQgdG8gY2FsbCBkcm1fZ2VtX29iamVjdF9yZWxlYXNlKCksIGFzIGl0J3MgdGhlIGNv dW50ZXJwYXJ0Cj4gdG8gZHJtX2dlbV9vYmplY3RfaW5pdCgpLiBTZWUKPiBodHRwczovL2Nocm9t aXVtLXJldmlldy5nb29nbGVzb3VyY2UuY29tLzM4NTQ1Ni4KPgo+IEJlc3QgcmVnYXJkcywKPiBU b21hc3oKPgo+Cj4KCgotLSAK77ytYXJrIFlhbwoKCl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxp c3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: mark.yao@rock-chips.com (Mark yao) Date: Tue, 7 Feb 2017 16:03:02 +0800 Subject: [PATCH 1/4] drm/rockchip: Do not use DMA mapping API if attached to IOMMU domain In-Reply-To: References: <1486447776-30543-1-git-send-email-mark.yao@rock-chips.com> <1486447776-30543-2-git-send-email-mark.yao@rock-chips.com> Message-ID: <58997F36.50007@rock-chips.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 2017?02?07? 14:53, Tomasz Figa wrote: > Hi Mark, > > Thanks for reviving this series and sorry for not taking care of it > myself. Please see some comments inline. Hi Tomasz Thanks for review, I will add the patches you mentioned into v2 version. > > On Tue, Feb 7, 2017 at 3:09 PM, Mark Yao wrote: >> From: Tomasz Figa >> >> The API is not suitable for subsystems consisting of multiple devices >> and requires severe hacks to use it. To mitigate this, this patch >> implements allocation and address space management locally by using >> helpers provided by DRM framework, like other DRM drivers do, e.g. >> Tegra. >> >> This patch should not introduce any functional changes until the driver >> is made to attach subdevices into an IOMMU domain with the generic IOMMU >> API, which will happen in following patch. Based heavily on GEM >> implementation of Tegra DRM driver. >> >> Signed-off-by: Tomasz Figa >> Signed-off-by: Shunqian Zheng >> Acked-by: Mark Yao > I believe you need your Signed-off-by here. > >> --- >> drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 4 +- >> drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 217 ++++++++++++++++++++++++++-- >> drivers/gpu/drm/rockchip/rockchip_drm_gem.h | 8 + >> 3 files changed, 219 insertions(+), 10 deletions(-) >> >> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h >> index fb6226c..7c123d9 100644 >> --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h >> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h >> @@ -30,6 +30,7 @@ >> >> struct drm_device; >> struct drm_connector; >> +struct iommu_domain; >> >> /* >> * Rockchip drm private crtc funcs. >> @@ -60,7 +61,8 @@ struct rockchip_drm_private { >> struct drm_gem_object *fbdev_bo; >> const struct rockchip_crtc_funcs *crtc_funcs[ROCKCHIP_MAX_CRTC]; >> struct drm_atomic_state *state; >> - >> + struct iommu_domain *domain; >> + struct drm_mm mm; >> struct list_head psr_list; >> spinlock_t psr_list_lock; >> }; >> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c >> index b70f942..5209392 100644 >> --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c >> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c >> @@ -16,11 +16,135 @@ >> #include >> #include >> #include >> +#include >> >> #include "rockchip_drm_drv.h" >> #include "rockchip_drm_gem.h" >> >> -static int rockchip_gem_alloc_buf(struct rockchip_gem_object *rk_obj, >> +static int rockchip_gem_iommu_map(struct rockchip_gem_object *rk_obj) >> +{ >> + struct drm_device *drm = rk_obj->base.dev; >> + struct rockchip_drm_private *private = drm->dev_private; >> + int prot = IOMMU_READ | IOMMU_WRITE; >> + ssize_t ret; >> + >> + ret = drm_mm_insert_node_generic(&private->mm, &rk_obj->mm, >> + rk_obj->base.size, PAGE_SIZE, >> + 0, 0); >> + if (ret < 0) { >> + DRM_ERROR("out of I/O virtual memory: %zd\n", ret); >> + return ret; >> + } >> + >> + rk_obj->dma_addr = rk_obj->mm.start; >> + >> + ret = iommu_map_sg(private->domain, rk_obj->dma_addr, rk_obj->sgt->sgl, >> + rk_obj->sgt->nents, prot); >> + if (ret < 0) { >> + DRM_ERROR("failed to map buffer: %zd\n", ret); >> + goto err_remove_node; >> + } >> + >> + rk_obj->size = ret; >> + >> + return 0; >> + >> +err_remove_node: >> + drm_mm_remove_node(&rk_obj->mm); >> + >> + return ret; >> +} >> + >> +static int rockchip_gem_iommu_unmap(struct rockchip_gem_object *rk_obj) >> +{ >> + struct drm_device *drm = rk_obj->base.dev; >> + struct rockchip_drm_private *private = drm->dev_private; >> + >> + iommu_unmap(private->domain, rk_obj->dma_addr, rk_obj->size); >> + drm_mm_remove_node(&rk_obj->mm); >> + >> + return 0; >> +} >> + >> +static int rockchip_gem_get_pages(struct rockchip_gem_object *rk_obj) >> +{ >> + struct drm_device *drm = rk_obj->base.dev; >> + int ret, i; >> + struct scatterlist *s; >> + >> + rk_obj->pages = drm_gem_get_pages(&rk_obj->base); >> + if (IS_ERR(rk_obj->pages)) >> + return PTR_ERR(rk_obj->pages); >> + >> + rk_obj->num_pages = rk_obj->base.size >> PAGE_SHIFT; >> + >> + rk_obj->sgt = drm_prime_pages_to_sg(rk_obj->pages, rk_obj->num_pages); >> + if (IS_ERR(rk_obj->sgt)) { >> + ret = PTR_ERR(rk_obj->sgt); >> + goto err_put_pages; >> + } >> + >> + /* >> + * Fake up the SG table so that dma_sync_sg_for_device() can be used >> + * to flush the pages associated with it. >> + * >> + * TODO: Replace this by drm_clflush_sg() once it can be implemented >> + * without relying on symbols that are not exported. >> + */ >> + for_each_sg(rk_obj->sgt->sgl, s, rk_obj->sgt->nents, i) >> + sg_dma_address(s) = sg_phys(s); >> + >> + dma_sync_sg_for_device(drm->dev, rk_obj->sgt->sgl, rk_obj->sgt->nents, >> + DMA_TO_DEVICE); >> + >> + return 0; >> + >> +err_put_pages: >> + drm_gem_put_pages(&rk_obj->base, rk_obj->pages, false, false); >> + return ret; >> +} >> + >> +static void rockchip_gem_put_pages(struct rockchip_gem_object *rk_obj) >> +{ >> + sg_free_table(rk_obj->sgt); >> + kfree(rk_obj->sgt); >> + drm_gem_put_pages(&rk_obj->base, rk_obj->pages, false, false); > We need to call drm_gem_put_pages with two last arguments true, not > false, because we don't have any way of tracking the accesses, so we > need to assume the page was both accessed and dirty. See > https://chromium-review.googlesource.com/382934. > >> +} >> + >> +static int rockchip_gem_alloc_iommu(struct rockchip_gem_object *rk_obj, >> + bool alloc_kmap) >> +{ >> + int ret; >> + >> + ret = rockchip_gem_get_pages(rk_obj); >> + if (ret < 0) >> + return ret; >> + >> + ret = rockchip_gem_iommu_map(rk_obj); >> + if (ret < 0) >> + goto err_free; >> + >> + if (alloc_kmap) { >> + rk_obj->kvaddr = vmap(rk_obj->pages, rk_obj->num_pages, VM_MAP, >> + pgprot_writecombine(PAGE_KERNEL)); >> + if (!rk_obj->kvaddr) { >> + DRM_ERROR("failed to vmap() buffer\n"); >> + ret = -ENOMEM; >> + goto err_unmap; >> + } >> + } >> + >> + return 0; >> + >> +err_unmap: >> + rockchip_gem_iommu_unmap(rk_obj); >> +err_free: >> + rockchip_gem_put_pages(rk_obj); >> + >> + return ret; >> +} >> + >> +static int rockchip_gem_alloc_dma(struct rockchip_gem_object *rk_obj, >> bool alloc_kmap) >> { >> struct drm_gem_object *obj = &rk_obj->base; >> @@ -42,7 +166,27 @@ static int rockchip_gem_alloc_buf(struct rockchip_gem_object *rk_obj, >> return 0; >> } >> >> -static void rockchip_gem_free_buf(struct rockchip_gem_object *rk_obj) >> +static int rockchip_gem_alloc_buf(struct rockchip_gem_object *rk_obj, >> + bool alloc_kmap) >> +{ >> + struct drm_gem_object *obj = &rk_obj->base; >> + struct drm_device *drm = obj->dev; >> + struct rockchip_drm_private *private = drm->dev_private; >> + >> + if (private->domain) >> + return rockchip_gem_alloc_iommu(rk_obj, alloc_kmap); >> + else >> + return rockchip_gem_alloc_dma(rk_obj, alloc_kmap); >> +} >> + >> +static void rockchip_gem_free_iommu(struct rockchip_gem_object *rk_obj) >> +{ >> + vunmap(rk_obj->kvaddr); >> + rockchip_gem_iommu_unmap(rk_obj); >> + rockchip_gem_put_pages(rk_obj); >> +} >> + >> +static void rockchip_gem_free_dma(struct rockchip_gem_object *rk_obj) >> { >> struct drm_gem_object *obj = &rk_obj->base; >> struct drm_device *drm = obj->dev; >> @@ -51,23 +195,64 @@ static void rockchip_gem_free_buf(struct rockchip_gem_object *rk_obj) >> rk_obj->dma_attrs); >> } >> >> -static int rockchip_drm_gem_object_mmap(struct drm_gem_object *obj, >> - struct vm_area_struct *vma) >> +static void rockchip_gem_free_buf(struct rockchip_gem_object *rk_obj) >> +{ >> + if (rk_obj->pages) >> + rockchip_gem_free_iommu(rk_obj); >> + else >> + rockchip_gem_free_dma(rk_obj); >> +} >> >> +static int rockchip_drm_gem_object_mmap_iommu(struct drm_gem_object *obj, >> + struct vm_area_struct *vma) >> { >> + struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj); >> + unsigned int i, count = obj->size >> PAGE_SHIFT; >> + unsigned long user_count = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; >> + unsigned long uaddr = vma->vm_start; >> int ret; >> + >> + if (user_count == 0 || user_count > count) >> + return -ENXIO; >> + >> + for (i = 0; i < user_count; i++) { > Even though DRM mmap doesn't support page offset, we need to respect > it here for PRIME/DMA-buf mmap. See > https://chromium-review.googlesource.com/386477. > >> + ret = vm_insert_page(vma, uaddr, rk_obj->pages[i]); >> + if (ret) >> + return ret; >> + uaddr += PAGE_SIZE; >> + } >> + >> + return 0; >> +} >> + >> +static int rockchip_drm_gem_object_mmap_dma(struct drm_gem_object *obj, >> + struct vm_area_struct *vma) >> +{ >> struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj); >> struct drm_device *drm = obj->dev; >> >> + return dma_mmap_attrs(drm->dev, vma, rk_obj->kvaddr, rk_obj->dma_addr, >> + obj->size, rk_obj->dma_attrs); >> +} >> + >> +static int rockchip_drm_gem_object_mmap(struct drm_gem_object *obj, >> + struct vm_area_struct *vma) >> +{ >> + int ret; >> + struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj); >> + >> /* >> - * dma_alloc_attrs() allocated a struct page table for rk_obj, so clear >> + * We allocated a struct page table for rk_obj, so clear >> * VM_PFNMAP flag that was set by drm_gem_mmap_obj()/drm_gem_mmap(). >> */ >> vma->vm_flags &= ~VM_PFNMAP; >> vma->vm_pgoff = 0; >> >> - ret = dma_mmap_attrs(drm->dev, vma, rk_obj->kvaddr, rk_obj->dma_addr, >> - obj->size, rk_obj->dma_attrs); >> + if (rk_obj->pages) >> + ret = rockchip_drm_gem_object_mmap_iommu(obj, vma); >> + else >> + ret = rockchip_drm_gem_object_mmap_dma(obj, vma); >> + >> if (ret) >> drm_gem_vm_close(vma); >> >> @@ -117,7 +302,7 @@ struct rockchip_gem_object * >> >> obj = &rk_obj->base; >> >> - drm_gem_private_object_init(drm, obj, size); >> + drm_gem_object_init(drm, obj, size); > In error path of this function and in all functions that destroy the > GEM we need to call drm_gem_object_release(), as it's the counterpart > to drm_gem_object_init(). See > https://chromium-review.googlesource.com/385456. > > Best regards, > Tomasz > > > -- ?ark Yao From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753251AbdBGIDX (ORCPT ); Tue, 7 Feb 2017 03:03:23 -0500 Received: from regular1.263xmail.com ([211.150.99.134]:54521 "EHLO regular1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753108AbdBGIDV (ORCPT ); Tue, 7 Feb 2017 03:03:21 -0500 X-263anti-spam: KSV:0; X-MAIL-GRAY: 0 X-MAIL-DELIVERY: 1 X-KSVirus-check: 0 X-ABS-CHECKED: 4 X-RL-SENDER: mark.yao@rock-chips.com X-FST-TO: zhengsq@rock-chips.com X-SENDER-IP: 58.22.7.114 X-LOGIN-NAME: mark.yao@rock-chips.com X-UNIQUE-TAG: <7b26fb0839e147f2f7485bd5f6df960b> X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 Subject: Re: [PATCH 1/4] drm/rockchip: Do not use DMA mapping API if attached to IOMMU domain To: Tomasz Figa References: <1486447776-30543-1-git-send-email-mark.yao@rock-chips.com> <1486447776-30543-2-git-send-email-mark.yao@rock-chips.com> Cc: David Airlie , Heiko Stuebner , dri-devel , "linux-arm-kernel@lists.infradead.org" , "open list:ARM/Rockchip SoC..." , "linux-kernel@vger.kernel.org" , Shunqian Zheng From: Mark yao Message-ID: <58997F36.50007@rock-chips.com> Date: Tue, 7 Feb 2017 16:03:02 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2017年02月07日 14:53, Tomasz Figa wrote: > Hi Mark, > > Thanks for reviving this series and sorry for not taking care of it > myself. Please see some comments inline. Hi Tomasz Thanks for review, I will add the patches you mentioned into v2 version. > > On Tue, Feb 7, 2017 at 3:09 PM, Mark Yao wrote: >> From: Tomasz Figa >> >> The API is not suitable for subsystems consisting of multiple devices >> and requires severe hacks to use it. To mitigate this, this patch >> implements allocation and address space management locally by using >> helpers provided by DRM framework, like other DRM drivers do, e.g. >> Tegra. >> >> This patch should not introduce any functional changes until the driver >> is made to attach subdevices into an IOMMU domain with the generic IOMMU >> API, which will happen in following patch. Based heavily on GEM >> implementation of Tegra DRM driver. >> >> Signed-off-by: Tomasz Figa >> Signed-off-by: Shunqian Zheng >> Acked-by: Mark Yao > I believe you need your Signed-off-by here. > >> --- >> drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 4 +- >> drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 217 ++++++++++++++++++++++++++-- >> drivers/gpu/drm/rockchip/rockchip_drm_gem.h | 8 + >> 3 files changed, 219 insertions(+), 10 deletions(-) >> >> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h >> index fb6226c..7c123d9 100644 >> --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h >> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h >> @@ -30,6 +30,7 @@ >> >> struct drm_device; >> struct drm_connector; >> +struct iommu_domain; >> >> /* >> * Rockchip drm private crtc funcs. >> @@ -60,7 +61,8 @@ struct rockchip_drm_private { >> struct drm_gem_object *fbdev_bo; >> const struct rockchip_crtc_funcs *crtc_funcs[ROCKCHIP_MAX_CRTC]; >> struct drm_atomic_state *state; >> - >> + struct iommu_domain *domain; >> + struct drm_mm mm; >> struct list_head psr_list; >> spinlock_t psr_list_lock; >> }; >> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c >> index b70f942..5209392 100644 >> --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c >> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c >> @@ -16,11 +16,135 @@ >> #include >> #include >> #include >> +#include >> >> #include "rockchip_drm_drv.h" >> #include "rockchip_drm_gem.h" >> >> -static int rockchip_gem_alloc_buf(struct rockchip_gem_object *rk_obj, >> +static int rockchip_gem_iommu_map(struct rockchip_gem_object *rk_obj) >> +{ >> + struct drm_device *drm = rk_obj->base.dev; >> + struct rockchip_drm_private *private = drm->dev_private; >> + int prot = IOMMU_READ | IOMMU_WRITE; >> + ssize_t ret; >> + >> + ret = drm_mm_insert_node_generic(&private->mm, &rk_obj->mm, >> + rk_obj->base.size, PAGE_SIZE, >> + 0, 0); >> + if (ret < 0) { >> + DRM_ERROR("out of I/O virtual memory: %zd\n", ret); >> + return ret; >> + } >> + >> + rk_obj->dma_addr = rk_obj->mm.start; >> + >> + ret = iommu_map_sg(private->domain, rk_obj->dma_addr, rk_obj->sgt->sgl, >> + rk_obj->sgt->nents, prot); >> + if (ret < 0) { >> + DRM_ERROR("failed to map buffer: %zd\n", ret); >> + goto err_remove_node; >> + } >> + >> + rk_obj->size = ret; >> + >> + return 0; >> + >> +err_remove_node: >> + drm_mm_remove_node(&rk_obj->mm); >> + >> + return ret; >> +} >> + >> +static int rockchip_gem_iommu_unmap(struct rockchip_gem_object *rk_obj) >> +{ >> + struct drm_device *drm = rk_obj->base.dev; >> + struct rockchip_drm_private *private = drm->dev_private; >> + >> + iommu_unmap(private->domain, rk_obj->dma_addr, rk_obj->size); >> + drm_mm_remove_node(&rk_obj->mm); >> + >> + return 0; >> +} >> + >> +static int rockchip_gem_get_pages(struct rockchip_gem_object *rk_obj) >> +{ >> + struct drm_device *drm = rk_obj->base.dev; >> + int ret, i; >> + struct scatterlist *s; >> + >> + rk_obj->pages = drm_gem_get_pages(&rk_obj->base); >> + if (IS_ERR(rk_obj->pages)) >> + return PTR_ERR(rk_obj->pages); >> + >> + rk_obj->num_pages = rk_obj->base.size >> PAGE_SHIFT; >> + >> + rk_obj->sgt = drm_prime_pages_to_sg(rk_obj->pages, rk_obj->num_pages); >> + if (IS_ERR(rk_obj->sgt)) { >> + ret = PTR_ERR(rk_obj->sgt); >> + goto err_put_pages; >> + } >> + >> + /* >> + * Fake up the SG table so that dma_sync_sg_for_device() can be used >> + * to flush the pages associated with it. >> + * >> + * TODO: Replace this by drm_clflush_sg() once it can be implemented >> + * without relying on symbols that are not exported. >> + */ >> + for_each_sg(rk_obj->sgt->sgl, s, rk_obj->sgt->nents, i) >> + sg_dma_address(s) = sg_phys(s); >> + >> + dma_sync_sg_for_device(drm->dev, rk_obj->sgt->sgl, rk_obj->sgt->nents, >> + DMA_TO_DEVICE); >> + >> + return 0; >> + >> +err_put_pages: >> + drm_gem_put_pages(&rk_obj->base, rk_obj->pages, false, false); >> + return ret; >> +} >> + >> +static void rockchip_gem_put_pages(struct rockchip_gem_object *rk_obj) >> +{ >> + sg_free_table(rk_obj->sgt); >> + kfree(rk_obj->sgt); >> + drm_gem_put_pages(&rk_obj->base, rk_obj->pages, false, false); > We need to call drm_gem_put_pages with two last arguments true, not > false, because we don't have any way of tracking the accesses, so we > need to assume the page was both accessed and dirty. See > https://chromium-review.googlesource.com/382934. > >> +} >> + >> +static int rockchip_gem_alloc_iommu(struct rockchip_gem_object *rk_obj, >> + bool alloc_kmap) >> +{ >> + int ret; >> + >> + ret = rockchip_gem_get_pages(rk_obj); >> + if (ret < 0) >> + return ret; >> + >> + ret = rockchip_gem_iommu_map(rk_obj); >> + if (ret < 0) >> + goto err_free; >> + >> + if (alloc_kmap) { >> + rk_obj->kvaddr = vmap(rk_obj->pages, rk_obj->num_pages, VM_MAP, >> + pgprot_writecombine(PAGE_KERNEL)); >> + if (!rk_obj->kvaddr) { >> + DRM_ERROR("failed to vmap() buffer\n"); >> + ret = -ENOMEM; >> + goto err_unmap; >> + } >> + } >> + >> + return 0; >> + >> +err_unmap: >> + rockchip_gem_iommu_unmap(rk_obj); >> +err_free: >> + rockchip_gem_put_pages(rk_obj); >> + >> + return ret; >> +} >> + >> +static int rockchip_gem_alloc_dma(struct rockchip_gem_object *rk_obj, >> bool alloc_kmap) >> { >> struct drm_gem_object *obj = &rk_obj->base; >> @@ -42,7 +166,27 @@ static int rockchip_gem_alloc_buf(struct rockchip_gem_object *rk_obj, >> return 0; >> } >> >> -static void rockchip_gem_free_buf(struct rockchip_gem_object *rk_obj) >> +static int rockchip_gem_alloc_buf(struct rockchip_gem_object *rk_obj, >> + bool alloc_kmap) >> +{ >> + struct drm_gem_object *obj = &rk_obj->base; >> + struct drm_device *drm = obj->dev; >> + struct rockchip_drm_private *private = drm->dev_private; >> + >> + if (private->domain) >> + return rockchip_gem_alloc_iommu(rk_obj, alloc_kmap); >> + else >> + return rockchip_gem_alloc_dma(rk_obj, alloc_kmap); >> +} >> + >> +static void rockchip_gem_free_iommu(struct rockchip_gem_object *rk_obj) >> +{ >> + vunmap(rk_obj->kvaddr); >> + rockchip_gem_iommu_unmap(rk_obj); >> + rockchip_gem_put_pages(rk_obj); >> +} >> + >> +static void rockchip_gem_free_dma(struct rockchip_gem_object *rk_obj) >> { >> struct drm_gem_object *obj = &rk_obj->base; >> struct drm_device *drm = obj->dev; >> @@ -51,23 +195,64 @@ static void rockchip_gem_free_buf(struct rockchip_gem_object *rk_obj) >> rk_obj->dma_attrs); >> } >> >> -static int rockchip_drm_gem_object_mmap(struct drm_gem_object *obj, >> - struct vm_area_struct *vma) >> +static void rockchip_gem_free_buf(struct rockchip_gem_object *rk_obj) >> +{ >> + if (rk_obj->pages) >> + rockchip_gem_free_iommu(rk_obj); >> + else >> + rockchip_gem_free_dma(rk_obj); >> +} >> >> +static int rockchip_drm_gem_object_mmap_iommu(struct drm_gem_object *obj, >> + struct vm_area_struct *vma) >> { >> + struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj); >> + unsigned int i, count = obj->size >> PAGE_SHIFT; >> + unsigned long user_count = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; >> + unsigned long uaddr = vma->vm_start; >> int ret; >> + >> + if (user_count == 0 || user_count > count) >> + return -ENXIO; >> + >> + for (i = 0; i < user_count; i++) { > Even though DRM mmap doesn't support page offset, we need to respect > it here for PRIME/DMA-buf mmap. See > https://chromium-review.googlesource.com/386477. > >> + ret = vm_insert_page(vma, uaddr, rk_obj->pages[i]); >> + if (ret) >> + return ret; >> + uaddr += PAGE_SIZE; >> + } >> + >> + return 0; >> +} >> + >> +static int rockchip_drm_gem_object_mmap_dma(struct drm_gem_object *obj, >> + struct vm_area_struct *vma) >> +{ >> struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj); >> struct drm_device *drm = obj->dev; >> >> + return dma_mmap_attrs(drm->dev, vma, rk_obj->kvaddr, rk_obj->dma_addr, >> + obj->size, rk_obj->dma_attrs); >> +} >> + >> +static int rockchip_drm_gem_object_mmap(struct drm_gem_object *obj, >> + struct vm_area_struct *vma) >> +{ >> + int ret; >> + struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj); >> + >> /* >> - * dma_alloc_attrs() allocated a struct page table for rk_obj, so clear >> + * We allocated a struct page table for rk_obj, so clear >> * VM_PFNMAP flag that was set by drm_gem_mmap_obj()/drm_gem_mmap(). >> */ >> vma->vm_flags &= ~VM_PFNMAP; >> vma->vm_pgoff = 0; >> >> - ret = dma_mmap_attrs(drm->dev, vma, rk_obj->kvaddr, rk_obj->dma_addr, >> - obj->size, rk_obj->dma_attrs); >> + if (rk_obj->pages) >> + ret = rockchip_drm_gem_object_mmap_iommu(obj, vma); >> + else >> + ret = rockchip_drm_gem_object_mmap_dma(obj, vma); >> + >> if (ret) >> drm_gem_vm_close(vma); >> >> @@ -117,7 +302,7 @@ struct rockchip_gem_object * >> >> obj = &rk_obj->base; >> >> - drm_gem_private_object_init(drm, obj, size); >> + drm_gem_object_init(drm, obj, size); > In error path of this function and in all functions that destroy the > GEM we need to call drm_gem_object_release(), as it's the counterpart > to drm_gem_object_init(). See > https://chromium-review.googlesource.com/385456. > > Best regards, > Tomasz > > > -- Mark Yao