From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753438AbcDXUup (ORCPT ); Sun, 24 Apr 2016 16:50:45 -0400 Received: from asav21.altibox.net ([109.247.116.8]:32888 "EHLO asav21.altibox.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753270AbcDXUtk (ORCPT ); Sun, 24 Apr 2016 16:49:40 -0400 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= To: dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org Cc: daniel@ffwll.ch, laurent.pinchart@ideasonboard.com, tomi.valkeinen@ti.com, linux-kernel@vger.kernel.org, =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Subject: [PATCH v2 8/8] drm/udl: Use drm_fb_helper deferred_io support Date: Sun, 24 Apr 2016 22:49:02 +0200 Message-Id: <1461530942-22485-9-git-send-email-noralf@tronnes.org> X-Mailer: git-send-email 2.2.2 In-Reply-To: <1461530942-22485-1-git-send-email-noralf@tronnes.org> References: <1461530942-22485-1-git-send-email-noralf@tronnes.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-CMAE-Score: 0 X-CMAE-Analysis: v=2.1 cv=VqODe7Cn c=1 sm=1 tr=0 a=gFHx44SYZz5JQKQKbGEAEQ==:117 a=gFHx44SYZz5JQKQKbGEAEQ==:17 a=L9H7d07YOLsA:10 a=9cW_t1CCXrUA:10 a=s5jvgZ67dGcA:10 a=IkcTkHD0fZMA:10 a=SJz97ENfAAAA:8 a=-mVGThkMkXGns-2nlfgA:9 a=QEXdDO2ut3YA:10 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Use the fbdev deferred io support in drm_fb_helper. The (struct fb_ops *)->fb_{fillrect,copyarea,imageblit} functions will now schedule a worker instead of being flushed directly like it was previously (recorded when in atomic). This patch has only been compile tested. Signed-off-by: Noralf Trønnes --- Changes since v1: - No need to enable deferred_io by default since drm_fb_helper uses a dedicated worker for flushing drivers/gpu/drm/udl/udl_drv.h | 2 - drivers/gpu/drm/udl/udl_fb.c | 140 ++---------------------------------------- 2 files changed, 6 insertions(+), 136 deletions(-) diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h index 4a064ef..0b03d34 100644 --- a/drivers/gpu/drm/udl/udl_drv.h +++ b/drivers/gpu/drm/udl/udl_drv.h @@ -81,8 +81,6 @@ struct udl_framebuffer { struct drm_framebuffer base; struct udl_gem_object *obj; bool active_16; /* active on the 16-bit channel */ - int x1, y1, x2, y2; /* dirty rect */ - spinlock_t dirty_lock; }; #define to_udl_fb(x) container_of(x, struct udl_framebuffer, base) diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c index a52de2f..4a9b432 100644 --- a/drivers/gpu/drm/udl/udl_fb.c +++ b/drivers/gpu/drm/udl/udl_fb.c @@ -77,68 +77,6 @@ static uint16_t rgb16(uint32_t col) } #endif -/* - * NOTE: fb_defio.c is holding info->fbdefio.mutex - * Touching ANY framebuffer memory that triggers a page fault - * in fb_defio will cause a deadlock, when it also tries to - * grab the same mutex. - */ -static void udlfb_dpy_deferred_io(struct fb_info *info, - struct list_head *pagelist) -{ - struct page *cur; - struct fb_deferred_io *fbdefio = info->fbdefio; - struct udl_fbdev *ufbdev = info->par; - struct drm_device *dev = ufbdev->ufb.base.dev; - struct udl_device *udl = dev->dev_private; - struct urb *urb; - char *cmd; - cycles_t start_cycles, end_cycles; - int bytes_sent = 0; - int bytes_identical = 0; - int bytes_rendered = 0; - - if (!fb_defio) - return; - - start_cycles = get_cycles(); - - urb = udl_get_urb(dev); - if (!urb) - return; - - cmd = urb->transfer_buffer; - - /* walk the written page list and render each to device */ - list_for_each_entry(cur, &fbdefio->pagelist, lru) { - - if (udl_render_hline(dev, (ufbdev->ufb.base.bits_per_pixel / 8), - &urb, (char *) info->fix.smem_start, - &cmd, cur->index << PAGE_SHIFT, - cur->index << PAGE_SHIFT, - PAGE_SIZE, &bytes_identical, &bytes_sent)) - goto error; - bytes_rendered += PAGE_SIZE; - } - - if (cmd > (char *) urb->transfer_buffer) { - /* Send partial buffer remaining before exiting */ - int len = cmd - (char *) urb->transfer_buffer; - udl_submit_urb(dev, urb, len); - bytes_sent += len; - } else - udl_urb_completion(urb); - -error: - atomic_add(bytes_sent, &udl->bytes_sent); - atomic_add(bytes_identical, &udl->bytes_identical); - atomic_add(bytes_rendered, &udl->bytes_rendered); - end_cycles = get_cycles(); - atomic_add(((unsigned int) ((end_cycles - start_cycles) - >> 10)), /* Kcycles */ - &udl->cpu_kcycles_used); -} - int udl_handle_damage(struct udl_framebuffer *fb, int x, int y, int width, int height) { @@ -152,9 +90,6 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y, struct urb *urb; int aligned_x; int bpp = (fb->base.bits_per_pixel / 8); - int x2, y2; - bool store_for_later = false; - unsigned long flags; if (!fb->active_16) return 0; @@ -180,38 +115,6 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y, (y + height > fb->base.height)) return -EINVAL; - /* if we are in atomic just store the info - can't test inside spin lock */ - if (in_atomic()) - store_for_later = true; - - x2 = x + width - 1; - y2 = y + height - 1; - - spin_lock_irqsave(&fb->dirty_lock, flags); - - if (fb->y1 < y) - y = fb->y1; - if (fb->y2 > y2) - y2 = fb->y2; - if (fb->x1 < x) - x = fb->x1; - if (fb->x2 > x2) - x2 = fb->x2; - - if (store_for_later) { - fb->x1 = x; - fb->x2 = x2; - fb->y1 = y; - fb->y2 = y2; - spin_unlock_irqrestore(&fb->dirty_lock, flags); - return 0; - } - - fb->x1 = fb->y1 = INT_MAX; - fb->x2 = fb->y2 = 0; - - spin_unlock_irqrestore(&fb->dirty_lock, flags); start_cycles = get_cycles(); urb = udl_get_urb(dev); @@ -219,14 +122,14 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y, return 0; cmd = urb->transfer_buffer; - for (i = y; i <= y2 ; i++) { + for (i = y; i < height ; i++) { const int line_offset = fb->base.pitches[0] * i; const int byte_offset = line_offset + (x * bpp); const int dev_byte_offset = (fb->base.width * bpp * i) + (x * bpp); if (udl_render_hline(dev, bpp, &urb, (char *) fb->obj->vmapping, &cmd, byte_offset, dev_byte_offset, - (x2 - x + 1) * bpp, + width * bpp, &bytes_identical, &bytes_sent)) goto error; } @@ -283,36 +186,6 @@ static int udl_fb_mmap(struct fb_info *info, struct vm_area_struct *vma) return 0; } -static void udl_fb_fillrect(struct fb_info *info, const struct fb_fillrect *rect) -{ - struct udl_fbdev *ufbdev = info->par; - - sys_fillrect(info, rect); - - udl_handle_damage(&ufbdev->ufb, rect->dx, rect->dy, rect->width, - rect->height); -} - -static void udl_fb_copyarea(struct fb_info *info, const struct fb_copyarea *region) -{ - struct udl_fbdev *ufbdev = info->par; - - sys_copyarea(info, region); - - udl_handle_damage(&ufbdev->ufb, region->dx, region->dy, region->width, - region->height); -} - -static void udl_fb_imageblit(struct fb_info *info, const struct fb_image *image) -{ - struct udl_fbdev *ufbdev = info->par; - - sys_imageblit(info, image); - - udl_handle_damage(&ufbdev->ufb, image->dx, image->dy, image->width, - image->height); -} - /* * It's common for several clients to have framebuffer open simultaneously. * e.g. both fbcon and X. Makes things interesting. @@ -339,7 +212,7 @@ static int udl_fb_open(struct fb_info *info, int user) if (fbdefio) { fbdefio->delay = DL_DEFIO_WRITE_DELAY; - fbdefio->deferred_io = udlfb_dpy_deferred_io; + fbdefio->deferred_io = drm_fb_helper_deferred_io; } info->fbdefio = fbdefio; @@ -379,9 +252,9 @@ static struct fb_ops udlfb_ops = { .owner = THIS_MODULE, .fb_check_var = drm_fb_helper_check_var, .fb_set_par = drm_fb_helper_set_par, - .fb_fillrect = udl_fb_fillrect, - .fb_copyarea = udl_fb_copyarea, - .fb_imageblit = udl_fb_imageblit, + .fb_fillrect = drm_fb_helper_sys_fillrect, + .fb_copyarea = drm_fb_helper_sys_copyarea, + .fb_imageblit = drm_fb_helper_sys_imageblit, .fb_pan_display = drm_fb_helper_pan_display, .fb_blank = drm_fb_helper_blank, .fb_setcmap = drm_fb_helper_setcmap, @@ -458,7 +331,6 @@ udl_framebuffer_init(struct drm_device *dev, { int ret; - spin_lock_init(&ufb->dirty_lock); ufb->obj = obj; drm_helper_mode_fill_fb_struct(&ufb->base, mode_cmd); ret = drm_framebuffer_init(dev, &ufb->base, &udlfb_funcs); -- 2.2.2 From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Date: Sun, 24 Apr 2016 20:49:02 +0000 Subject: [PATCH v2 8/8] drm/udl: Use drm_fb_helper deferred_io support Message-Id: <1461530942-22485-9-git-send-email-noralf@tronnes.org> List-Id: References: <1461530942-22485-1-git-send-email-noralf@tronnes.org> In-Reply-To: <1461530942-22485-1-git-send-email-noralf@tronnes.org> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable To: dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org Cc: tomi.valkeinen@ti.com, laurent.pinchart@ideasonboard.com, linux-kernel@vger.kernel.org Use the fbdev deferred io support in drm_fb_helper. The (struct fb_ops *)->fb_{fillrect,copyarea,imageblit} functions will now schedule a worker instead of being flushed directly like it was previously (recorded when in atomic). This patch has only been compile tested. Signed-off-by: Noralf Tr=C3=B8nnes --- Changes since v1: - No need to enable deferred_io by default since drm_fb_helper uses a dedicated worker for flushing drivers/gpu/drm/udl/udl_drv.h | 2 - drivers/gpu/drm/udl/udl_fb.c | 140 ++------------------------------------= ---- 2 files changed, 6 insertions(+), 136 deletions(-) diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h index 4a064ef..0b03d34 100644 --- a/drivers/gpu/drm/udl/udl_drv.h +++ b/drivers/gpu/drm/udl/udl_drv.h @@ -81,8 +81,6 @@ struct udl_framebuffer { struct drm_framebuffer base; struct udl_gem_object *obj; bool active_16; /* active on the 16-bit channel */ - int x1, y1, x2, y2; /* dirty rect */ - spinlock_t dirty_lock; }; #define to_udl_fb(x) container_of(x, struct udl_framebuffer, base) diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c index a52de2f..4a9b432 100644 --- a/drivers/gpu/drm/udl/udl_fb.c +++ b/drivers/gpu/drm/udl/udl_fb.c @@ -77,68 +77,6 @@ static uint16_t rgb16(uint32_t col) } #endif -/* - * NOTE: fb_defio.c is holding info->fbdefio.mutex - * Touching ANY framebuffer memory that triggers a page fault - * in fb_defio will cause a deadlock, when it also tries to - * grab the same mutex. - */ -static void udlfb_dpy_deferred_io(struct fb_info *info, - struct list_head *pagelist) -{ - struct page *cur; - struct fb_deferred_io *fbdefio =3D info->fbdefio; - struct udl_fbdev *ufbdev =3D info->par; - struct drm_device *dev =3D ufbdev->ufb.base.dev; - struct udl_device *udl =3D dev->dev_private; - struct urb *urb; - char *cmd; - cycles_t start_cycles, end_cycles; - int bytes_sent =3D 0; - int bytes_identical =3D 0; - int bytes_rendered =3D 0; - - if (!fb_defio) - return; - - start_cycles =3D get_cycles(); - - urb =3D udl_get_urb(dev); - if (!urb) - return; - - cmd =3D urb->transfer_buffer; - - /* walk the written page list and render each to device */ - list_for_each_entry(cur, &fbdefio->pagelist, lru) { - - if (udl_render_hline(dev, (ufbdev->ufb.base.bits_per_pixel / 8), - &urb, (char *) info->fix.smem_start, - &cmd, cur->index << PAGE_SHIFT, - cur->index << PAGE_SHIFT, - PAGE_SIZE, &bytes_identical, &bytes_sent)) - goto error; - bytes_rendered +=3D PAGE_SIZE; - } - - if (cmd > (char *) urb->transfer_buffer) { - /* Send partial buffer remaining before exiting */ - int len =3D cmd - (char *) urb->transfer_buffer; - udl_submit_urb(dev, urb, len); - bytes_sent +=3D len; - } else - udl_urb_completion(urb); - -error: - atomic_add(bytes_sent, &udl->bytes_sent); - atomic_add(bytes_identical, &udl->bytes_identical); - atomic_add(bytes_rendered, &udl->bytes_rendered); - end_cycles =3D get_cycles(); - atomic_add(((unsigned int) ((end_cycles - start_cycles) - >> 10)), /* Kcycles */ - &udl->cpu_kcycles_used); -} - int udl_handle_damage(struct udl_framebuffer *fb, int x, int y, int width, int height) { @@ -152,9 +90,6 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x,= int y, struct urb *urb; int aligned_x; int bpp =3D (fb->base.bits_per_pixel / 8); - int x2, y2; - bool store_for_later =3D false; - unsigned long flags; if (!fb->active_16) return 0; @@ -180,38 +115,6 @@ int udl_handle_damage(struct udl_framebuffer *fb, int = x, int y, (y + height > fb->base.height)) return -EINVAL; - /* if we are in atomic just store the info - can't test inside spin lock */ - if (in_atomic()) - store_for_later =3D true; - - x2 =3D x + width - 1; - y2 =3D y + height - 1; - - spin_lock_irqsave(&fb->dirty_lock, flags); - - if (fb->y1 < y) - y =3D fb->y1; - if (fb->y2 > y2) - y2 =3D fb->y2; - if (fb->x1 < x) - x =3D fb->x1; - if (fb->x2 > x2) - x2 =3D fb->x2; - - if (store_for_later) { - fb->x1 =3D x; - fb->x2 =3D x2; - fb->y1 =3D y; - fb->y2 =3D y2; - spin_unlock_irqrestore(&fb->dirty_lock, flags); - return 0; - } - - fb->x1 =3D fb->y1 =3D INT_MAX; - fb->x2 =3D fb->y2 =3D 0; - - spin_unlock_irqrestore(&fb->dirty_lock, flags); start_cycles =3D get_cycles(); urb =3D udl_get_urb(dev); @@ -219,14 +122,14 @@ int udl_handle_damage(struct udl_framebuffer *fb, int= x, int y, return 0; cmd =3D urb->transfer_buffer; - for (i =3D y; i <=3D y2 ; i++) { + for (i =3D y; i < height ; i++) { const int line_offset =3D fb->base.pitches[0] * i; const int byte_offset =3D line_offset + (x * bpp); const int dev_byte_offset =3D (fb->base.width * bpp * i) + (x * bpp); if (udl_render_hline(dev, bpp, &urb, (char *) fb->obj->vmapping, &cmd, byte_offset, dev_byte_offset, - (x2 - x + 1) * bpp, + width * bpp, &bytes_identical, &bytes_sent)) goto error; } @@ -283,36 +186,6 @@ static int udl_fb_mmap(struct fb_info *info, struct vm= _area_struct *vma) return 0; } -static void udl_fb_fillrect(struct fb_info *info, const struct fb_fillrect= *rect) -{ - struct udl_fbdev *ufbdev =3D info->par; - - sys_fillrect(info, rect); - - udl_handle_damage(&ufbdev->ufb, rect->dx, rect->dy, rect->width, - rect->height); -} - -static void udl_fb_copyarea(struct fb_info *info, const struct fb_copyarea= *region) -{ - struct udl_fbdev *ufbdev =3D info->par; - - sys_copyarea(info, region); - - udl_handle_damage(&ufbdev->ufb, region->dx, region->dy, region->width, - region->height); -} - -static void udl_fb_imageblit(struct fb_info *info, const struct fb_image *= image) -{ - struct udl_fbdev *ufbdev =3D info->par; - - sys_imageblit(info, image); - - udl_handle_damage(&ufbdev->ufb, image->dx, image->dy, image->width, - image->height); -} - /* * It's common for several clients to have framebuffer open simultaneously. * e.g. both fbcon and X. Makes things interesting. @@ -339,7 +212,7 @@ static int udl_fb_open(struct fb_info *info, int user) if (fbdefio) { fbdefio->delay =3D DL_DEFIO_WRITE_DELAY; - fbdefio->deferred_io =3D udlfb_dpy_deferred_io; + fbdefio->deferred_io =3D drm_fb_helper_deferred_io; } info->fbdefio =3D fbdefio; @@ -379,9 +252,9 @@ static struct fb_ops udlfb_ops =3D { .owner =3D THIS_MODULE, .fb_check_var =3D drm_fb_helper_check_var, .fb_set_par =3D drm_fb_helper_set_par, - .fb_fillrect =3D udl_fb_fillrect, - .fb_copyarea =3D udl_fb_copyarea, - .fb_imageblit =3D udl_fb_imageblit, + .fb_fillrect =3D drm_fb_helper_sys_fillrect, + .fb_copyarea =3D drm_fb_helper_sys_copyarea, + .fb_imageblit =3D drm_fb_helper_sys_imageblit, .fb_pan_display =3D drm_fb_helper_pan_display, .fb_blank =3D drm_fb_helper_blank, .fb_setcmap =3D drm_fb_helper_setcmap, @@ -458,7 +331,6 @@ udl_framebuffer_init(struct drm_device *dev, { int ret; - spin_lock_init(&ufb->dirty_lock); ufb->obj =3D obj; drm_helper_mode_fill_fb_struct(&ufb->base, mode_cmd); ret =3D drm_framebuffer_init(dev, &ufb->base, &udlfb_funcs); -- 2.2.2 From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Subject: [PATCH v2 8/8] drm/udl: Use drm_fb_helper deferred_io support Date: Sun, 24 Apr 2016 22:49:02 +0200 Message-ID: <1461530942-22485-9-git-send-email-noralf@tronnes.org> References: <1461530942-22485-1-git-send-email-noralf@tronnes.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from asav21.altibox.net (asav21.altibox.net [109.247.116.8]) by gabe.freedesktop.org (Postfix) with ESMTPS id 1AF356E411 for ; Sun, 24 Apr 2016 20:49:40 +0000 (UTC) In-Reply-To: <1461530942-22485-1-git-send-email-noralf@tronnes.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, linux-fbdev@vger.kernel.org Cc: tomi.valkeinen@ti.com, laurent.pinchart@ideasonboard.com, linux-kernel@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org VXNlIHRoZSBmYmRldiBkZWZlcnJlZCBpbyBzdXBwb3J0IGluIGRybV9mYl9oZWxwZXIuClRoZSAo c3RydWN0IGZiX29wcyAqKS0+ZmJfe2ZpbGxyZWN0LGNvcHlhcmVhLGltYWdlYmxpdH0gZnVuY3Rp b25zIHdpbGwKbm93IHNjaGVkdWxlIGEgd29ya2VyIGluc3RlYWQgb2YgYmVpbmcgZmx1c2hlZCBk aXJlY3RseSBsaWtlIGl0IHdhcwpwcmV2aW91c2x5IChyZWNvcmRlZCB3aGVuIGluIGF0b21pYyku CgpUaGlzIHBhdGNoIGhhcyBvbmx5IGJlZW4gY29tcGlsZSB0ZXN0ZWQuCgpTaWduZWQtb2ZmLWJ5 OiBOb3JhbGYgVHLDuG5uZXMgPG5vcmFsZkB0cm9ubmVzLm9yZz4KLS0tCgpDaGFuZ2VzIHNpbmNl IHYxOgotIE5vIG5lZWQgdG8gZW5hYmxlIGRlZmVycmVkX2lvIGJ5IGRlZmF1bHQgc2luY2UgZHJt X2ZiX2hlbHBlciB1c2VzCiAgYSBkZWRpY2F0ZWQgd29ya2VyIGZvciBmbHVzaGluZwoKIGRyaXZl cnMvZ3B1L2RybS91ZGwvdWRsX2Rydi5oIHwgICAyIC0KIGRyaXZlcnMvZ3B1L2RybS91ZGwvdWRs X2ZiLmMgIHwgMTQwICsrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQog MiBmaWxlcyBjaGFuZ2VkLCA2IGluc2VydGlvbnMoKyksIDEzNiBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS91 ZGwvdWRsX2Rydi5oCmluZGV4IDRhMDY0ZWYuLjBiMDNkMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv Z3B1L2RybS91ZGwvdWRsX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS91ZGwvdWRsX2Rydi5o CkBAIC04MSw4ICs4MSw2IEBAIHN0cnVjdCB1ZGxfZnJhbWVidWZmZXIgewogCXN0cnVjdCBkcm1f ZnJhbWVidWZmZXIgYmFzZTsKIAlzdHJ1Y3QgdWRsX2dlbV9vYmplY3QgKm9iajsKIAlib29sIGFj dGl2ZV8xNjsgLyogYWN0aXZlIG9uIHRoZSAxNi1iaXQgY2hhbm5lbCAqLwotCWludCB4MSwgeTEs IHgyLCB5MjsgLyogZGlydHkgcmVjdCAqLwotCXNwaW5sb2NrX3QgZGlydHlfbG9jazsKIH07Cgog I2RlZmluZSB0b191ZGxfZmIoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCB1ZGxfZnJhbWVidWZm ZXIsIGJhc2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9mYi5jIGIvZHJp dmVycy9ncHUvZHJtL3VkbC91ZGxfZmIuYwppbmRleCBhNTJkZTJmLi40YTliNDMyIDEwMDY0NAot LS0gYS9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS91 ZGwvdWRsX2ZiLmMKQEAgLTc3LDY4ICs3Nyw2IEBAIHN0YXRpYyB1aW50MTZfdCByZ2IxNih1aW50 MzJfdCBjb2wpCiB9CiAjZW5kaWYKCi0vKgotICogTk9URTogZmJfZGVmaW8uYyBpcyBob2xkaW5n IGluZm8tPmZiZGVmaW8ubXV0ZXgKLSAqICAgVG91Y2hpbmcgQU5ZIGZyYW1lYnVmZmVyIG1lbW9y eSB0aGF0IHRyaWdnZXJzIGEgcGFnZSBmYXVsdAotICogICBpbiBmYl9kZWZpbyB3aWxsIGNhdXNl IGEgZGVhZGxvY2ssIHdoZW4gaXQgYWxzbyB0cmllcyB0bwotICogICBncmFiIHRoZSBzYW1lIG11 dGV4LgotICovCi1zdGF0aWMgdm9pZCB1ZGxmYl9kcHlfZGVmZXJyZWRfaW8oc3RydWN0IGZiX2lu Zm8gKmluZm8sCi0JCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlbGlzdCkKLXsKLQlzdHJ1Y3Qg cGFnZSAqY3VyOwotCXN0cnVjdCBmYl9kZWZlcnJlZF9pbyAqZmJkZWZpbyA9IGluZm8tPmZiZGVm aW87Ci0Jc3RydWN0IHVkbF9mYmRldiAqdWZiZGV2ID0gaW5mby0+cGFyOwotCXN0cnVjdCBkcm1f ZGV2aWNlICpkZXYgPSB1ZmJkZXYtPnVmYi5iYXNlLmRldjsKLQlzdHJ1Y3QgdWRsX2RldmljZSAq dWRsID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgdXJiICp1cmI7Ci0JY2hhciAqY21kOwot CWN5Y2xlc190IHN0YXJ0X2N5Y2xlcywgZW5kX2N5Y2xlczsKLQlpbnQgYnl0ZXNfc2VudCA9IDA7 Ci0JaW50IGJ5dGVzX2lkZW50aWNhbCA9IDA7Ci0JaW50IGJ5dGVzX3JlbmRlcmVkID0gMDsKLQot CWlmICghZmJfZGVmaW8pCi0JCXJldHVybjsKLQotCXN0YXJ0X2N5Y2xlcyA9IGdldF9jeWNsZXMo KTsKLQotCXVyYiA9IHVkbF9nZXRfdXJiKGRldik7Ci0JaWYgKCF1cmIpCi0JCXJldHVybjsKLQot CWNtZCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwotCi0JLyogd2FsayB0aGUgd3JpdHRlbiBwYWdl IGxpc3QgYW5kIHJlbmRlciBlYWNoIHRvIGRldmljZSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnko Y3VyLCAmZmJkZWZpby0+cGFnZWxpc3QsIGxydSkgewotCi0JCWlmICh1ZGxfcmVuZGVyX2hsaW5l KGRldiwgKHVmYmRldi0+dWZiLmJhc2UuYml0c19wZXJfcGl4ZWwgLyA4KSwKLQkJCQkgICAgICZ1 cmIsIChjaGFyICopIGluZm8tPmZpeC5zbWVtX3N0YXJ0LAotCQkJCSAgICAgJmNtZCwgY3VyLT5p bmRleCA8PCBQQUdFX1NISUZULAotCQkJCSAgICAgY3VyLT5pbmRleCA8PCBQQUdFX1NISUZULAot CQkJCSAgICAgUEFHRV9TSVpFLCAmYnl0ZXNfaWRlbnRpY2FsLCAmYnl0ZXNfc2VudCkpCi0JCQln b3RvIGVycm9yOwotCQlieXRlc19yZW5kZXJlZCArPSBQQUdFX1NJWkU7Ci0JfQotCi0JaWYgKGNt ZCA+IChjaGFyICopIHVyYi0+dHJhbnNmZXJfYnVmZmVyKSB7Ci0JCS8qIFNlbmQgcGFydGlhbCBi dWZmZXIgcmVtYWluaW5nIGJlZm9yZSBleGl0aW5nICovCi0JCWludCBsZW4gPSBjbWQgLSAoY2hh ciAqKSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQkJdWRsX3N1Ym1pdF91cmIoZGV2LCB1cmIsIGxl bik7Ci0JCWJ5dGVzX3NlbnQgKz0gbGVuOwotCX0gZWxzZQotCQl1ZGxfdXJiX2NvbXBsZXRpb24o dXJiKTsKLQotZXJyb3I6Ci0JYXRvbWljX2FkZChieXRlc19zZW50LCAmdWRsLT5ieXRlc19zZW50 KTsKLQlhdG9taWNfYWRkKGJ5dGVzX2lkZW50aWNhbCwgJnVkbC0+Ynl0ZXNfaWRlbnRpY2FsKTsK LQlhdG9taWNfYWRkKGJ5dGVzX3JlbmRlcmVkLCAmdWRsLT5ieXRlc19yZW5kZXJlZCk7Ci0JZW5k X2N5Y2xlcyA9IGdldF9jeWNsZXMoKTsKLQlhdG9taWNfYWRkKCgodW5zaWduZWQgaW50KSAoKGVu ZF9jeWNsZXMgLSBzdGFydF9jeWNsZXMpCi0JCSAgICA+PiAxMCkpLCAvKiBLY3ljbGVzICovCi0J CSAgICZ1ZGwtPmNwdV9rY3ljbGVzX3VzZWQpOwotfQotCiBpbnQgdWRsX2hhbmRsZV9kYW1hZ2Uo c3RydWN0IHVkbF9mcmFtZWJ1ZmZlciAqZmIsIGludCB4LCBpbnQgeSwKIAkJICAgICAgaW50IHdp ZHRoLCBpbnQgaGVpZ2h0KQogewpAQCAtMTUyLDkgKzkwLDYgQEAgaW50IHVkbF9oYW5kbGVfZGFt YWdlKHN0cnVjdCB1ZGxfZnJhbWVidWZmZXIgKmZiLCBpbnQgeCwgaW50IHksCiAJc3RydWN0IHVy YiAqdXJiOwogCWludCBhbGlnbmVkX3g7CiAJaW50IGJwcCA9IChmYi0+YmFzZS5iaXRzX3Blcl9w aXhlbCAvIDgpOwotCWludCB4MiwgeTI7Ci0JYm9vbCBzdG9yZV9mb3JfbGF0ZXIgPSBmYWxzZTsK LQl1bnNpZ25lZCBsb25nIGZsYWdzOwoKIAlpZiAoIWZiLT5hY3RpdmVfMTYpCiAJCXJldHVybiAw OwpAQCAtMTgwLDM4ICsxMTUsNiBAQCBpbnQgdWRsX2hhbmRsZV9kYW1hZ2Uoc3RydWN0IHVkbF9m cmFtZWJ1ZmZlciAqZmIsIGludCB4LCBpbnQgeSwKIAkgICAgKHkgKyBoZWlnaHQgPiBmYi0+YmFz ZS5oZWlnaHQpKQogCQlyZXR1cm4gLUVJTlZBTDsKCi0JLyogaWYgd2UgYXJlIGluIGF0b21pYyBq dXN0IHN0b3JlIHRoZSBpbmZvCi0JICAgY2FuJ3QgdGVzdCBpbnNpZGUgc3BpbiBsb2NrICovCi0J aWYgKGluX2F0b21pYygpKQotCQlzdG9yZV9mb3JfbGF0ZXIgPSB0cnVlOwotCi0JeDIgPSB4ICsg d2lkdGggLSAxOwotCXkyID0geSArIGhlaWdodCAtIDE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgm ZmItPmRpcnR5X2xvY2ssIGZsYWdzKTsKLQotCWlmIChmYi0+eTEgPCB5KQotCQl5ID0gZmItPnkx OwotCWlmIChmYi0+eTIgPiB5MikKLQkJeTIgPSBmYi0+eTI7Ci0JaWYgKGZiLT54MSA8IHgpCi0J CXggPSBmYi0+eDE7Ci0JaWYgKGZiLT54MiA+IHgyKQotCQl4MiA9IGZiLT54MjsKLQotCWlmIChz dG9yZV9mb3JfbGF0ZXIpIHsKLQkJZmItPngxID0geDsKLQkJZmItPngyID0geDI7Ci0JCWZiLT55 MSA9IHk7Ci0JCWZiLT55MiA9IHkyOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmYi0+ZGly dHlfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlmYi0+eDEgPSBmYi0+eTEgPSBJ TlRfTUFYOwotCWZiLT54MiA9IGZiLT55MiA9IDA7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZmYi0+ZGlydHlfbG9jaywgZmxhZ3MpOwogCXN0YXJ0X2N5Y2xlcyA9IGdldF9jeWNsZXMoKTsK CiAJdXJiID0gdWRsX2dldF91cmIoZGV2KTsKQEAgLTIxOSwxNCArMTIyLDE0IEBAIGludCB1ZGxf aGFuZGxlX2RhbWFnZShzdHJ1Y3QgdWRsX2ZyYW1lYnVmZmVyICpmYiwgaW50IHgsIGludCB5LAog CQlyZXR1cm4gMDsKIAljbWQgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKCi0JZm9yIChpID0geTsg aSA8PSB5MiA7IGkrKykgeworCWZvciAoaSA9IHk7IGkgPCBoZWlnaHQgOyBpKyspIHsKIAkJY29u c3QgaW50IGxpbmVfb2Zmc2V0ID0gZmItPmJhc2UucGl0Y2hlc1swXSAqIGk7CiAJCWNvbnN0IGlu dCBieXRlX29mZnNldCA9IGxpbmVfb2Zmc2V0ICsgKHggKiBicHApOwogCQljb25zdCBpbnQgZGV2 X2J5dGVfb2Zmc2V0ID0gKGZiLT5iYXNlLndpZHRoICogYnBwICogaSkgKyAoeCAqIGJwcCk7CiAJ CWlmICh1ZGxfcmVuZGVyX2hsaW5lKGRldiwgYnBwLCAmdXJiLAogCQkJCSAgICAgKGNoYXIgKikg ZmItPm9iai0+dm1hcHBpbmcsCiAJCQkJICAgICAmY21kLCBieXRlX29mZnNldCwgZGV2X2J5dGVf b2Zmc2V0LAotCQkJCSAgICAgKHgyIC0geCArIDEpICogYnBwLAorCQkJCSAgICAgd2lkdGggKiBi cHAsCiAJCQkJICAgICAmYnl0ZXNfaWRlbnRpY2FsLCAmYnl0ZXNfc2VudCkpCiAJCQlnb3RvIGVy cm9yOwogCX0KQEAgLTI4MywzNiArMTg2LDYgQEAgc3RhdGljIGludCB1ZGxfZmJfbW1hcChzdHJ1 Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiAJcmV0dXJuIDA7 CiB9Cgotc3RhdGljIHZvaWQgdWRsX2ZiX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBj b25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpCi17Ci0Jc3RydWN0IHVkbF9mYmRldiAqdWZi ZGV2ID0gaW5mby0+cGFyOwotCi0Jc3lzX2ZpbGxyZWN0KGluZm8sIHJlY3QpOwotCi0JdWRsX2hh bmRsZV9kYW1hZ2UoJnVmYmRldi0+dWZiLCByZWN0LT5keCwgcmVjdC0+ZHksIHJlY3QtPndpZHRo LAotCQkJICByZWN0LT5oZWlnaHQpOwotfQotCi1zdGF0aWMgdm9pZCB1ZGxfZmJfY29weWFyZWEo c3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqcmVnaW9uKQot ewotCXN0cnVjdCB1ZGxfZmJkZXYgKnVmYmRldiA9IGluZm8tPnBhcjsKLQotCXN5c19jb3B5YXJl YShpbmZvLCByZWdpb24pOwotCi0JdWRsX2hhbmRsZV9kYW1hZ2UoJnVmYmRldi0+dWZiLCByZWdp b24tPmR4LCByZWdpb24tPmR5LCByZWdpb24tPndpZHRoLAotCQkJICByZWdpb24tPmhlaWdodCk7 Ci19Ci0KLXN0YXRpYyB2b2lkIHVkbF9mYl9pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8s IGNvbnN0IHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UpCi17Ci0Jc3RydWN0IHVkbF9mYmRldiAqdWZi ZGV2ID0gaW5mby0+cGFyOwotCi0Jc3lzX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7Ci0KLQl1ZGxf aGFuZGxlX2RhbWFnZSgmdWZiZGV2LT51ZmIsIGltYWdlLT5keCwgaW1hZ2UtPmR5LCBpbWFnZS0+ d2lkdGgsCi0JCQkgIGltYWdlLT5oZWlnaHQpOwotfQotCiAvKgogICogSXQncyBjb21tb24gZm9y IHNldmVyYWwgY2xpZW50cyB0byBoYXZlIGZyYW1lYnVmZmVyIG9wZW4gc2ltdWx0YW5lb3VzbHku CiAgKiBlLmcuIGJvdGggZmJjb24gYW5kIFguIE1ha2VzIHRoaW5ncyBpbnRlcmVzdGluZy4KQEAg LTMzOSw3ICsyMTIsNyBAQCBzdGF0aWMgaW50IHVkbF9mYl9vcGVuKHN0cnVjdCBmYl9pbmZvICpp bmZvLCBpbnQgdXNlcikKCiAJCWlmIChmYmRlZmlvKSB7CiAJCQlmYmRlZmlvLT5kZWxheSA9IERM X0RFRklPX1dSSVRFX0RFTEFZOwotCQkJZmJkZWZpby0+ZGVmZXJyZWRfaW8gPSB1ZGxmYl9kcHlf ZGVmZXJyZWRfaW87CisJCQlmYmRlZmlvLT5kZWZlcnJlZF9pbyA9IGRybV9mYl9oZWxwZXJfZGVm ZXJyZWRfaW87CiAJCX0KCiAJCWluZm8tPmZiZGVmaW8gPSBmYmRlZmlvOwpAQCAtMzc5LDkgKzI1 Miw5IEBAIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHVkbGZiX29wcyA9IHsKIAkub3duZXIgPSBUSElT X01PRFVMRSwKIAkuZmJfY2hlY2tfdmFyID0gZHJtX2ZiX2hlbHBlcl9jaGVja192YXIsCiAJLmZi X3NldF9wYXIgPSBkcm1fZmJfaGVscGVyX3NldF9wYXIsCi0JLmZiX2ZpbGxyZWN0ID0gdWRsX2Zi X2ZpbGxyZWN0LAotCS5mYl9jb3B5YXJlYSA9IHVkbF9mYl9jb3B5YXJlYSwKLQkuZmJfaW1hZ2Vi bGl0ID0gdWRsX2ZiX2ltYWdlYmxpdCwKKwkuZmJfZmlsbHJlY3QgPSBkcm1fZmJfaGVscGVyX3N5 c19maWxscmVjdCwKKwkuZmJfY29weWFyZWEgPSBkcm1fZmJfaGVscGVyX3N5c19jb3B5YXJlYSwK KwkuZmJfaW1hZ2VibGl0ID0gZHJtX2ZiX2hlbHBlcl9zeXNfaW1hZ2VibGl0LAogCS5mYl9wYW5f ZGlzcGxheSA9IGRybV9mYl9oZWxwZXJfcGFuX2Rpc3BsYXksCiAJLmZiX2JsYW5rID0gZHJtX2Zi X2hlbHBlcl9ibGFuaywKIAkuZmJfc2V0Y21hcCA9IGRybV9mYl9oZWxwZXJfc2V0Y21hcCwKQEAg LTQ1OCw3ICszMzEsNiBAQCB1ZGxfZnJhbWVidWZmZXJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2LAogewogCWludCByZXQ7CgotCXNwaW5fbG9ja19pbml0KCZ1ZmItPmRpcnR5X2xvY2spOwog CXVmYi0+b2JqID0gb2JqOwogCWRybV9oZWxwZXJfbW9kZV9maWxsX2ZiX3N0cnVjdCgmdWZiLT5i YXNlLCBtb2RlX2NtZCk7CiAJcmV0ID0gZHJtX2ZyYW1lYnVmZmVyX2luaXQoZGV2LCAmdWZiLT5i YXNlLCAmdWRsZmJfZnVuY3MpOwotLQoyLjIuMgoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlz dHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4v bGlzdGluZm8vZHJpLWRldmVsCg==