From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752189AbdHCWfs (ORCPT ); Thu, 3 Aug 2017 18:35:48 -0400 Received: from vern.gendns.com ([206.190.152.46]:46199 "EHLO vern.gendns.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751987AbdHCWeF (ORCPT ); Thu, 3 Aug 2017 18:34:05 -0400 From: David Lechner To: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org Cc: David Lechner , =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= , Daniel Vetter , David Airlie , Rob Herring , Mark Rutland , Sekhar Nori , Kevin Hilman , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 2/6] drm/tinydrm: generalize tinydrm_xrgb8888_to_gray8() Date: Thu, 3 Aug 2017 17:33:46 -0500 Message-Id: <1501799630-1650-3-git-send-email-david@lechnology.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1501799630-1650-1-git-send-email-david@lechnology.com> References: <1501799630-1650-1-git-send-email-david@lechnology.com> X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vern.gendns.com X-AntiAbuse: Original Domain - vger.kernel.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - lechnology.com X-Get-Message-Sender-Via: vern.gendns.com: authenticated_id: davidmain+lechnology.com/only user confirmed/virtual account not confirmed X-Authenticated-Sender: vern.gendns.com: davidmain@lechnology.com X-Source: X-Source-Args: X-Source-Dir: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This adds parameters for vaddr and clip to tinydrm_xrgb8888_to_gray8() to make it more generic. dma_buf_{begin,end}_cpu_access() are moved out to the repaper driver. Signed-off-by: David Lechner --- drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c | 35 ++++++++++---------------- drivers/gpu/drm/tinydrm/repaper.c | 21 +++++++++++++++- include/drm/tinydrm/tinydrm-helpers.h | 3 ++- 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c b/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c index 75808bb..5915ba8 100644 --- a/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c +++ b/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c @@ -185,7 +185,9 @@ EXPORT_SYMBOL(tinydrm_xrgb8888_to_rgb565); /** * tinydrm_xrgb8888_to_gray8 - Convert XRGB8888 to grayscale * @dst: 8-bit grayscale destination buffer + * @vaddr: XRGB8888 source buffer * @fb: DRM framebuffer + * @clip: Clip rectangle area to copy * * Drm doesn't have native monochrome or grayscale support. * Such drivers can announce the commonly supported XR24 format to userspace @@ -199,12 +201,11 @@ EXPORT_SYMBOL(tinydrm_xrgb8888_to_rgb565); * Returns: * Zero on success, negative error code on failure. */ -int tinydrm_xrgb8888_to_gray8(u8 *dst, struct drm_framebuffer *fb) +int tinydrm_xrgb8888_to_gray8(u8 *dst, void *vaddr, struct drm_framebuffer *fb, + struct drm_clip_rect *clip) { - struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0); - struct dma_buf_attachment *import_attach = cma_obj->base.import_attach; - unsigned int x, y, pitch = fb->pitches[0]; - int ret = 0; + unsigned int len = (clip->x2 - clip->x1) * sizeof(u32); + unsigned int x, y; void *buf; u32 *src; @@ -214,22 +215,16 @@ int tinydrm_xrgb8888_to_gray8(u8 *dst, struct drm_framebuffer *fb) * The cma memory is write-combined so reads are uncached. * Speed up by fetching one line at a time. */ - buf = kmalloc(pitch, GFP_KERNEL); + buf = kmalloc(len, GFP_KERNEL); if (!buf) return -ENOMEM; - if (import_attach) { - ret = dma_buf_begin_cpu_access(import_attach->dmabuf, - DMA_FROM_DEVICE); - if (ret) - goto err_free; - } - - for (y = 0; y < fb->height; y++) { - src = cma_obj->vaddr + (y * pitch); - memcpy(buf, src, pitch); + for (y = clip->y1; y < clip->y2; y++) { + src = vaddr + (y * fb->pitches[0]); + src += clip->x1; + memcpy(buf, src, len); src = buf; - for (x = 0; x < fb->width; x++) { + for (x = clip->x1; x < clip->x2; x++) { u8 r = (*src & 0x00ff0000) >> 16; u8 g = (*src & 0x0000ff00) >> 8; u8 b = *src & 0x000000ff; @@ -240,13 +235,9 @@ int tinydrm_xrgb8888_to_gray8(u8 *dst, struct drm_framebuffer *fb) } } - if (import_attach) - ret = dma_buf_end_cpu_access(import_attach->dmabuf, - DMA_FROM_DEVICE); -err_free: kfree(buf); - return ret; + return 0; } EXPORT_SYMBOL(tinydrm_xrgb8888_to_gray8); diff --git a/drivers/gpu/drm/tinydrm/repaper.c b/drivers/gpu/drm/tinydrm/repaper.c index 3343d3f..d34cd9b 100644 --- a/drivers/gpu/drm/tinydrm/repaper.c +++ b/drivers/gpu/drm/tinydrm/repaper.c @@ -18,6 +18,7 @@ */ #include +#include #include #include #include @@ -525,11 +526,20 @@ static int repaper_fb_dirty(struct drm_framebuffer *fb, struct drm_clip_rect *clips, unsigned int num_clips) { + struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0); + struct dma_buf_attachment *import_attach = cma_obj->base.import_attach; struct tinydrm_device *tdev = fb->dev->dev_private; struct repaper_epd *epd = epd_from_tinydrm(tdev); + struct drm_clip_rect clip; u8 *buf = NULL; int ret = 0; + /* repaper can't do partial updates */ + clip.x1 = 0; + clip.x2 = fb->width; + clip.y1 = 0; + clip.y2 = fb->height; + mutex_lock(&tdev->dirty_lock); if (!epd->enabled) @@ -550,7 +560,16 @@ static int repaper_fb_dirty(struct drm_framebuffer *fb, goto out_unlock; } - ret = tinydrm_xrgb8888_to_gray8(buf, fb); + if (import_attach) { + ret = dma_buf_begin_cpu_access(import_attach->dmabuf, + DMA_FROM_DEVICE); + if (ret) + goto out_unlock; + } + + ret = tinydrm_xrgb8888_to_gray8(buf, cma_obj->vaddr, fb, &clip); + if (import_attach) + dma_buf_end_cpu_access(import_attach->dmabuf, DMA_FROM_DEVICE); if (ret) goto out_unlock; diff --git a/include/drm/tinydrm/tinydrm-helpers.h b/include/drm/tinydrm/tinydrm-helpers.h index a6c387f..9e13ef5 100644 --- a/include/drm/tinydrm/tinydrm-helpers.h +++ b/include/drm/tinydrm/tinydrm-helpers.h @@ -43,7 +43,8 @@ void tinydrm_swab16(u16 *dst, void *vaddr, struct drm_framebuffer *fb, void tinydrm_xrgb8888_to_rgb565(u16 *dst, void *vaddr, struct drm_framebuffer *fb, struct drm_clip_rect *clip, bool swap); -int tinydrm_xrgb8888_to_gray8(u8 *dst, struct drm_framebuffer *fb); +int tinydrm_xrgb8888_to_gray8(u8 *dst, void *vaddr, struct drm_framebuffer *fb, + struct drm_clip_rect *clip); struct backlight_device *tinydrm_of_find_backlight(struct device *dev); int tinydrm_enable_backlight(struct backlight_device *backlight); -- 2.7.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Lechner Subject: [PATCH v3 2/6] drm/tinydrm: generalize tinydrm_xrgb8888_to_gray8() Date: Thu, 3 Aug 2017 17:33:46 -0500 Message-ID: <1501799630-1650-3-git-send-email-david@lechnology.com> References: <1501799630-1650-1-git-send-email-david@lechnology.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1501799630-1650-1-git-send-email-david@lechnology.com> 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, devicetree@vger.kernel.org Cc: Mark Rutland , David Lechner , Kevin Hilman , Sekhar Nori , linux-kernel@vger.kernel.org, Rob Herring , linux-arm-kernel@lists.infradead.org List-Id: devicetree@vger.kernel.org VGhpcyBhZGRzIHBhcmFtZXRlcnMgZm9yIHZhZGRyIGFuZCBjbGlwIHRvIHRpbnlkcm1feHJnYjg4 ODhfdG9fZ3JheTgoKSB0bwptYWtlIGl0IG1vcmUgZ2VuZXJpYy4KCmRtYV9idWZfe2JlZ2luLGVu ZH1fY3B1X2FjY2VzcygpIGFyZSBtb3ZlZCBvdXQgdG8gdGhlIHJlcGFwZXIgZHJpdmVyLgoKU2ln bmVkLW9mZi1ieTogRGF2aWQgTGVjaG5lciA8ZGF2aWRAbGVjaG5vbG9neS5jb20+Ci0tLQogZHJp dmVycy9ncHUvZHJtL3Rpbnlkcm0vY29yZS90aW55ZHJtLWhlbHBlcnMuYyB8IDM1ICsrKysrKysr KystLS0tLS0tLS0tLS0tLS0tCiBkcml2ZXJzL2dwdS9kcm0vdGlueWRybS9yZXBhcGVyLmMgICAg ICAgICAgICAgIHwgMjEgKysrKysrKysrKysrKysrLQogaW5jbHVkZS9kcm0vdGlueWRybS90aW55 ZHJtLWhlbHBlcnMuaCAgICAgICAgICB8ICAzICsrLQogMyBmaWxlcyBjaGFuZ2VkLCAzNSBpbnNl cnRpb25zKCspLCAyNCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v dGlueWRybS9jb3JlL3Rpbnlkcm0taGVscGVycy5jIGIvZHJpdmVycy9ncHUvZHJtL3Rpbnlkcm0v Y29yZS90aW55ZHJtLWhlbHBlcnMuYwppbmRleCA3NTgwOGJiLi41OTE1YmE4IDEwMDY0NAotLS0g YS9kcml2ZXJzL2dwdS9kcm0vdGlueWRybS9jb3JlL3Rpbnlkcm0taGVscGVycy5jCisrKyBiL2Ry aXZlcnMvZ3B1L2RybS90aW55ZHJtL2NvcmUvdGlueWRybS1oZWxwZXJzLmMKQEAgLTE4NSw3ICsx ODUsOSBAQCBFWFBPUlRfU1lNQk9MKHRpbnlkcm1feHJnYjg4ODhfdG9fcmdiNTY1KTsKIC8qKgog ICogdGlueWRybV94cmdiODg4OF90b19ncmF5OCAtIENvbnZlcnQgWFJHQjg4ODggdG8gZ3JheXNj YWxlCiAgKiBAZHN0OiA4LWJpdCBncmF5c2NhbGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBAdmFk ZHI6IFhSR0I4ODg4IHNvdXJjZSBidWZmZXIKICAqIEBmYjogRFJNIGZyYW1lYnVmZmVyCisgKiBA Y2xpcDogQ2xpcCByZWN0YW5nbGUgYXJlYSB0byBjb3B5CiAgKgogICogRHJtIGRvZXNuJ3QgaGF2 ZSBuYXRpdmUgbW9ub2Nocm9tZSBvciBncmF5c2NhbGUgc3VwcG9ydC4KICAqIFN1Y2ggZHJpdmVy cyBjYW4gYW5ub3VuY2UgdGhlIGNvbW1vbmx5IHN1cHBvcnRlZCBYUjI0IGZvcm1hdCB0byB1c2Vy c3BhY2UKQEAgLTE5OSwxMiArMjAxLDExIEBAIEVYUE9SVF9TWU1CT0wodGlueWRybV94cmdiODg4 OF90b19yZ2I1NjUpOwogICogUmV0dXJuczoKICAqIFplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUg ZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICovCi1pbnQgdGlueWRybV94cmdiODg4OF90b19ncmF5 OCh1OCAqZHN0LCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYikKK2ludCB0aW55ZHJtX3hyZ2I4 ODg4X3RvX2dyYXk4KHU4ICpkc3QsIHZvaWQgKnZhZGRyLCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVy ICpmYiwKKwkJCSAgICAgIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwKQogewotCXN0cnVjdCBk cm1fZ2VtX2NtYV9vYmplY3QgKmNtYV9vYmogPSBkcm1fZmJfY21hX2dldF9nZW1fb2JqKGZiLCAw KTsKLQlzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICppbXBvcnRfYXR0YWNoID0gY21hX29iai0+ YmFzZS5pbXBvcnRfYXR0YWNoOwotCXVuc2lnbmVkIGludCB4LCB5LCBwaXRjaCA9IGZiLT5waXRj aGVzWzBdOwotCWludCByZXQgPSAwOworCXVuc2lnbmVkIGludCBsZW4gPSAoY2xpcC0+eDIgLSBj bGlwLT54MSkgKiBzaXplb2YodTMyKTsKKwl1bnNpZ25lZCBpbnQgeCwgeTsKIAl2b2lkICpidWY7 CiAJdTMyICpzcmM7CiAKQEAgLTIxNCwyMiArMjE1LDE2IEBAIGludCB0aW55ZHJtX3hyZ2I4ODg4 X3RvX2dyYXk4KHU4ICpkc3QsIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiKQogCSAqIFRoZSBj bWEgbWVtb3J5IGlzIHdyaXRlLWNvbWJpbmVkIHNvIHJlYWRzIGFyZSB1bmNhY2hlZC4KIAkgKiBT cGVlZCB1cCBieSBmZXRjaGluZyBvbmUgbGluZSBhdCBhIHRpbWUuCiAJICovCi0JYnVmID0ga21h bGxvYyhwaXRjaCwgR0ZQX0tFUk5FTCk7CisJYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwp OwogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmIChpbXBvcnRfYXR0YWNoKSB7 Ci0JCXJldCA9IGRtYV9idWZfYmVnaW5fY3B1X2FjY2VzcyhpbXBvcnRfYXR0YWNoLT5kbWFidWYs Ci0JCQkJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJf ZnJlZTsKLQl9Ci0KLQlmb3IgKHkgPSAwOyB5IDwgZmItPmhlaWdodDsgeSsrKSB7Ci0JCXNyYyA9 IGNtYV9vYmotPnZhZGRyICsgKHkgKiBwaXRjaCk7Ci0JCW1lbWNweShidWYsIHNyYywgcGl0Y2gp OworCWZvciAoeSA9IGNsaXAtPnkxOyB5IDwgY2xpcC0+eTI7IHkrKykgeworCQlzcmMgPSB2YWRk ciArICh5ICogZmItPnBpdGNoZXNbMF0pOworCQlzcmMgKz0gY2xpcC0+eDE7CisJCW1lbWNweShi dWYsIHNyYywgbGVuKTsKIAkJc3JjID0gYnVmOwotCQlmb3IgKHggPSAwOyB4IDwgZmItPndpZHRo OyB4KyspIHsKKwkJZm9yICh4ID0gY2xpcC0+eDE7IHggPCBjbGlwLT54MjsgeCsrKSB7CiAJCQl1 OCByID0gKCpzcmMgJiAweDAwZmYwMDAwKSA+PiAxNjsKIAkJCXU4IGcgPSAoKnNyYyAmIDB4MDAw MGZmMDApID4+IDg7CiAJCQl1OCBiID0gICpzcmMgJiAweDAwMDAwMGZmOwpAQCAtMjQwLDEzICsy MzUsOSBAQCBpbnQgdGlueWRybV94cmdiODg4OF90b19ncmF5OCh1OCAqZHN0LCBzdHJ1Y3QgZHJt X2ZyYW1lYnVmZmVyICpmYikKIAkJfQogCX0KIAotCWlmIChpbXBvcnRfYXR0YWNoKQotCQlyZXQg PSBkbWFfYnVmX2VuZF9jcHVfYWNjZXNzKGltcG9ydF9hdHRhY2gtPmRtYWJ1ZiwKLQkJCQkJICAg ICBETUFfRlJPTV9ERVZJQ0UpOwotZXJyX2ZyZWU6CiAJa2ZyZWUoYnVmKTsKIAotCXJldHVybiBy ZXQ7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHRpbnlkcm1feHJnYjg4ODhfdG9fZ3Jh eTgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGlueWRybS9yZXBhcGVyLmMgYi9k cml2ZXJzL2dwdS9kcm0vdGlueWRybS9yZXBhcGVyLmMKaW5kZXggMzM0M2QzZi4uZDM0Y2Q5YiAx MDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Rpbnlkcm0vcmVwYXBlci5jCisrKyBiL2RyaXZl cnMvZ3B1L2RybS90aW55ZHJtL3JlcGFwZXIuYwpAQCAtMTgsNiArMTgsNyBAQAogICovCiAKICNp bmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1idWYuaD4KICNpbmNs dWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAj aW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CkBAIC01MjUsMTEgKzUyNiwyMCBAQCBzdGF0aWMg aW50IHJlcGFwZXJfZmJfZGlydHkoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCiAJCQkgICAg c3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXBzLAogCQkJICAgIHVuc2lnbmVkIGludCBudW1fY2xp cHMpCiB7CisJc3RydWN0IGRybV9nZW1fY21hX29iamVjdCAqY21hX29iaiA9IGRybV9mYl9jbWFf Z2V0X2dlbV9vYmooZmIsIDApOworCXN0cnVjdCBkbWFfYnVmX2F0dGFjaG1lbnQgKmltcG9ydF9h dHRhY2ggPSBjbWFfb2JqLT5iYXNlLmltcG9ydF9hdHRhY2g7CiAJc3RydWN0IHRpbnlkcm1fZGV2 aWNlICp0ZGV2ID0gZmItPmRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IHJlcGFwZXJfZXBkICpl cGQgPSBlcGRfZnJvbV90aW55ZHJtKHRkZXYpOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGNsaXA7 CiAJdTggKmJ1ZiA9IE5VTEw7CiAJaW50IHJldCA9IDA7CiAKKwkvKiByZXBhcGVyIGNhbid0IGRv IHBhcnRpYWwgdXBkYXRlcyAqLworCWNsaXAueDEgPSAwOworCWNsaXAueDIgPSBmYi0+d2lkdGg7 CisJY2xpcC55MSA9IDA7CisJY2xpcC55MiA9IGZiLT5oZWlnaHQ7CisKIAltdXRleF9sb2NrKCZ0 ZGV2LT5kaXJ0eV9sb2NrKTsKIAogCWlmICghZXBkLT5lbmFibGVkKQpAQCAtNTUwLDcgKzU2MCwx NiBAQCBzdGF0aWMgaW50IHJlcGFwZXJfZmJfZGlydHkoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAq ZmIsCiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlyZXQgPSB0aW55ZHJtX3hyZ2I4ODg4X3Rv X2dyYXk4KGJ1ZiwgZmIpOworCWlmIChpbXBvcnRfYXR0YWNoKSB7CisJCXJldCA9IGRtYV9idWZf YmVnaW5fY3B1X2FjY2VzcyhpbXBvcnRfYXR0YWNoLT5kbWFidWYsCisJCQkJCSAgICAgICBETUFf RlJPTV9ERVZJQ0UpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXJl dCA9IHRpbnlkcm1feHJnYjg4ODhfdG9fZ3JheTgoYnVmLCBjbWFfb2JqLT52YWRkciwgZmIsICZj bGlwKTsKKwlpZiAoaW1wb3J0X2F0dGFjaCkKKwkJZG1hX2J1Zl9lbmRfY3B1X2FjY2VzcyhpbXBv cnRfYXR0YWNoLT5kbWFidWYsIERNQV9GUk9NX0RFVklDRSk7CiAJaWYgKHJldCkKIAkJZ290byBv dXRfdW5sb2NrOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS90aW55ZHJtL3Rpbnlkcm0taGVs cGVycy5oIGIvaW5jbHVkZS9kcm0vdGlueWRybS90aW55ZHJtLWhlbHBlcnMuaAppbmRleCBhNmMz ODdmLi45ZTEzZWY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS90aW55ZHJtL3Rpbnlkcm0taGVs cGVycy5oCisrKyBiL2luY2x1ZGUvZHJtL3Rpbnlkcm0vdGlueWRybS1oZWxwZXJzLmgKQEAgLTQz LDcgKzQzLDggQEAgdm9pZCB0aW55ZHJtX3N3YWIxNih1MTYgKmRzdCwgdm9pZCAqdmFkZHIsIHN0 cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAogdm9pZCB0aW55ZHJtX3hyZ2I4ODg4X3RvX3JnYjU2 NSh1MTYgKmRzdCwgdm9pZCAqdmFkZHIsCiAJCQkJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIs CiAJCQkJc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXAsIGJvb2wgc3dhcCk7Ci1pbnQgdGlueWRy bV94cmdiODg4OF90b19ncmF5OCh1OCAqZHN0LCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYik7 CitpbnQgdGlueWRybV94cmdiODg4OF90b19ncmF5OCh1OCAqZHN0LCB2b2lkICp2YWRkciwgc3Ry dWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkgICAgICBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAq Y2xpcCk7CiAKIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICp0aW55ZHJtX29mX2ZpbmRfYmFja2xp Z2h0KHN0cnVjdCBkZXZpY2UgKmRldik7CiBpbnQgdGlueWRybV9lbmFibGVfYmFja2xpZ2h0KHN0 cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiYWNrbGlnaHQpOwotLSAKMi43LjQKCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxp c3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNr dG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: david@lechnology.com (David Lechner) Date: Thu, 3 Aug 2017 17:33:46 -0500 Subject: [PATCH v3 2/6] drm/tinydrm: generalize tinydrm_xrgb8888_to_gray8() In-Reply-To: <1501799630-1650-1-git-send-email-david@lechnology.com> References: <1501799630-1650-1-git-send-email-david@lechnology.com> Message-ID: <1501799630-1650-3-git-send-email-david@lechnology.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org This adds parameters for vaddr and clip to tinydrm_xrgb8888_to_gray8() to make it more generic. dma_buf_{begin,end}_cpu_access() are moved out to the repaper driver. Signed-off-by: David Lechner --- drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c | 35 ++++++++++---------------- drivers/gpu/drm/tinydrm/repaper.c | 21 +++++++++++++++- include/drm/tinydrm/tinydrm-helpers.h | 3 ++- 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c b/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c index 75808bb..5915ba8 100644 --- a/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c +++ b/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c @@ -185,7 +185,9 @@ EXPORT_SYMBOL(tinydrm_xrgb8888_to_rgb565); /** * tinydrm_xrgb8888_to_gray8 - Convert XRGB8888 to grayscale * @dst: 8-bit grayscale destination buffer + * @vaddr: XRGB8888 source buffer * @fb: DRM framebuffer + * @clip: Clip rectangle area to copy * * Drm doesn't have native monochrome or grayscale support. * Such drivers can announce the commonly supported XR24 format to userspace @@ -199,12 +201,11 @@ EXPORT_SYMBOL(tinydrm_xrgb8888_to_rgb565); * Returns: * Zero on success, negative error code on failure. */ -int tinydrm_xrgb8888_to_gray8(u8 *dst, struct drm_framebuffer *fb) +int tinydrm_xrgb8888_to_gray8(u8 *dst, void *vaddr, struct drm_framebuffer *fb, + struct drm_clip_rect *clip) { - struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0); - struct dma_buf_attachment *import_attach = cma_obj->base.import_attach; - unsigned int x, y, pitch = fb->pitches[0]; - int ret = 0; + unsigned int len = (clip->x2 - clip->x1) * sizeof(u32); + unsigned int x, y; void *buf; u32 *src; @@ -214,22 +215,16 @@ int tinydrm_xrgb8888_to_gray8(u8 *dst, struct drm_framebuffer *fb) * The cma memory is write-combined so reads are uncached. * Speed up by fetching one line at a time. */ - buf = kmalloc(pitch, GFP_KERNEL); + buf = kmalloc(len, GFP_KERNEL); if (!buf) return -ENOMEM; - if (import_attach) { - ret = dma_buf_begin_cpu_access(import_attach->dmabuf, - DMA_FROM_DEVICE); - if (ret) - goto err_free; - } - - for (y = 0; y < fb->height; y++) { - src = cma_obj->vaddr + (y * pitch); - memcpy(buf, src, pitch); + for (y = clip->y1; y < clip->y2; y++) { + src = vaddr + (y * fb->pitches[0]); + src += clip->x1; + memcpy(buf, src, len); src = buf; - for (x = 0; x < fb->width; x++) { + for (x = clip->x1; x < clip->x2; x++) { u8 r = (*src & 0x00ff0000) >> 16; u8 g = (*src & 0x0000ff00) >> 8; u8 b = *src & 0x000000ff; @@ -240,13 +235,9 @@ int tinydrm_xrgb8888_to_gray8(u8 *dst, struct drm_framebuffer *fb) } } - if (import_attach) - ret = dma_buf_end_cpu_access(import_attach->dmabuf, - DMA_FROM_DEVICE); -err_free: kfree(buf); - return ret; + return 0; } EXPORT_SYMBOL(tinydrm_xrgb8888_to_gray8); diff --git a/drivers/gpu/drm/tinydrm/repaper.c b/drivers/gpu/drm/tinydrm/repaper.c index 3343d3f..d34cd9b 100644 --- a/drivers/gpu/drm/tinydrm/repaper.c +++ b/drivers/gpu/drm/tinydrm/repaper.c @@ -18,6 +18,7 @@ */ #include +#include #include #include #include @@ -525,11 +526,20 @@ static int repaper_fb_dirty(struct drm_framebuffer *fb, struct drm_clip_rect *clips, unsigned int num_clips) { + struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0); + struct dma_buf_attachment *import_attach = cma_obj->base.import_attach; struct tinydrm_device *tdev = fb->dev->dev_private; struct repaper_epd *epd = epd_from_tinydrm(tdev); + struct drm_clip_rect clip; u8 *buf = NULL; int ret = 0; + /* repaper can't do partial updates */ + clip.x1 = 0; + clip.x2 = fb->width; + clip.y1 = 0; + clip.y2 = fb->height; + mutex_lock(&tdev->dirty_lock); if (!epd->enabled) @@ -550,7 +560,16 @@ static int repaper_fb_dirty(struct drm_framebuffer *fb, goto out_unlock; } - ret = tinydrm_xrgb8888_to_gray8(buf, fb); + if (import_attach) { + ret = dma_buf_begin_cpu_access(import_attach->dmabuf, + DMA_FROM_DEVICE); + if (ret) + goto out_unlock; + } + + ret = tinydrm_xrgb8888_to_gray8(buf, cma_obj->vaddr, fb, &clip); + if (import_attach) + dma_buf_end_cpu_access(import_attach->dmabuf, DMA_FROM_DEVICE); if (ret) goto out_unlock; diff --git a/include/drm/tinydrm/tinydrm-helpers.h b/include/drm/tinydrm/tinydrm-helpers.h index a6c387f..9e13ef5 100644 --- a/include/drm/tinydrm/tinydrm-helpers.h +++ b/include/drm/tinydrm/tinydrm-helpers.h @@ -43,7 +43,8 @@ void tinydrm_swab16(u16 *dst, void *vaddr, struct drm_framebuffer *fb, void tinydrm_xrgb8888_to_rgb565(u16 *dst, void *vaddr, struct drm_framebuffer *fb, struct drm_clip_rect *clip, bool swap); -int tinydrm_xrgb8888_to_gray8(u8 *dst, struct drm_framebuffer *fb); +int tinydrm_xrgb8888_to_gray8(u8 *dst, void *vaddr, struct drm_framebuffer *fb, + struct drm_clip_rect *clip); struct backlight_device *tinydrm_of_find_backlight(struct device *dev); int tinydrm_enable_backlight(struct backlight_device *backlight); -- 2.7.4