From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752229AbcDTR7L (ORCPT ); Wed, 20 Apr 2016 13:59:11 -0400 Received: from mail-wm0-f68.google.com ([74.125.82.68]:35405 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751302AbcDTR7J (ORCPT ); Wed, 20 Apr 2016 13:59:09 -0400 Date: Wed, 20 Apr 2016 19:59:03 +0200 From: Daniel Vetter To: Noralf =?iso-8859-1?Q?Tr=F8nnes?= Cc: dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org, daniel@ffwll.ch, laurent.pinchart@ideasonboard.com, tomi.valkeinen@ti.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH 8/8] drm/udl: Use drm_fb_helper deferred_io support Message-ID: <20160420175903.GS2510@phenom.ffwll.local> Mail-Followup-To: Noralf =?iso-8859-1?Q?Tr=F8nnes?= , dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org, laurent.pinchart@ideasonboard.com, tomi.valkeinen@ti.com, linux-kernel@vger.kernel.org References: <1461165929-11344-1-git-send-email-noralf@tronnes.org> <1461165929-11344-9-git-send-email-noralf@tronnes.org> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1461165929-11344-9-git-send-email-noralf@tronnes.org> X-Operating-System: Linux phenom 4.4.0-1-amd64 User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Apr 20, 2016 at 05:25:29PM +0200, Noralf Trønnes wrote: > Use the fbdev deferred io support in drm_fb_helper. > The (struct fb_ops *)->fb_{fillrect,copyarea,imageblit} functions will > now be deferred in the same way that mmap damage is, instead of being > flushed directly. > The deferred mmap functionality is kept disabled by default, because of the > list corruption problems mentioned in commit 677d23b70bf9 > ("drm/udl: disable fb_defio by default"). > This patch has only been compile tested. > > Signed-off-by: Noralf Trønnes > --- > drivers/gpu/drm/udl/udl_drv.h | 2 - > drivers/gpu/drm/udl/udl_fb.c | 152 ++++-------------------------------------- > 2 files changed, 12 insertions(+), 142 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..b44d4a7 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. > @@ -330,20 +203,20 @@ static int udl_fb_open(struct fb_info *info, int user) > > ufbdev->fb_count++; > > - if (fb_defio && (info->fbdefio == NULL)) { > - /* enable defio at last moment if not disabled by client */ > + if (!info->fbdefio) { > + /* enable defio at last moment */ > > struct fb_deferred_io *fbdefio; > > fbdefio = kmalloc(sizeof(struct fb_deferred_io), GFP_KERNEL); > - > if (fbdefio) { > fbdefio->delay = DL_DEFIO_WRITE_DELAY; > - fbdefio->deferred_io = udlfb_dpy_deferred_io; > + fbdefio->deferred_io = drm_fb_helper_deferred_io; Why all these changes here? I figured just exchanging the deferred_io pointer should be all that's really needed in the setup code? -Daniel > + info->fbdefio = fbdefio; > + fb_deferred_io_init(info); > + if (!fb_defio) /* see commit 677d23b */ > + info->fbops->fb_mmap = udl_fb_mmap; > } > - > - info->fbdefio = fbdefio; > - fb_deferred_io_init(info); > } > > pr_notice("open /dev/fb%d user=%d fb_info=%p count=%d\n", > @@ -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 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Date: Wed, 20 Apr 2016 17:59:03 +0000 Subject: Re: [PATCH 8/8] drm/udl: Use drm_fb_helper deferred_io support Message-Id: <20160420175903.GS2510@phenom.ffwll.local> List-Id: References: <1461165929-11344-1-git-send-email-noralf@tronnes.org> <1461165929-11344-9-git-send-email-noralf@tronnes.org> In-Reply-To: <1461165929-11344-9-git-send-email-noralf@tronnes.org> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable To: Noralf =?iso-8859-1?Q?Tr=F8nnes?= Cc: linux-fbdev@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, tomi.valkeinen@ti.com, laurent.pinchart@ideasonboard.com On Wed, Apr 20, 2016 at 05:25:29PM +0200, Noralf Tr=F8nnes wrote: > Use the fbdev deferred io support in drm_fb_helper. > The (struct fb_ops *)->fb_{fillrect,copyarea,imageblit} functions will > now be deferred in the same way that mmap damage is, instead of being > flushed directly. > The deferred mmap functionality is kept disabled by default, because of t= he > list corruption problems mentioned in commit 677d23b70bf9 > ("drm/udl: disable fb_defio by default"). > This patch has only been compile tested. >=20 > Signed-off-by: Noralf Tr=F8nnes > --- > drivers/gpu/drm/udl/udl_drv.h | 2 - > drivers/gpu/drm/udl/udl_fb.c | 152 ++++--------------------------------= ------ > 2 files changed, 12 insertions(+), 142 deletions(-) >=20 > 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; > }; > =20 > #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..b44d4a7 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 > =20 > -/* > - * 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; > =20 > if (!fb->active_16) > return 0; > @@ -180,38 +115,6 @@ int udl_handle_damage(struct udl_framebuffer *fb, in= t x, int y, > (y + height > fb->base.height)) > return -EINVAL; > =20 > - /* 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(); > =20 > urb =3D udl_get_urb(dev); > @@ -219,14 +122,14 @@ int udl_handle_damage(struct udl_framebuffer *fb, i= nt x, int y, > return 0; > cmd =3D urb->transfer_buffer; > =20 > - 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; > } > =20 > -static void udl_fb_fillrect(struct fb_info *info, const struct fb_fillre= ct *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_copyar= ea *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 simultaneous= ly. > * e.g. both fbcon and X. Makes things interesting. > @@ -330,20 +203,20 @@ static int udl_fb_open(struct fb_info *info, int us= er) > =20 > ufbdev->fb_count++; > =20 > - if (fb_defio && (info->fbdefio =3D NULL)) { > - /* enable defio at last moment if not disabled by client */ > + if (!info->fbdefio) { > + /* enable defio at last moment */ > =20 > struct fb_deferred_io *fbdefio; > =20 > fbdefio =3D kmalloc(sizeof(struct fb_deferred_io), GFP_KERNEL); > - > 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; Why all these changes here? I figured just exchanging the deferred_io pointer should be all that's really needed in the setup code? -Daniel > + info->fbdefio =3D fbdefio; > + fb_deferred_io_init(info); > + if (!fb_defio) /* see commit 677d23b */ > + info->fbops->fb_mmap =3D udl_fb_mmap; > } > - > - info->fbdefio =3D fbdefio; > - fb_deferred_io_init(info); > } > =20 > pr_notice("open /dev/fb%d user=3D%d fb_info=3D%p count=3D%d\n", > @@ -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; > =20 > - 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); > --=20 > 2.2.2 >=20 --=20 Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH 8/8] drm/udl: Use drm_fb_helper deferred_io support Date: Wed, 20 Apr 2016 19:59:03 +0200 Message-ID: <20160420175903.GS2510@phenom.ffwll.local> References: <1461165929-11344-1-git-send-email-noralf@tronnes.org> <1461165929-11344-9-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 mail-wm0-x241.google.com (mail-wm0-x241.google.com [IPv6:2a00:1450:400c:c09::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id 502DE6E9AE for ; Wed, 20 Apr 2016 17:59:09 +0000 (UTC) Received: by mail-wm0-x241.google.com with SMTP id r12so4875512wme.0 for ; Wed, 20 Apr 2016 10:59:09 -0700 (PDT) Content-Disposition: inline In-Reply-To: <1461165929-11344-9-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: Noralf =?iso-8859-1?Q?Tr=F8nnes?= Cc: linux-fbdev@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, tomi.valkeinen@ti.com, laurent.pinchart@ideasonboard.com List-Id: dri-devel@lists.freedesktop.org T24gV2VkLCBBcHIgMjAsIDIwMTYgYXQgMDU6MjU6MjlQTSArMDIwMCwgTm9yYWxmIFRyw7hubmVz IHdyb3RlOgo+IFVzZSB0aGUgZmJkZXYgZGVmZXJyZWQgaW8gc3VwcG9ydCBpbiBkcm1fZmJfaGVs cGVyLgo+IFRoZSAoc3RydWN0IGZiX29wcyAqKS0+ZmJfe2ZpbGxyZWN0LGNvcHlhcmVhLGltYWdl YmxpdH0gZnVuY3Rpb25zIHdpbGwKPiBub3cgYmUgZGVmZXJyZWQgaW4gdGhlIHNhbWUgd2F5IHRo YXQgbW1hcCBkYW1hZ2UgaXMsIGluc3RlYWQgb2YgYmVpbmcKPiBmbHVzaGVkIGRpcmVjdGx5Lgo+ IFRoZSBkZWZlcnJlZCBtbWFwIGZ1bmN0aW9uYWxpdHkgaXMga2VwdCBkaXNhYmxlZCBieSBkZWZh dWx0LCBiZWNhdXNlIG9mIHRoZQo+IGxpc3QgY29ycnVwdGlvbiBwcm9ibGVtcyBtZW50aW9uZWQg aW4gY29tbWl0IDY3N2QyM2I3MGJmOQo+ICgiZHJtL3VkbDogZGlzYWJsZSBmYl9kZWZpbyBieSBk ZWZhdWx0IikuCj4gVGhpcyBwYXRjaCBoYXMgb25seSBiZWVuIGNvbXBpbGUgdGVzdGVkLgo+IAo+ IFNpZ25lZC1vZmYtYnk6IE5vcmFsZiBUcsO4bm5lcyA8bm9yYWxmQHRyb25uZXMub3JnPgo+IC0t LQo+ICBkcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9kcnYuaCB8ICAgMiAtCj4gIGRyaXZlcnMvZ3B1 L2RybS91ZGwvdWRsX2ZiLmMgIHwgMTUyICsrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQo+ICAyIGZpbGVzIGNoYW5nZWQsIDEyIGluc2VydGlvbnMoKyksIDE0MiBkZWxl dGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxfZHJ2Lmgg Yi9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9kcnYuaAo+IGluZGV4IDRhMDY0ZWYuLjBiMDNkMzQg MTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxfZHJ2LmgKPiArKysgYi9kcml2 ZXJzL2dwdS9kcm0vdWRsL3VkbF9kcnYuaAo+IEBAIC04MSw4ICs4MSw2IEBAIHN0cnVjdCB1ZGxf ZnJhbWVidWZmZXIgewo+ICAJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciBiYXNlOwo+ICAJc3RydWN0 IHVkbF9nZW1fb2JqZWN0ICpvYmo7Cj4gIAlib29sIGFjdGl2ZV8xNjsgLyogYWN0aXZlIG9uIHRo ZSAxNi1iaXQgY2hhbm5lbCAqLwo+IC0JaW50IHgxLCB5MSwgeDIsIHkyOyAvKiBkaXJ0eSByZWN0 ICovCj4gLQlzcGlubG9ja190IGRpcnR5X2xvY2s7Cj4gIH07Cj4gIAo+ICAjZGVmaW5lIHRvX3Vk bF9mYih4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IHVkbF9mcmFtZWJ1ZmZlciwgYmFzZSkKPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxfZmIuYyBiL2RyaXZlcnMvZ3B1L2Ry bS91ZGwvdWRsX2ZiLmMKPiBpbmRleCBhNTJkZTJmLi5iNDRkNGE3IDEwMDY0NAo+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS91ZGwvdWRsX2ZiLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vdWRsL3Vk bF9mYi5jCj4gQEAgLTc3LDY4ICs3Nyw2IEBAIHN0YXRpYyB1aW50MTZfdCByZ2IxNih1aW50MzJf dCBjb2wpCj4gIH0KPiAgI2VuZGlmCj4gIAo+IC0vKgo+IC0gKiBOT1RFOiBmYl9kZWZpby5jIGlz IGhvbGRpbmcgaW5mby0+ZmJkZWZpby5tdXRleAo+IC0gKiAgIFRvdWNoaW5nIEFOWSBmcmFtZWJ1 ZmZlciBtZW1vcnkgdGhhdCB0cmlnZ2VycyBhIHBhZ2UgZmF1bHQKPiAtICogICBpbiBmYl9kZWZp byB3aWxsIGNhdXNlIGEgZGVhZGxvY2ssIHdoZW4gaXQgYWxzbyB0cmllcyB0bwo+IC0gKiAgIGdy YWIgdGhlIHNhbWUgbXV0ZXguCj4gLSAqLwo+IC1zdGF0aWMgdm9pZCB1ZGxmYl9kcHlfZGVmZXJy ZWRfaW8oc3RydWN0IGZiX2luZm8gKmluZm8sCj4gLQkJCQkgIHN0cnVjdCBsaXN0X2hlYWQgKnBh Z2VsaXN0KQo+IC17Cj4gLQlzdHJ1Y3QgcGFnZSAqY3VyOwo+IC0Jc3RydWN0IGZiX2RlZmVycmVk X2lvICpmYmRlZmlvID0gaW5mby0+ZmJkZWZpbzsKPiAtCXN0cnVjdCB1ZGxfZmJkZXYgKnVmYmRl diA9IGluZm8tPnBhcjsKPiAtCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSB1ZmJkZXYtPnVmYi5i YXNlLmRldjsKPiAtCXN0cnVjdCB1ZGxfZGV2aWNlICp1ZGwgPSBkZXYtPmRldl9wcml2YXRlOwo+ IC0Jc3RydWN0IHVyYiAqdXJiOwo+IC0JY2hhciAqY21kOwo+IC0JY3ljbGVzX3Qgc3RhcnRfY3lj bGVzLCBlbmRfY3ljbGVzOwo+IC0JaW50IGJ5dGVzX3NlbnQgPSAwOwo+IC0JaW50IGJ5dGVzX2lk ZW50aWNhbCA9IDA7Cj4gLQlpbnQgYnl0ZXNfcmVuZGVyZWQgPSAwOwo+IC0KPiAtCWlmICghZmJf ZGVmaW8pCj4gLQkJcmV0dXJuOwo+IC0KPiAtCXN0YXJ0X2N5Y2xlcyA9IGdldF9jeWNsZXMoKTsK PiAtCj4gLQl1cmIgPSB1ZGxfZ2V0X3VyYihkZXYpOwo+IC0JaWYgKCF1cmIpCj4gLQkJcmV0dXJu Owo+IC0KPiAtCWNtZCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwo+IC0KPiAtCS8qIHdhbGsgdGhl IHdyaXR0ZW4gcGFnZSBsaXN0IGFuZCByZW5kZXIgZWFjaCB0byBkZXZpY2UgKi8KPiAtCWxpc3Rf Zm9yX2VhY2hfZW50cnkoY3VyLCAmZmJkZWZpby0+cGFnZWxpc3QsIGxydSkgewo+IC0KPiAtCQlp ZiAodWRsX3JlbmRlcl9obGluZShkZXYsICh1ZmJkZXYtPnVmYi5iYXNlLmJpdHNfcGVyX3BpeGVs IC8gOCksCj4gLQkJCQkgICAgICZ1cmIsIChjaGFyICopIGluZm8tPmZpeC5zbWVtX3N0YXJ0LAo+ IC0JCQkJICAgICAmY21kLCBjdXItPmluZGV4IDw8IFBBR0VfU0hJRlQsCj4gLQkJCQkgICAgIGN1 ci0+aW5kZXggPDwgUEFHRV9TSElGVCwKPiAtCQkJCSAgICAgUEFHRV9TSVpFLCAmYnl0ZXNfaWRl bnRpY2FsLCAmYnl0ZXNfc2VudCkpCj4gLQkJCWdvdG8gZXJyb3I7Cj4gLQkJYnl0ZXNfcmVuZGVy ZWQgKz0gUEFHRV9TSVpFOwo+IC0JfQo+IC0KPiAtCWlmIChjbWQgPiAoY2hhciAqKSB1cmItPnRy YW5zZmVyX2J1ZmZlcikgewo+IC0JCS8qIFNlbmQgcGFydGlhbCBidWZmZXIgcmVtYWluaW5nIGJl Zm9yZSBleGl0aW5nICovCj4gLQkJaW50IGxlbiA9IGNtZCAtIChjaGFyICopIHVyYi0+dHJhbnNm ZXJfYnVmZmVyOwo+IC0JCXVkbF9zdWJtaXRfdXJiKGRldiwgdXJiLCBsZW4pOwo+IC0JCWJ5dGVz X3NlbnQgKz0gbGVuOwo+IC0JfSBlbHNlCj4gLQkJdWRsX3VyYl9jb21wbGV0aW9uKHVyYik7Cj4g LQo+IC1lcnJvcjoKPiAtCWF0b21pY19hZGQoYnl0ZXNfc2VudCwgJnVkbC0+Ynl0ZXNfc2VudCk7 Cj4gLQlhdG9taWNfYWRkKGJ5dGVzX2lkZW50aWNhbCwgJnVkbC0+Ynl0ZXNfaWRlbnRpY2FsKTsK PiAtCWF0b21pY19hZGQoYnl0ZXNfcmVuZGVyZWQsICZ1ZGwtPmJ5dGVzX3JlbmRlcmVkKTsKPiAt CWVuZF9jeWNsZXMgPSBnZXRfY3ljbGVzKCk7Cj4gLQlhdG9taWNfYWRkKCgodW5zaWduZWQgaW50 KSAoKGVuZF9jeWNsZXMgLSBzdGFydF9jeWNsZXMpCj4gLQkJICAgID4+IDEwKSksIC8qIEtjeWNs ZXMgKi8KPiAtCQkgICAmdWRsLT5jcHVfa2N5Y2xlc191c2VkKTsKPiAtfQo+IC0KPiAgaW50IHVk bF9oYW5kbGVfZGFtYWdlKHN0cnVjdCB1ZGxfZnJhbWVidWZmZXIgKmZiLCBpbnQgeCwgaW50IHks Cj4gIAkJICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQo+ICB7Cj4gQEAgLTE1Miw5ICs5MCw2 IEBAIGludCB1ZGxfaGFuZGxlX2RhbWFnZShzdHJ1Y3QgdWRsX2ZyYW1lYnVmZmVyICpmYiwgaW50 IHgsIGludCB5LAo+ICAJc3RydWN0IHVyYiAqdXJiOwo+ICAJaW50IGFsaWduZWRfeDsKPiAgCWlu dCBicHAgPSAoZmItPmJhc2UuYml0c19wZXJfcGl4ZWwgLyA4KTsKPiAtCWludCB4MiwgeTI7Cj4g LQlib29sIHN0b3JlX2Zvcl9sYXRlciA9IGZhbHNlOwo+IC0JdW5zaWduZWQgbG9uZyBmbGFnczsK PiAgCj4gIAlpZiAoIWZiLT5hY3RpdmVfMTYpCj4gIAkJcmV0dXJuIDA7Cj4gQEAgLTE4MCwzOCAr MTE1LDYgQEAgaW50IHVkbF9oYW5kbGVfZGFtYWdlKHN0cnVjdCB1ZGxfZnJhbWVidWZmZXIgKmZi LCBpbnQgeCwgaW50IHksCj4gIAkgICAgKHkgKyBoZWlnaHQgPiBmYi0+YmFzZS5oZWlnaHQpKQo+ ICAJCXJldHVybiAtRUlOVkFMOwo+ICAKPiAtCS8qIGlmIHdlIGFyZSBpbiBhdG9taWMganVzdCBz dG9yZSB0aGUgaW5mbwo+IC0JICAgY2FuJ3QgdGVzdCBpbnNpZGUgc3BpbiBsb2NrICovCj4gLQlp ZiAoaW5fYXRvbWljKCkpCj4gLQkJc3RvcmVfZm9yX2xhdGVyID0gdHJ1ZTsKPiAtCj4gLQl4MiA9 IHggKyB3aWR0aCAtIDE7Cj4gLQl5MiA9IHkgKyBoZWlnaHQgLSAxOwo+IC0KPiAtCXNwaW5fbG9j a19pcnFzYXZlKCZmYi0+ZGlydHlfbG9jaywgZmxhZ3MpOwo+IC0KPiAtCWlmIChmYi0+eTEgPCB5 KQo+IC0JCXkgPSBmYi0+eTE7Cj4gLQlpZiAoZmItPnkyID4geTIpCj4gLQkJeTIgPSBmYi0+eTI7 Cj4gLQlpZiAoZmItPngxIDwgeCkKPiAtCQl4ID0gZmItPngxOwo+IC0JaWYgKGZiLT54MiA+IHgy KQo+IC0JCXgyID0gZmItPngyOwo+IC0KPiAtCWlmIChzdG9yZV9mb3JfbGF0ZXIpIHsKPiAtCQlm Yi0+eDEgPSB4Owo+IC0JCWZiLT54MiA9IHgyOwo+IC0JCWZiLT55MSA9IHk7Cj4gLQkJZmItPnky ID0geTI7Cj4gLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmItPmRpcnR5X2xvY2ssIGZsYWdz KTsKPiAtCQlyZXR1cm4gMDsKPiAtCX0KPiAtCj4gLQlmYi0+eDEgPSBmYi0+eTEgPSBJTlRfTUFY Owo+IC0JZmItPngyID0gZmItPnkyID0gMDsKPiAtCj4gLQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZmYi0+ZGlydHlfbG9jaywgZmxhZ3MpOwo+ICAJc3RhcnRfY3ljbGVzID0gZ2V0X2N5Y2xlcygp Owo+ICAKPiAgCXVyYiA9IHVkbF9nZXRfdXJiKGRldik7Cj4gQEAgLTIxOSwxNCArMTIyLDE0IEBA IGludCB1ZGxfaGFuZGxlX2RhbWFnZShzdHJ1Y3QgdWRsX2ZyYW1lYnVmZmVyICpmYiwgaW50IHgs IGludCB5LAo+ICAJCXJldHVybiAwOwo+ICAJY21kID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7Cj4g IAo+IC0JZm9yIChpID0geTsgaSA8PSB5MiA7IGkrKykgewo+ICsJZm9yIChpID0geTsgaSA8IGhl aWdodCA7IGkrKykgewo+ICAJCWNvbnN0IGludCBsaW5lX29mZnNldCA9IGZiLT5iYXNlLnBpdGNo ZXNbMF0gKiBpOwo+ICAJCWNvbnN0IGludCBieXRlX29mZnNldCA9IGxpbmVfb2Zmc2V0ICsgKHgg KiBicHApOwo+ICAJCWNvbnN0IGludCBkZXZfYnl0ZV9vZmZzZXQgPSAoZmItPmJhc2Uud2lkdGgg KiBicHAgKiBpKSArICh4ICogYnBwKTsKPiAgCQlpZiAodWRsX3JlbmRlcl9obGluZShkZXYsIGJw cCwgJnVyYiwKPiAgCQkJCSAgICAgKGNoYXIgKikgZmItPm9iai0+dm1hcHBpbmcsCj4gIAkJCQkg ICAgICZjbWQsIGJ5dGVfb2Zmc2V0LCBkZXZfYnl0ZV9vZmZzZXQsCj4gLQkJCQkgICAgICh4MiAt IHggKyAxKSAqIGJwcCwKPiArCQkJCSAgICAgd2lkdGggKiBicHAsCj4gIAkJCQkgICAgICZieXRl c19pZGVudGljYWwsICZieXRlc19zZW50KSkKPiAgCQkJZ290byBlcnJvcjsKPiAgCX0KPiBAQCAt MjgzLDM2ICsxODYsNiBAQCBzdGF0aWMgaW50IHVkbF9mYl9tbWFwKHN0cnVjdCBmYl9pbmZvICpp bmZvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKPiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+ IC1zdGF0aWMgdm9pZCB1ZGxfZmJfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0 IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCkKPiAtewo+IC0Jc3RydWN0IHVkbF9mYmRldiAqdWZi ZGV2ID0gaW5mby0+cGFyOwo+IC0KPiAtCXN5c19maWxscmVjdChpbmZvLCByZWN0KTsKPiAtCj4g LQl1ZGxfaGFuZGxlX2RhbWFnZSgmdWZiZGV2LT51ZmIsIHJlY3QtPmR4LCByZWN0LT5keSwgcmVj dC0+d2lkdGgsCj4gLQkJCSAgcmVjdC0+aGVpZ2h0KTsKPiAtfQo+IC0KPiAtc3RhdGljIHZvaWQg dWRsX2ZiX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfY29w eWFyZWEgKnJlZ2lvbikKPiAtewo+IC0Jc3RydWN0IHVkbF9mYmRldiAqdWZiZGV2ID0gaW5mby0+ cGFyOwo+IC0KPiAtCXN5c19jb3B5YXJlYShpbmZvLCByZWdpb24pOwo+IC0KPiAtCXVkbF9oYW5k bGVfZGFtYWdlKCZ1ZmJkZXYtPnVmYiwgcmVnaW9uLT5keCwgcmVnaW9uLT5keSwgcmVnaW9uLT53 aWR0aCwKPiAtCQkJICByZWdpb24tPmhlaWdodCk7Cj4gLX0KPiAtCj4gLXN0YXRpYyB2b2lkIHVk bF9mYl9pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9pbWFn ZSAqaW1hZ2UpCj4gLXsKPiAtCXN0cnVjdCB1ZGxfZmJkZXYgKnVmYmRldiA9IGluZm8tPnBhcjsK PiAtCj4gLQlzeXNfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKPiAtCj4gLQl1ZGxfaGFuZGxlX2Rh bWFnZSgmdWZiZGV2LT51ZmIsIGltYWdlLT5keCwgaW1hZ2UtPmR5LCBpbWFnZS0+d2lkdGgsCj4g LQkJCSAgaW1hZ2UtPmhlaWdodCk7Cj4gLX0KPiAtCj4gIC8qCj4gICAqIEl0J3MgY29tbW9uIGZv ciBzZXZlcmFsIGNsaWVudHMgdG8gaGF2ZSBmcmFtZWJ1ZmZlciBvcGVuIHNpbXVsdGFuZW91c2x5 Lgo+ICAgKiBlLmcuIGJvdGggZmJjb24gYW5kIFguIE1ha2VzIHRoaW5ncyBpbnRlcmVzdGluZy4K PiBAQCAtMzMwLDIwICsyMDMsMjAgQEAgc3RhdGljIGludCB1ZGxfZmJfb3BlbihzdHJ1Y3QgZmJf aW5mbyAqaW5mbywgaW50IHVzZXIpCj4gIAo+ICAJdWZiZGV2LT5mYl9jb3VudCsrOwo+ICAKPiAt CWlmIChmYl9kZWZpbyAmJiAoaW5mby0+ZmJkZWZpbyA9PSBOVUxMKSkgewo+IC0JCS8qIGVuYWJs ZSBkZWZpbyBhdCBsYXN0IG1vbWVudCBpZiBub3QgZGlzYWJsZWQgYnkgY2xpZW50ICovCj4gKwlp ZiAoIWluZm8tPmZiZGVmaW8pIHsKPiArCQkvKiBlbmFibGUgZGVmaW8gYXQgbGFzdCBtb21lbnQg Ki8KPiAgCj4gIAkJc3RydWN0IGZiX2RlZmVycmVkX2lvICpmYmRlZmlvOwo+ICAKPiAgCQlmYmRl ZmlvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZiX2RlZmVycmVkX2lvKSwgR0ZQX0tFUk5FTCk7 Cj4gLQo+ICAJCWlmIChmYmRlZmlvKSB7Cj4gIAkJCWZiZGVmaW8tPmRlbGF5ID0gRExfREVGSU9f V1JJVEVfREVMQVk7Cj4gLQkJCWZiZGVmaW8tPmRlZmVycmVkX2lvID0gdWRsZmJfZHB5X2RlZmVy cmVkX2lvOwo+ICsJCQlmYmRlZmlvLT5kZWZlcnJlZF9pbyA9IGRybV9mYl9oZWxwZXJfZGVmZXJy ZWRfaW87CgpXaHkgYWxsIHRoZXNlIGNoYW5nZXMgaGVyZT8gSSBmaWd1cmVkIGp1c3QgZXhjaGFu Z2luZyB0aGUgZGVmZXJyZWRfaW8KcG9pbnRlciBzaG91bGQgYmUgYWxsIHRoYXQncyByZWFsbHkg bmVlZGVkIGluIHRoZSBzZXR1cCBjb2RlPwotRGFuaWVsCgo+ICsJCQlpbmZvLT5mYmRlZmlvID0g ZmJkZWZpbzsKPiArCQkJZmJfZGVmZXJyZWRfaW9faW5pdChpbmZvKTsKPiArCQkJaWYgKCFmYl9k ZWZpbykgLyogc2VlIGNvbW1pdCA2NzdkMjNiICovCj4gKwkJCQlpbmZvLT5mYm9wcy0+ZmJfbW1h cCA9IHVkbF9mYl9tbWFwOwo+ICAJCX0KPiAtCj4gLQkJaW5mby0+ZmJkZWZpbyA9IGZiZGVmaW87 Cj4gLQkJZmJfZGVmZXJyZWRfaW9faW5pdChpbmZvKTsKPiAgCX0KPiAgCj4gIAlwcl9ub3RpY2Uo Im9wZW4gL2Rldi9mYiVkIHVzZXI9JWQgZmJfaW5mbz0lcCBjb3VudD0lZFxuIiwKPiBAQCAtMzc5 LDkgKzI1Miw5IEBAIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHVkbGZiX29wcyA9IHsKPiAgCS5vd25l ciA9IFRISVNfTU9EVUxFLAo+ICAJLmZiX2NoZWNrX3ZhciA9IGRybV9mYl9oZWxwZXJfY2hlY2tf dmFyLAo+ICAJLmZiX3NldF9wYXIgPSBkcm1fZmJfaGVscGVyX3NldF9wYXIsCj4gLQkuZmJfZmls bHJlY3QgPSB1ZGxfZmJfZmlsbHJlY3QsCj4gLQkuZmJfY29weWFyZWEgPSB1ZGxfZmJfY29weWFy ZWEsCj4gLQkuZmJfaW1hZ2VibGl0ID0gdWRsX2ZiX2ltYWdlYmxpdCwKPiArCS5mYl9maWxscmVj dCA9IGRybV9mYl9oZWxwZXJfc3lzX2ZpbGxyZWN0LAo+ICsJLmZiX2NvcHlhcmVhID0gZHJtX2Zi X2hlbHBlcl9zeXNfY29weWFyZWEsCj4gKwkuZmJfaW1hZ2VibGl0ID0gZHJtX2ZiX2hlbHBlcl9z eXNfaW1hZ2VibGl0LAo+ICAJLmZiX3Bhbl9kaXNwbGF5ID0gZHJtX2ZiX2hlbHBlcl9wYW5fZGlz cGxheSwKPiAgCS5mYl9ibGFuayA9IGRybV9mYl9oZWxwZXJfYmxhbmssCj4gIAkuZmJfc2V0Y21h cCA9IGRybV9mYl9oZWxwZXJfc2V0Y21hcCwKPiBAQCAtNDU4LDcgKzMzMSw2IEBAIHVkbF9mcmFt ZWJ1ZmZlcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4gIHsKPiAgCWludCByZXQ7Cj4g IAo+IC0Jc3Bpbl9sb2NrX2luaXQoJnVmYi0+ZGlydHlfbG9jayk7Cj4gIAl1ZmItPm9iaiA9IG9i ajsKPiAgCWRybV9oZWxwZXJfbW9kZV9maWxsX2ZiX3N0cnVjdCgmdWZiLT5iYXNlLCBtb2RlX2Nt ZCk7Cj4gIAlyZXQgPSBkcm1fZnJhbWVidWZmZXJfaW5pdChkZXYsICZ1ZmItPmJhc2UsICZ1ZGxm Yl9mdW5jcyk7Cj4gLS0gCj4gMi4yLjIKPiAKCi0tIApEYW5pZWwgVmV0dGVyClNvZnR3YXJlIEVu Z2luZWVyLCBJbnRlbCBDb3Jwb3JhdGlvbgpodHRwOi8vYmxvZy5mZndsbC5jaApfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBs aXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVz a3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK