From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752692AbdKJNd0 (ORCPT ); Fri, 10 Nov 2017 08:33:26 -0500 Received: from fw-tnat.cambridge.arm.com ([217.140.96.140]:59814 "EHLO cam-smtp0.cambridge.arm.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750850AbdKJNdZ (ORCPT ); Fri, 10 Nov 2017 08:33:25 -0500 From: Liviu Dudau To: Laurent Pinchart Cc: Daniel Vetter , Jani Nikula , Sean Paul , David Airlie , Brian Starkey , Mali DP Maintainers , DRI-devel , LKML , intel-gfx@lists.freedesktop.org, Liviu Dudau Subject: [PATCH v2] drm: gem_cma_helper.c: Allow importing of contiguous scatterlists with nents > 1 Date: Fri, 10 Nov 2017 13:33:10 +0000 Message-Id: <20171110133310.1225-1-Liviu.Dudau@arm.com> X-Mailer: git-send-email 2.15.0 In-Reply-To: <2213365.Z1vsgl9bDt@avalon> References: <2213365.Z1vsgl9bDt@avalon> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org drm_gem_cma_prime_import_sg_table() will fail if the number of entries in the sg_table > 1. However, you can have a device that uses an IOMMU engine and can map a discontiguous buffer with multiple entries that have consecutive sg_dma_addresses, effectively making it contiguous. Allow for that scenario by testing the entries in the sg_table for contiguous coverage. Reviewed-by: Laurent Pinchart Signed-off-by: Liviu Dudau --- Laurent, Thanks for the review! I would like to ask for one more favour: if you are OK with this version, can you pull this patch through the drm-misc tree? Many thanks, Liviu drivers/gpu/drm/drm_gem_cma_helper.c | 22 ++++++++++++++++++++-- include/drm/drm_gem_cma_helper.h | 4 +++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/drm_gem_cma_helper.c b/drivers/gpu/drm/drm_gem_cma_helper.c index 020e7668dfaba..43b179212052d 100644 --- a/drivers/gpu/drm/drm_gem_cma_helper.c +++ b/drivers/gpu/drm/drm_gem_cma_helper.c @@ -482,8 +482,26 @@ drm_gem_cma_prime_import_sg_table(struct drm_device *dev, { struct drm_gem_cma_object *cma_obj; - if (sgt->nents != 1) - return ERR_PTR(-EINVAL); + if (sgt->nents != 1) { + /* check if the entries in the sg_table are contiguous */ + dma_addr_t next_addr = sg_dma_address(sgt->sgl); + struct scatterlist *s; + unsigned int i; + + for_each_sg(sgt->sgl, s, sgt->nents, i) { + /* + * sg_dma_address(s) is only valid for entries + * that have sg_dma_len(s) != 0 + */ + if (!sg_dma_len(s)) + continue; + + if (sg_dma_address(s) != next_addr) + return ERR_PTR(-EINVAL); + + next_addr = sg_dma_address(s) + sg_dma_len(s); + } + } /* Create a CMA GEM buffer. */ cma_obj = __drm_gem_cma_create(dev, attach->dmabuf->size); diff --git a/include/drm/drm_gem_cma_helper.h b/include/drm/drm_gem_cma_helper.h index 58a739bf15f1f..214aa85adc8d5 100644 --- a/include/drm/drm_gem_cma_helper.h +++ b/include/drm/drm_gem_cma_helper.h @@ -8,7 +8,9 @@ * struct drm_gem_cma_object - GEM object backed by CMA memory allocations * @base: base GEM object * @paddr: physical address of the backing memory - * @sgt: scatter/gather table for imported PRIME buffers + * @sgt: scatter/gather table for imported PRIME buffers. The table can have + * more than one entry but they are guaranteed to have contiguous + * DMA addresses. * @vaddr: kernel virtual address of the backing memory */ struct drm_gem_cma_object { -- 2.14.3 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Liviu Dudau Subject: [PATCH v2] drm: gem_cma_helper.c: Allow importing of contiguous scatterlists with nents > 1 Date: Fri, 10 Nov 2017 13:33:10 +0000 Message-ID: <20171110133310.1225-1-Liviu.Dudau@arm.com> References: <2213365.Z1vsgl9bDt@avalon> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <2213365.Z1vsgl9bDt@avalon> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Laurent Pinchart Cc: David Airlie , intel-gfx@lists.freedesktop.org, LKML , DRI-devel , Mali DP Maintainers , Daniel Vetter List-Id: dri-devel@lists.freedesktop.org ZHJtX2dlbV9jbWFfcHJpbWVfaW1wb3J0X3NnX3RhYmxlKCkgd2lsbCBmYWlsIGlmIHRoZSBudW1i ZXIgb2YgZW50cmllcwppbiB0aGUgc2dfdGFibGUgPiAxLiBIb3dldmVyLCB5b3UgY2FuIGhhdmUg YSBkZXZpY2UgdGhhdCB1c2VzIGFuIElPTU1VCmVuZ2luZSBhbmQgY2FuIG1hcCBhIGRpc2NvbnRp Z3VvdXMgYnVmZmVyIHdpdGggbXVsdGlwbGUgZW50cmllcyB0aGF0CmhhdmUgY29uc2VjdXRpdmUg c2dfZG1hX2FkZHJlc3NlcywgZWZmZWN0aXZlbHkgbWFraW5nIGl0IGNvbnRpZ3VvdXMuCkFsbG93 IGZvciB0aGF0IHNjZW5hcmlvIGJ5IHRlc3RpbmcgdGhlIGVudHJpZXMgaW4gdGhlIHNnX3RhYmxl IGZvcgpjb250aWd1b3VzIGNvdmVyYWdlLgoKUmV2aWV3ZWQtYnk6IExhdXJlbnQgUGluY2hhcnQg PGxhdXJlbnQucGluY2hhcnRAaWRlYXNvbmJvYXJkLmNvbT4KU2lnbmVkLW9mZi1ieTogTGl2aXUg RHVkYXUgPGxpdml1LmR1ZGF1QGFybS5jb20+Ci0tLQoKTGF1cmVudCwKClRoYW5rcyBmb3IgdGhl IHJldmlldyEgSSB3b3VsZCBsaWtlIHRvIGFzayBmb3Igb25lIG1vcmUgZmF2b3VyOiBpZiB5b3UK YXJlIE9LIHdpdGggdGhpcyB2ZXJzaW9uLCBjYW4geW91IHB1bGwgdGhpcyBwYXRjaCB0aHJvdWdo IHRoZSBkcm0tbWlzYyB0cmVlPwoKTWFueSB0aGFua3MsCkxpdml1CgogZHJpdmVycy9ncHUvZHJt L2RybV9nZW1fY21hX2hlbHBlci5jIHwgMjIgKysrKysrKysrKysrKysrKysrKystLQogaW5jbHVk ZS9kcm0vZHJtX2dlbV9jbWFfaGVscGVyLmggICAgIHwgIDQgKysrLQogMiBmaWxlcyBjaGFuZ2Vk LCAyMyBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9kcm1fZ2VtX2NtYV9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtX2Nt YV9oZWxwZXIuYwppbmRleCAwMjBlNzY2OGRmYWJhLi40M2IxNzkyMTIwNTJkIDEwMDY0NAotLS0g YS9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbV9jbWFfaGVscGVyLmMKKysrIGIvZHJpdmVycy9ncHUv ZHJtL2RybV9nZW1fY21hX2hlbHBlci5jCkBAIC00ODIsOCArNDgyLDI2IEBAIGRybV9nZW1fY21h X3ByaW1lX2ltcG9ydF9zZ190YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogewogCXN0cnVj dCBkcm1fZ2VtX2NtYV9vYmplY3QgKmNtYV9vYmo7CiAKLQlpZiAoc2d0LT5uZW50cyAhPSAxKQot CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlpZiAoc2d0LT5uZW50cyAhPSAxKSB7CisJCS8q IGNoZWNrIGlmIHRoZSBlbnRyaWVzIGluIHRoZSBzZ190YWJsZSBhcmUgY29udGlndW91cyAqLwor CQlkbWFfYWRkcl90IG5leHRfYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNndC0+c2dsKTsKKwkJc3Ry dWN0IHNjYXR0ZXJsaXN0ICpzOworCQl1bnNpZ25lZCBpbnQgaTsKKworCQlmb3JfZWFjaF9zZyhz Z3QtPnNnbCwgcywgc2d0LT5uZW50cywgaSkgeworCQkJLyoKKwkJCSAqIHNnX2RtYV9hZGRyZXNz KHMpIGlzIG9ubHkgdmFsaWQgZm9yIGVudHJpZXMKKwkJCSAqIHRoYXQgaGF2ZSBzZ19kbWFfbGVu KHMpICE9IDAKKwkJCSAqLworCQkJaWYgKCFzZ19kbWFfbGVuKHMpKQorCQkJCWNvbnRpbnVlOwor CisJCQlpZiAoc2dfZG1hX2FkZHJlc3MocykgIT0gbmV4dF9hZGRyKQorCQkJCXJldHVybiBFUlJf UFRSKC1FSU5WQUwpOworCisJCQluZXh0X2FkZHIgPSBzZ19kbWFfYWRkcmVzcyhzKSArIHNnX2Rt YV9sZW4ocyk7CisJCX0KKwl9CiAKIAkvKiBDcmVhdGUgYSBDTUEgR0VNIGJ1ZmZlci4gKi8KIAlj bWFfb2JqID0gX19kcm1fZ2VtX2NtYV9jcmVhdGUoZGV2LCBhdHRhY2gtPmRtYWJ1Zi0+c2l6ZSk7 CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fZ2VtX2NtYV9oZWxwZXIuaCBiL2luY2x1ZGUv ZHJtL2RybV9nZW1fY21hX2hlbHBlci5oCmluZGV4IDU4YTczOWJmMTVmMWYuLjIxNGFhODVhZGM4 ZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9nZW1fY21hX2hlbHBlci5oCisrKyBiL2lu Y2x1ZGUvZHJtL2RybV9nZW1fY21hX2hlbHBlci5oCkBAIC04LDcgKzgsOSBAQAogICogc3RydWN0 IGRybV9nZW1fY21hX29iamVjdCAtIEdFTSBvYmplY3QgYmFja2VkIGJ5IENNQSBtZW1vcnkgYWxs b2NhdGlvbnMKICAqIEBiYXNlOiBiYXNlIEdFTSBvYmplY3QKICAqIEBwYWRkcjogcGh5c2ljYWwg YWRkcmVzcyBvZiB0aGUgYmFja2luZyBtZW1vcnkKLSAqIEBzZ3Q6IHNjYXR0ZXIvZ2F0aGVyIHRh YmxlIGZvciBpbXBvcnRlZCBQUklNRSBidWZmZXJzCisgKiBAc2d0OiBzY2F0dGVyL2dhdGhlciB0 YWJsZSBmb3IgaW1wb3J0ZWQgUFJJTUUgYnVmZmVycy4gVGhlIHRhYmxlIGNhbiBoYXZlCisgKiAg ICAgICBtb3JlIHRoYW4gb25lIGVudHJ5IGJ1dCB0aGV5IGFyZSBndWFyYW50ZWVkIHRvIGhhdmUg Y29udGlndW91cworICogICAgICAgRE1BIGFkZHJlc3Nlcy4KICAqIEB2YWRkcjoga2VybmVsIHZp cnR1YWwgYWRkcmVzcyBvZiB0aGUgYmFja2luZyBtZW1vcnkKICAqLwogc3RydWN0IGRybV9nZW1f Y21hX29iamVjdCB7Ci0tIAoyLjE0LjMKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2ludGVsLWdmeAo=