From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heiko =?ISO-8859-1?Q?St=FCbner?= Subject: Re: [PATCH v2] drm/rockchip: import dma_buf to gem Date: Fri, 02 Oct 2015 16:33:56 +0200 Message-ID: <10058594.7xF1CeL72y@diego> References: <1435282038-23778-1-git-send-email-mark.yao@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1435282038-23778-1-git-send-email-mark.yao@rock-chips.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Mark Yao Cc: zwl@rock-chips.com, linux-kernel@vger.kernel.org, tfiga@chromium.org, linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org, xw@rock-chips.com, dkm@rock-chips.com, sandy.huang@rock-chips.com, linux-arm-kernel@lists.infradead.org List-Id: linux-rockchip.vger.kernel.org SGkgTWFyaywKCkFtIEZyZWl0YWcsIDI2LiBKdW5pIDIwMTUsIDA5OjI3OjE4IHNjaHJpZWIgTWFy ayBZYW86Cj4gV2Ugd2FudCB0byBkaXNwbGF5IGEgYnVmZmVyIGFsbG9jYXRlZCBieSBvdGhlciBk cml2ZXIsIG5lZWQgaW1wb3J0Cj4gdGhlIGJ1ZmZlciB0byBnZW0uCj4gCj4gU2lnbmVkLW9mZi1i eTogTWFyayBZYW8gPG1hcmsueWFvQHJvY2stY2hpcHMuY29tPgoKVGhpcyBsb29rcyBpbnRlcmVz dGluZyAuLi4gZG8geW91IHdhbnQgdG8gZm9sbG93IHVwIG9uIGl0PwoKCkhlaWtvCgo+IC0tLQo+ IENoYW5nZXMgaW4gdjI6Cj4gQWR2aWNlZCBieSBSdXNzZWxsIEtpbmcKPiAtIGNoZWNrIHNndC1u ZW50cyA9PSAxIHdoZW4gZ2V0IGlvdmEgZnJvbSBzY2F0dGVybGlzdAo+IC0gcmVtb3ZlIHVudXNl ZCBkbWFfbWFwX3NnL2RtYV91bm1hcF9zZywgZG1hX2J1Zl9tYXBfYXR0YWNobWVudC0+bWFwX2Rt YV9idWYKPiBzaG91bGQgZG8gdGhlIGRtYV9tYXAKPiAKPiAgZHJpdmVycy9ncHUvZHJtL3JvY2tj aGlwL3JvY2tjaGlwX2RybV9kcnYuYyB8ICAgIDEgKwo+ICBkcml2ZXJzL2dwdS9kcm0vcm9ja2No aXAvcm9ja2NoaXBfZHJtX2dlbS5jIHwgICA0MAo+ICsrKysrKysrKysrKysrKysrKysrKysrKyst LSBkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2dlbS5oIHwgIAo+ICA1ICsr Ky0KPiAgMyBmaWxlcyBjaGFuZ2VkLCA0MiBpbnNlcnRpb25zKCspLCA0IGRlbGV0aW9ucygtKQo+ IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Ry di5jCj4gYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Rydi5jIGluZGV4 IDM5NjIxNzYuLjkwMDFhOTAgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlw L3JvY2tjaGlwX2RybV9kcnYuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2Nr Y2hpcF9kcm1fZHJ2LmMKPiBAQCAtMjg3LDYgKzI4Nyw3IEBAIHN0YXRpYyBzdHJ1Y3QgZHJtX2Ry aXZlciByb2NrY2hpcF9kcm1fZHJpdmVyID0gewo+ICAJLnByaW1lX2hhbmRsZV90b19mZAk9IGRy bV9nZW1fcHJpbWVfaGFuZGxlX3RvX2ZkLAo+ICAJLnByaW1lX2ZkX3RvX2hhbmRsZQk9IGRybV9n ZW1fcHJpbWVfZmRfdG9faGFuZGxlLAo+ICAJLmdlbV9wcmltZV9pbXBvcnQJPSBkcm1fZ2VtX3By aW1lX2ltcG9ydCwKPiArCS5nZW1fcHJpbWVfaW1wb3J0X3NnX3RhYmxlID0gcm9ja2NoaXBfZ2Vt X3ByaW1lX2ltcG9ydF9zZ190YWJsZSwKPiAgCS5nZW1fcHJpbWVfZXhwb3J0CT0gZHJtX2dlbV9w cmltZV9leHBvcnQsCj4gIAkuZ2VtX3ByaW1lX2dldF9zZ190YWJsZQk9IHJvY2tjaGlwX2dlbV9w cmltZV9nZXRfc2dfdGFibGUsCj4gIAkuZ2VtX3ByaW1lX3ZtYXAJCT0gcm9ja2NoaXBfZ2VtX3By aW1lX3ZtYXAsCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hp cF9kcm1fZ2VtLmMKPiBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZ2Vt LmMgaW5kZXggZWIyMjgyYy4uZThjNGQ0ZSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0v cm9ja2NoaXAvcm9ja2NoaXBfZHJtX2dlbS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tj aGlwL3JvY2tjaGlwX2RybV9nZW0uYwo+IEBAIC0xOCw2ICsxOCw3IEBACj4gICNpbmNsdWRlIDxk cm0vZHJtX3ZtYV9tYW5hZ2VyLmg+Cj4gCj4gICNpbmNsdWRlIDxsaW51eC9kbWEtYXR0cnMuaD4K PiArI2luY2x1ZGUgPGxpbnV4L2RtYS1idWYuaD4KPiAKPiAgI2luY2x1ZGUgInJvY2tjaGlwX2Ry bV9kcnYuaCIKPiAgI2luY2x1ZGUgInJvY2tjaGlwX2RybV9nZW0uaCIKPiBAQCAtMTA1LDYgKzEw NiwzNiBAQCBpbnQgcm9ja2NoaXBfZ2VtX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdAo+ IHZtX2FyZWFfc3RydWN0ICp2bWEpIHJldHVybiByZXQ7Cj4gIH0KPiAKPiArc3RydWN0IGRybV9n ZW1fb2JqZWN0ICoKPiArcm9ja2NoaXBfZ2VtX3ByaW1lX2ltcG9ydF9zZ190YWJsZShzdHJ1Y3Qg ZHJtX2RldmljZSAqZHJtLAo+ICsJCQkJICAgc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqYXR0 YWNoLAo+ICsJCQkJICAgc3RydWN0IHNnX3RhYmxlICpzZ3QpCj4gK3sKPiArCXN0cnVjdCByb2Nr Y2hpcF9nZW1fb2JqZWN0ICpya19vYmo7Cj4gKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsK PiArCj4gKwkvKgo+ICsJICogVG9kbzogb25seSBzdXBwb3J0IGNvbnRpbnVvdXMgYnVmZmVyIG5v dywgcGxhbiB0byBmb3VuZCBhIG1ldGhvZAo+ICsJICogdG8gaW1wb3J0IG5vbiBjb250aW51b3Vz IHdpdGggaW9tbXUuCj4gKwkgKi8KPiArCWlmIChzZ3QtPm5lbnRzICE9IDEpCj4gKwkJcmV0dXJu IEVSUl9QVFIoLUVJTlZBTCk7Cj4gKwo+ICsJcmtfb2JqID0ga3phbGxvYyhzaXplb2YoKnJrX29i aiksIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFya19vYmopCj4gKwkJcmV0dXJuIEVSUl9QVFIoLUVO T01FTSk7Cj4gKwo+ICsJb2JqID0gJnJrX29iai0+YmFzZTsKPiArCj4gKwlkcm1fZ2VtX3ByaXZh dGVfb2JqZWN0X2luaXQoZHJtLCBvYmosIGF0dGFjaC0+ZG1hYnVmLT5zaXplKTsKPiArCj4gKwly a19vYmotPmRtYV9hZGRyID0gc2dfZG1hX2FkZHJlc3Moc2d0LT5zZ2wpOwo+ICsJcmtfb2JqLT5z Z3QgPSBzZ3Q7Cj4gKwlvYmotPnNpemUgPSBzZ19kbWFfbGVuKHNndC0+c2dsKTsKPiArCj4gKwly ZXR1cm4gb2JqOwo+ICt9Cj4gKwo+ICBzdHJ1Y3Qgcm9ja2NoaXBfZ2VtX29iamVjdCAqCj4gIAly b2NrY2hpcF9nZW1fY3JlYXRlX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLCB1bnNpZ25l ZCBpbnQgc2l6ZSwKPiAgCQkJCSAgIGJvb2wgYWxsb2Nfa21hcCkKPiBAQCAtMTQyLDExICsxNzMs MTQgQEAgdm9pZCByb2NrY2hpcF9nZW1fZnJlZV9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0 Cj4gKm9iaikgewo+ICAJc3RydWN0IHJvY2tjaGlwX2dlbV9vYmplY3QgKnJrX29iajsKPiAKPiAt CWRybV9nZW1fZnJlZV9tbWFwX29mZnNldChvYmopOwo+IC0KPiAgCXJrX29iaiA9IHRvX3JvY2tj aGlwX29iaihvYmopOwo+IAo+IC0Jcm9ja2NoaXBfZ2VtX2ZyZWVfYnVmKHJrX29iaik7Cj4gKwlp ZiAob2JqLT5pbXBvcnRfYXR0YWNoKSB7Cj4gKwkJZHJtX3ByaW1lX2dlbV9kZXN0cm95KG9iaiwg cmtfb2JqLT5zZ3QpOwo+ICsJfSBlbHNlIHsKPiArCQlkcm1fZ2VtX2ZyZWVfbW1hcF9vZmZzZXQo b2JqKTsKPiArCQlyb2NrY2hpcF9nZW1fZnJlZV9idWYocmtfb2JqKTsKPiArCX0KPiAKPiAgCWtm cmVlKHJrX29iaik7Cj4gIH0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlw L3JvY2tjaGlwX2RybV9nZW0uaAo+IGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlw X2RybV9nZW0uaCBpbmRleCBhZDIyNjE4Li45ZmQ1OGUzIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMv Z3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZ2VtLmgKPiArKysgYi9kcml2ZXJzL2dwdS9k cm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2dlbS5oCj4gQEAgLTIxLDYgKzIxLDcgQEAgc3RydWN0 IHJvY2tjaGlwX2dlbV9vYmplY3Qgewo+ICAJc3RydWN0IGRybV9nZW1fb2JqZWN0IGJhc2U7Cj4g IAl1bnNpZ25lZCBpbnQgZmxhZ3M7Cj4gCj4gKwlzdHJ1Y3Qgc2dfdGFibGUgKnNndDsKPiAgCXZv aWQgKmt2YWRkcjsKPiAgCWRtYV9hZGRyX3QgZG1hX2FkZHI7Cj4gIAlzdHJ1Y3QgZG1hX2F0dHJz IGRtYV9hdHRyczsKPiBAQCAtMjgsOCArMjksMTAgQEAgc3RydWN0IHJvY2tjaGlwX2dlbV9vYmpl Y3Qgewo+IAo+ICBzdHJ1Y3Qgc2dfdGFibGUgKnJvY2tjaGlwX2dlbV9wcmltZV9nZXRfc2dfdGFi bGUoc3RydWN0IGRybV9nZW1fb2JqZWN0Cj4gKm9iaik7IHN0cnVjdCBkcm1fZ2VtX29iamVjdCAq Cj4gLXJvY2tjaGlwX2dlbV9wcmltZV9pbXBvcnRfc2dfdGFibGUoc3RydWN0IGRybV9kZXZpY2Ug KmRldiwgc2l6ZV90IHNpemUsCj4gK3JvY2tjaGlwX2dlbV9wcmltZV9pbXBvcnRfc2dfdGFibGUo c3RydWN0IGRybV9kZXZpY2UgKmRybSwKPiArCQkJCSAgIHN0cnVjdCBkbWFfYnVmX2F0dGFjaG1l bnQgKmF0dGFjaCwKPiAgCQkJCSAgIHN0cnVjdCBzZ190YWJsZSAqc2d0KTsKPiArCj4gIHZvaWQg KnJvY2tjaGlwX2dlbV9wcmltZV92bWFwKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKPiAg dm9pZCByb2NrY2hpcF9nZW1fcHJpbWVfdnVubWFwKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2Jq LCB2b2lkICp2YWRkcik7CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3Rv cC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1k ZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: heiko@sntech.de (Heiko =?ISO-8859-1?Q?St=FCbner?=) Date: Fri, 02 Oct 2015 16:33:56 +0200 Subject: [PATCH v2] drm/rockchip: import dma_buf to gem In-Reply-To: <1435282038-23778-1-git-send-email-mark.yao@rock-chips.com> References: <1435282038-23778-1-git-send-email-mark.yao@rock-chips.com> Message-ID: <10058594.7xF1CeL72y@diego> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Mark, Am Freitag, 26. Juni 2015, 09:27:18 schrieb Mark Yao: > We want to display a buffer allocated by other driver, need import > the buffer to gem. > > Signed-off-by: Mark Yao This looks interesting ... do you want to follow up on it? Heiko > --- > Changes in v2: > Adviced by Russell King > - check sgt-nents == 1 when get iova from scatterlist > - remove unused dma_map_sg/dma_unmap_sg, dma_buf_map_attachment->map_dma_buf > should do the dma_map > > drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 1 + > drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 40 > +++++++++++++++++++++++++-- drivers/gpu/drm/rockchip/rockchip_drm_gem.h | > 5 +++- > 3 files changed, 42 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index 3962176..9001a90 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > @@ -287,6 +287,7 @@ static struct drm_driver rockchip_drm_driver = { > .prime_handle_to_fd = drm_gem_prime_handle_to_fd, > .prime_fd_to_handle = drm_gem_prime_fd_to_handle, > .gem_prime_import = drm_gem_prime_import, > + .gem_prime_import_sg_table = rockchip_gem_prime_import_sg_table, > .gem_prime_export = drm_gem_prime_export, > .gem_prime_get_sg_table = rockchip_gem_prime_get_sg_table, > .gem_prime_vmap = rockchip_gem_prime_vmap, > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c > b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c index eb2282c..e8c4d4e 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c > @@ -18,6 +18,7 @@ > #include > > #include > +#include > > #include "rockchip_drm_drv.h" > #include "rockchip_drm_gem.h" > @@ -105,6 +106,36 @@ int rockchip_gem_mmap(struct file *filp, struct > vm_area_struct *vma) return ret; > } > > +struct drm_gem_object * > +rockchip_gem_prime_import_sg_table(struct drm_device *drm, > + struct dma_buf_attachment *attach, > + struct sg_table *sgt) > +{ > + struct rockchip_gem_object *rk_obj; > + struct drm_gem_object *obj; > + > + /* > + * Todo: only support continuous buffer now, plan to found a method > + * to import non continuous with iommu. > + */ > + if (sgt->nents != 1) > + return ERR_PTR(-EINVAL); > + > + rk_obj = kzalloc(sizeof(*rk_obj), GFP_KERNEL); > + if (!rk_obj) > + return ERR_PTR(-ENOMEM); > + > + obj = &rk_obj->base; > + > + drm_gem_private_object_init(drm, obj, attach->dmabuf->size); > + > + rk_obj->dma_addr = sg_dma_address(sgt->sgl); > + rk_obj->sgt = sgt; > + obj->size = sg_dma_len(sgt->sgl); > + > + return obj; > +} > + > struct rockchip_gem_object * > rockchip_gem_create_object(struct drm_device *drm, unsigned int size, > bool alloc_kmap) > @@ -142,11 +173,14 @@ void rockchip_gem_free_object(struct drm_gem_object > *obj) { > struct rockchip_gem_object *rk_obj; > > - drm_gem_free_mmap_offset(obj); > - > rk_obj = to_rockchip_obj(obj); > > - rockchip_gem_free_buf(rk_obj); > + if (obj->import_attach) { > + drm_prime_gem_destroy(obj, rk_obj->sgt); > + } else { > + drm_gem_free_mmap_offset(obj); > + rockchip_gem_free_buf(rk_obj); > + } > > kfree(rk_obj); > } > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h > b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h index ad22618..9fd58e3 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h > @@ -21,6 +21,7 @@ struct rockchip_gem_object { > struct drm_gem_object base; > unsigned int flags; > > + struct sg_table *sgt; > void *kvaddr; > dma_addr_t dma_addr; > struct dma_attrs dma_attrs; > @@ -28,8 +29,10 @@ struct rockchip_gem_object { > > struct sg_table *rockchip_gem_prime_get_sg_table(struct drm_gem_object > *obj); struct drm_gem_object * > -rockchip_gem_prime_import_sg_table(struct drm_device *dev, size_t size, > +rockchip_gem_prime_import_sg_table(struct drm_device *drm, > + struct dma_buf_attachment *attach, > struct sg_table *sgt); > + > void *rockchip_gem_prime_vmap(struct drm_gem_object *obj); > void rockchip_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr); From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752834AbbJBOeJ (ORCPT ); Fri, 2 Oct 2015 10:34:09 -0400 Received: from gloria.sntech.de ([95.129.55.99]:36093 "EHLO gloria.sntech.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752040AbbJBOeG (ORCPT ); Fri, 2 Oct 2015 10:34:06 -0400 From: Heiko =?ISO-8859-1?Q?St=FCbner?= To: Mark Yao Cc: dri-devel@lists.freedesktop.org, David Airlie , Daniel Kurtz , Philipp Zabel , Daniel Vetter , Rob Clark , linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, tfiga@chromium.org, sandy.huang@rock-chips.com, dkm@rock-chips.com, zwl@rock-chips.com, xw@rock-chips.com Subject: Re: [PATCH v2] drm/rockchip: import dma_buf to gem Date: Fri, 02 Oct 2015 16:33:56 +0200 Message-ID: <10058594.7xF1CeL72y@diego> User-Agent: KMail/4.14.10 (Linux/4.1.0-2-amd64; KDE/4.14.10; x86_64; ; ) In-Reply-To: <1435282038-23778-1-git-send-email-mark.yao@rock-chips.com> References: <1435282038-23778-1-git-send-email-mark.yao@rock-chips.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Mark, Am Freitag, 26. Juni 2015, 09:27:18 schrieb Mark Yao: > We want to display a buffer allocated by other driver, need import > the buffer to gem. > > Signed-off-by: Mark Yao This looks interesting ... do you want to follow up on it? Heiko > --- > Changes in v2: > Adviced by Russell King > - check sgt-nents == 1 when get iova from scatterlist > - remove unused dma_map_sg/dma_unmap_sg, dma_buf_map_attachment->map_dma_buf > should do the dma_map > > drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 1 + > drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 40 > +++++++++++++++++++++++++-- drivers/gpu/drm/rockchip/rockchip_drm_gem.h | > 5 +++- > 3 files changed, 42 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index 3962176..9001a90 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > @@ -287,6 +287,7 @@ static struct drm_driver rockchip_drm_driver = { > .prime_handle_to_fd = drm_gem_prime_handle_to_fd, > .prime_fd_to_handle = drm_gem_prime_fd_to_handle, > .gem_prime_import = drm_gem_prime_import, > + .gem_prime_import_sg_table = rockchip_gem_prime_import_sg_table, > .gem_prime_export = drm_gem_prime_export, > .gem_prime_get_sg_table = rockchip_gem_prime_get_sg_table, > .gem_prime_vmap = rockchip_gem_prime_vmap, > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c > b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c index eb2282c..e8c4d4e 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c > @@ -18,6 +18,7 @@ > #include > > #include > +#include > > #include "rockchip_drm_drv.h" > #include "rockchip_drm_gem.h" > @@ -105,6 +106,36 @@ int rockchip_gem_mmap(struct file *filp, struct > vm_area_struct *vma) return ret; > } > > +struct drm_gem_object * > +rockchip_gem_prime_import_sg_table(struct drm_device *drm, > + struct dma_buf_attachment *attach, > + struct sg_table *sgt) > +{ > + struct rockchip_gem_object *rk_obj; > + struct drm_gem_object *obj; > + > + /* > + * Todo: only support continuous buffer now, plan to found a method > + * to import non continuous with iommu. > + */ > + if (sgt->nents != 1) > + return ERR_PTR(-EINVAL); > + > + rk_obj = kzalloc(sizeof(*rk_obj), GFP_KERNEL); > + if (!rk_obj) > + return ERR_PTR(-ENOMEM); > + > + obj = &rk_obj->base; > + > + drm_gem_private_object_init(drm, obj, attach->dmabuf->size); > + > + rk_obj->dma_addr = sg_dma_address(sgt->sgl); > + rk_obj->sgt = sgt; > + obj->size = sg_dma_len(sgt->sgl); > + > + return obj; > +} > + > struct rockchip_gem_object * > rockchip_gem_create_object(struct drm_device *drm, unsigned int size, > bool alloc_kmap) > @@ -142,11 +173,14 @@ void rockchip_gem_free_object(struct drm_gem_object > *obj) { > struct rockchip_gem_object *rk_obj; > > - drm_gem_free_mmap_offset(obj); > - > rk_obj = to_rockchip_obj(obj); > > - rockchip_gem_free_buf(rk_obj); > + if (obj->import_attach) { > + drm_prime_gem_destroy(obj, rk_obj->sgt); > + } else { > + drm_gem_free_mmap_offset(obj); > + rockchip_gem_free_buf(rk_obj); > + } > > kfree(rk_obj); > } > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h > b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h index ad22618..9fd58e3 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h > @@ -21,6 +21,7 @@ struct rockchip_gem_object { > struct drm_gem_object base; > unsigned int flags; > > + struct sg_table *sgt; > void *kvaddr; > dma_addr_t dma_addr; > struct dma_attrs dma_attrs; > @@ -28,8 +29,10 @@ struct rockchip_gem_object { > > struct sg_table *rockchip_gem_prime_get_sg_table(struct drm_gem_object > *obj); struct drm_gem_object * > -rockchip_gem_prime_import_sg_table(struct drm_device *dev, size_t size, > +rockchip_gem_prime_import_sg_table(struct drm_device *drm, > + struct dma_buf_attachment *attach, > struct sg_table *sgt); > + > void *rockchip_gem_prime_vmap(struct drm_gem_object *obj); > void rockchip_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);