From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_PASS,URIBL_BLOCKED,USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 34330C46469 for ; Wed, 12 Sep 2018 15:27:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 981882087F for ; Wed, 12 Sep 2018 15:27:09 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 981882087F Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727403AbeILUcH (ORCPT ); Wed, 12 Sep 2018 16:32:07 -0400 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:33694 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726640AbeILUcH (ORCPT ); Wed, 12 Sep 2018 16:32:07 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 20D8E7A9; Wed, 12 Sep 2018 08:27:06 -0700 (PDT) Received: from e110455-lin.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.72.51.249]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id C345E3F5C0; Wed, 12 Sep 2018 08:27:05 -0700 (PDT) Received: by e110455-lin.cambridge.arm.com (Postfix, from userid 1000) id 2AF446805AA; Wed, 12 Sep 2018 16:27:04 +0100 (BST) Date: Wed, 12 Sep 2018 16:27:04 +0100 From: Liviu Dudau To: Brian Starkey , dri-devel@lists.freedesktop.org, daniel@fooishbar.org, airlied@linux.ie, gustavo@padovan.org, maarten.lankhorst@linux.intel.com, seanpaul@chromium.org, linux-kernel@vger.kernel.org, alexandru-cosmin.gheorghe@arm.com, ayan.halder@arm.com, tfiga@chromium.org, hoegsberg@chromium.org Subject: Re: [RFC PATCH v2 1/3] drm/fourcc: Add 'bpp' field for formats with non-integer bytes-per-pixel Message-ID: <20180912152704.GF936@e110455-lin.cambridge.arm.com> References: <20180823152343.6474-1-brian.starkey@arm.com> <20180823152343.6474-2-brian.starkey@arm.com> <20180831081730.GM21634@phenom.ffwll.local> <20180907124535.GA3461@DESKTOP-E1NTVVP.localdomain> <20180907192626.GA7176@phenom.ffwll.local> <20180910085003.GA36@DESKTOP-E1NTVVP.localdomain> <20180910195325.GC19774@phenom.ffwll.local> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20180910195325.GC19774@phenom.ffwll.local> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Sep 10, 2018 at 09:53:25PM +0200, Daniel Vetter wrote: > On Mon, Sep 10, 2018 at 09:50:03AM +0100, Brian Starkey wrote: > > Hi, > > > > On Fri, Sep 07, 2018 at 09:28:44PM +0200, Daniel Vetter wrote: > > > On Fri, Sep 07, 2018 at 01:45:36PM +0100, Brian Starkey wrote: > > > > Hi Daniel, > > > > > > > > On Fri, Aug 31, 2018 at 10:17:30AM +0200, Daniel Vetter wrote: > > > > > On Thu, Aug 23, 2018 at 04:23:41PM +0100, Brian Starkey wrote: > > > > > > Some formats have a non-integer number of bytes per pixel, which can't > > > > > > be handled with the existing 'cpp' field in drm_format_info. To handle > > > > > > these formats, add a 'bpp' field, which is only used if cpp[0] == 0. > > > > > > > > > > > > This updates all the users of format->cpp in the core DRM code, > > > > > > converting them to use a new function to get the bits-per-pixel for any > > > > > > format. > > > > > > > > > > > > It's assumed that drivers will use the 'bpp' field when they add support > > > > > > for pixel formats with non-integer bytes-per-pixel. > > > > > > > > > > > > Signed-off-by: Brian Starkey > > > > > > > > > > I assume you still require that stuff is eventually aligned to bytes? In > > > > > that case, can we subsume this into the tile work Alex is doing? It's > > > > > essentially just another special case of having storage-size units > > > > > measured in bytes which span more than 1x1 pixel. And I kinda don't want a > > > > > metric pile of special cases here in the format code, because that just > > > > > means every driver handles a different subset, with different bugs. > > > > > -Daniel > > > > > > > > Sorry for the delay, been struggling to free some cycles to think > > > > about this. > > > > > > > > I'm not sure how to pull this in with the tiling stuff. In the AFBC > > > > case then our AFBC superblocks are always nice round numbers (256 > > > > pixels), and so it does end up being a multiple of bytes. > > > > > > > > However, AFBC supports different superblock sizes, so picking just one > > > > doesn't really work out, and putting AFBC in the core format table > > > > which reflects AFBC doesn't seem good. > > > > > > > > We could make something up (e.g. call these formats "tiled" with 2x4 > > > > tiles, which guarantees a multiple of 8), but it would be an > > > > arbitrarily-selected lie, which often seems to spell trouble. If we > > > > did do that, would you re-define cpp as "bytes-per-tile"? Otherwise > > > > we still need to add a new field anyway. > > > > > > > > What's the pile of special cases you're worried about? The helper I've > > > > added here means that drivers which need to care can use one API and > > > > not implement their own bugs. > > > > > > I'm confused ... the new bits-per-pixel stuff you're adding here is for > > > yuv formats, not afbc. I'm just suggesting we have only 1 way of > > > describing such formats that need more descriptive power than cpp, whether > > > they have some kind of pixel-groups or small tiles. > > > > Well, not really. The three formats which have non-integer cpp are: > > DRM_FORMAT_VUY101010, DRM_FORMAT_YUV420_8BIT and > > DRM_FORMAT_YUV420_10BIT. These formats are only valid with non-linear > > modifiers (no linear encoding is defined). Mali only supports them > > with AFBC. > > > > The formats themselves have no notion of tiling or grouping - the > > modifier adds that. I'm not aware of any non-AFBC uses of these > > formats, so I don't want to "make up" a small-tile layout restriction > > for them. > > Ah, I missed that. > > > > For very special stuff like afbc you need to validate in the driver > > > anyway, too complicated. So I have no idea why you bring this up here? > > > > Sure, we can just let drivers provide their own format_info's for > > these, if that's what you prefer. The core format checking code can > > error out if it ever encounters them. > > It's format_info we're talking about. What I mean is that you just set all > these to 0 and let the format_info code ignore it. And then having a > bespoke drm_format_check_afbc helper function or similar, which checks all > the layout restrictions of afbc. > > I still maintain that bpp and tile_size are equavalent, and we really > don't need both. Both are defacto a form of numerator/denumerator. If you > don't like that you have to introduce "fake" tiles for afbc, then we can > rename tile_size to numerator and tile_h/w to denumerator_h/w. Doesn't > change one bit of the math. bpp simply hardcodes a denumerator of 8, and I > don't see why we need that special case. Except if you love to write > redundant self tests for all the math :-) My $.02 worth of thoughts: I get the fact that Daniel doesn't like us to add 3 new variables into format_info (bpp, tile_w, tile_h) and that adding a "bits_per_unit" variable should be able to take care of linear (where unit = 1 pixel) and tiled (where unit = tile_w * tile_h pixels) formats. And I also see Daniel's option 2 below, where he says it is reasonable to check AFBC without using format_info. However, the problem we are trying to solve is 2 fold: we are trying to calculate the size of the framebuffer (and the "bits_per_unit" or Brian's bpp is useful for that), but we also try to validate the sizes passed by userspace based on the drm_fourcc.h+modifier info. In that case, the driver still needs to store somewhere the tile_w/tile_h for that given format in order to check that the stride is a whole multiple of tile sizes, so we thought that putting it in format_info is not entirely pointless, because others might use those variables in order to do their driver specific validation, without creating new structures. Did I capture the discussion correctly? If so, can we agree that it is not just the framebuffer size calculation that matters and that tiled formats validation requires a tile_w/tile_h info, therefore Alex's patches and Brian's need to be discussed separately (so that we can bikeshed on whether format_info is the right place or not)? Best regards, Liviu > > So two options that I think are reasonable: > - one common numerator/denumerator. I don't care how you call that > bikeshed. > - don't check afbc using format_info, have your own helper that does that > using custom code. > > Cheers, Daniel > > > Cheers, > > -Brian > > > > > -Daniel > > > > > > > > > > > Cheers, > > > > -Brian > > > > > > > > > > > > > > > --- > > > > > > drivers/gpu/drm/drm_fb_cma_helper.c | 6 +++- > > > > > > drivers/gpu/drm/drm_fb_helper.c | 8 +++-- > > > > > > drivers/gpu/drm/drm_fourcc.c | 50 ++++++++++++++++++++++++++++ > > > > > > drivers/gpu/drm/drm_framebuffer.c | 8 ++--- > > > > > > drivers/gpu/drm/drm_gem_framebuffer_helper.c | 3 +- > > > > > > include/drm/drm_fourcc.h | 4 +++ > > > > > > 6 files changed, 70 insertions(+), 9 deletions(-) > > > > > > > > > > > > diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c > > > > > > index 186d00adfb5f..e279d70d3e60 100644 > > > > > > --- a/drivers/gpu/drm/drm_fb_cma_helper.c > > > > > > +++ b/drivers/gpu/drm/drm_fb_cma_helper.c > > > > > > @@ -118,13 +118,17 @@ dma_addr_t drm_fb_cma_get_gem_addr(struct drm_framebuffer *fb, > > > > > > { > > > > > > struct drm_gem_cma_object *obj; > > > > > > dma_addr_t paddr; > > > > > > + u8 bpp = drm_format_info_plane_bpp(fb->format, plane); > > > > > > + > > > > > > + /* This can't work for non-integer bytes-per-pixel */ > > > > > > + WARN_ON(bpp % 8); > > > > > > > > > > > > obj = drm_fb_cma_get_gem_obj(fb, plane); > > > > > > if (!obj) > > > > > > return 0; > > > > > > > > > > > > paddr = obj->paddr + fb->offsets[plane]; > > > > > > - paddr += fb->format->cpp[plane] * (state->src_x >> 16); > > > > > > + paddr += (bpp / 8) * (state->src_x >> 16); > > > > > > paddr += fb->pitches[plane] * (state->src_y >> 16); > > > > > > > > > > > > return paddr; > > > > > > diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c > > > > > > index 0646b108030b..ab369f250af4 100644 > > > > > > --- a/drivers/gpu/drm/drm_fb_helper.c > > > > > > +++ b/drivers/gpu/drm/drm_fb_helper.c > > > > > > @@ -1572,6 +1572,7 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var, > > > > > > struct drm_fb_helper *fb_helper = info->par; > > > > > > struct drm_framebuffer *fb = fb_helper->fb; > > > > > > int depth; > > > > > > + u8 bpp = drm_format_info_plane_bpp(fb->format, 0); > > > > > > > > > > > > if (var->pixclock != 0 || in_dbg_master()) > > > > > > return -EINVAL; > > > > > > @@ -1580,14 +1581,14 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var, > > > > > > * Changes struct fb_var_screeninfo are currently not pushed back > > > > > > * to KMS, hence fail if different settings are requested. > > > > > > */ > > > > > > - if (var->bits_per_pixel != fb->format->cpp[0] * 8 || > > > > > > + if (var->bits_per_pixel != bpp || > > > > > > var->xres > fb->width || var->yres > fb->height || > > > > > > var->xres_virtual > fb->width || var->yres_virtual > fb->height) { > > > > > > DRM_DEBUG("fb requested width/height/bpp can't fit in current fb " > > > > > > "request %dx%d-%d (virtual %dx%d) > %dx%d-%d\n", > > > > > > var->xres, var->yres, var->bits_per_pixel, > > > > > > var->xres_virtual, var->yres_virtual, > > > > > > - fb->width, fb->height, fb->format->cpp[0] * 8); > > > > > > + fb->width, fb->height, bpp); > > > > > > return -EINVAL; > > > > > > } > > > > > > > > > > > > @@ -1949,11 +1950,12 @@ void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helpe > > > > > > uint32_t fb_width, uint32_t fb_height) > > > > > > { > > > > > > struct drm_framebuffer *fb = fb_helper->fb; > > > > > > + u8 bpp = drm_format_info_plane_bpp(fb->format, 0); > > > > > > > > > > > > info->pseudo_palette = fb_helper->pseudo_palette; > > > > > > info->var.xres_virtual = fb->width; > > > > > > info->var.yres_virtual = fb->height; > > > > > > - info->var.bits_per_pixel = fb->format->cpp[0] * 8; > > > > > > + info->var.bits_per_pixel = bpp; > > > > > > info->var.accel_flags = FB_ACCELF_TEXT; > > > > > > info->var.xoffset = 0; > > > > > > info->var.yoffset = 0; > > > > > > diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c > > > > > > index 3b42c25bd58d..bb28919c32f3 100644 > > > > > > --- a/drivers/gpu/drm/drm_fourcc.c > > > > > > +++ b/drivers/gpu/drm/drm_fourcc.c > > > > > > @@ -272,10 +272,60 @@ int drm_format_plane_cpp(uint32_t format, int plane) > > > > > > if (!info || plane >= info->num_planes) > > > > > > return 0; > > > > > > > > > > > > + /* > > > > > > + * Not valid for formats with non-integer cpp, > > > > > > + * use drm_format{_info}_plane_bpp instead > > > > > > + */ > > > > > > + WARN_ON(!info->cpp[0]); > > > > > > + > > > > > > return info->cpp[plane]; > > > > > > } > > > > > > EXPORT_SYMBOL(drm_format_plane_cpp); > > > > > > > > > > > > +/** > > > > > > + * drm_format_plane_bpp - determine the bits per pixel value > > > > > > + * @format: pixel format (DRM_FORMAT_*) > > > > > > + * @plane: plane index > > > > > > + * > > > > > > + * Returns: > > > > > > + * The bits per pixel value for the specified plane. > > > > > > + */ > > > > > > +int drm_format_plane_bpp(uint32_t format, int plane) > > > > > > +{ > > > > > > + const struct drm_format_info *info; > > > > > > + > > > > > > + info = drm_format_info(format); > > > > > > + if (!info) > > > > > > + return 0; > > > > > > + > > > > > > + return drm_format_info_plane_bpp(info, plane); > > > > > > +} > > > > > > +EXPORT_SYMBOL(drm_format_plane_bpp); > > > > > > + > > > > > > +/** > > > > > > + * drm_format_info_plane_bpp - determine the bits per pixel value > > > > > > + * > > > > > > + * Convenience function which handles formats with both integer > > > > > > + * and non-integer bytes-per-pixel. > > > > > > + * > > > > > > + * @format: pixel format info structure > > > > > > + * @plane: plane index > > > > > > + * > > > > > > + * Returns: > > > > > > + * The bits per pixel value for the specified plane. > > > > > > + */ > > > > > > +int drm_format_info_plane_bpp(const struct drm_format_info *info, int plane) > > > > > > +{ > > > > > > + if (plane >= info->num_planes) > > > > > > + return 0; > > > > > > + > > > > > > + if (info->cpp[0]) > > > > > > + return info->cpp[plane] * 8; > > > > > > + > > > > > > + return info->bpp[plane]; > > > > > > +} > > > > > > +EXPORT_SYMBOL(drm_format_info_plane_bpp); > > > > > > + > > > > > > /** > > > > > > * drm_format_horz_chroma_subsampling - get the horizontal chroma subsampling factor > > > > > > * @format: pixel format (DRM_FORMAT_*) > > > > > > diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c > > > > > > index 8c4d32adcc17..7e00360ff70d 100644 > > > > > > --- a/drivers/gpu/drm/drm_framebuffer.c > > > > > > +++ b/drivers/gpu/drm/drm_framebuffer.c > > > > > > @@ -185,20 +185,20 @@ static int framebuffer_check(struct drm_device *dev, > > > > > > for (i = 0; i < info->num_planes; i++) { > > > > > > unsigned int width = fb_plane_width(r->width, info, i); > > > > > > unsigned int height = fb_plane_height(r->height, info, i); > > > > > > - unsigned int cpp = info->cpp[i]; > > > > > > + unsigned int bpp = drm_format_info_plane_bpp(info, i); > > > > > > > > > > > > if (!r->handles[i]) { > > > > > > DRM_DEBUG_KMS("no buffer object handle for plane %d\n", i); > > > > > > return -EINVAL; > > > > > > } > > > > > > > > > > > > - if ((uint64_t) width * cpp > UINT_MAX) > > > > > > + if ((uint64_t) DIV_ROUND_UP(width * bpp, 8) > UINT_MAX) > > > > > > return -ERANGE; > > > > > > > > > > > > if ((uint64_t) height * r->pitches[i] + r->offsets[i] > UINT_MAX) > > > > > > return -ERANGE; > > > > > > > > > > > > - if (r->pitches[i] < width * cpp) { > > > > > > + if ((uint64_t) r->pitches[i] * 8 < (uint64_t) width * bpp) { > > > > > > DRM_DEBUG_KMS("bad pitch %u for plane %d\n", r->pitches[i], i); > > > > > > return -EINVAL; > > > > > > } > > > > > > @@ -476,7 +476,7 @@ int drm_mode_getfb(struct drm_device *dev, > > > > > > r->height = fb->height; > > > > > > r->width = fb->width; > > > > > > r->depth = fb->format->depth; > > > > > > - r->bpp = fb->format->cpp[0] * 8; > > > > > > + r->bpp = drm_format_info_plane_bpp(fb->format, 0); > > > > > > r->pitch = fb->pitches[0]; > > > > > > > > > > > > /* GET_FB() is an unprivileged ioctl so we must not return a > > > > > > diff --git a/drivers/gpu/drm/drm_gem_framebuffer_helper.c b/drivers/gpu/drm/drm_gem_framebuffer_helper.c > > > > > > index acfbc0641a06..dfe224ccaeba 100644 > > > > > > --- a/drivers/gpu/drm/drm_gem_framebuffer_helper.c > > > > > > +++ b/drivers/gpu/drm/drm_gem_framebuffer_helper.c > > > > > > @@ -161,6 +161,7 @@ drm_gem_fb_create_with_funcs(struct drm_device *dev, struct drm_file *file, > > > > > > unsigned int width = mode_cmd->width / (i ? info->hsub : 1); > > > > > > unsigned int height = mode_cmd->height / (i ? info->vsub : 1); > > > > > > unsigned int min_size; > > > > > > + u8 bpp = drm_format_info_plane_bpp(fb->format, i); > > > > > > > > > > > > objs[i] = drm_gem_object_lookup(file, mode_cmd->handles[i]); > > > > > > if (!objs[i]) { > > > > > > @@ -170,7 +171,7 @@ drm_gem_fb_create_with_funcs(struct drm_device *dev, struct drm_file *file, > > > > > > } > > > > > > > > > > > > min_size = (height - 1) * mode_cmd->pitches[i] > > > > > > - + width * info->cpp[i] > > > > > > + + DIV_ROUND_UP(width * bpp, 8) > > > > > > + mode_cmd->offsets[i]; > > > > > > > > > > > > if (objs[i]->size < min_size) { > > > > > > diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h > > > > > > index 3e86408dac9f..d4af4dab1623 100644 > > > > > > --- a/include/drm/drm_fourcc.h > > > > > > +++ b/include/drm/drm_fourcc.h > > > > > > @@ -36,6 +36,7 @@ struct drm_mode_fb_cmd2; > > > > > > * use in new code and set to 0 for new formats. > > > > > > * @num_planes: Number of color planes (1 to 3) > > > > > > * @cpp: Number of bytes per pixel (per plane) > > > > > > + * @bpp: Number of bits per pixel (per plane), only valid if cpp[0] == 0. > > > > > > * @hsub: Horizontal chroma subsampling factor > > > > > > * @vsub: Vertical chroma subsampling factor > > > > > > * @has_alpha: Does the format embeds an alpha component? > > > > > > @@ -45,6 +46,7 @@ struct drm_format_info { > > > > > > u8 depth; > > > > > > u8 num_planes; > > > > > > u8 cpp[3]; > > > > > > + u8 bpp[3]; > > > > > > u8 hsub; > > > > > > u8 vsub; > > > > > > bool has_alpha; > > > > > > @@ -66,6 +68,8 @@ drm_get_format_info(struct drm_device *dev, > > > > > > uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth); > > > > > > int drm_format_num_planes(uint32_t format); > > > > > > int drm_format_plane_cpp(uint32_t format, int plane); > > > > > > +int drm_format_plane_bpp(uint32_t format, int plane); > > > > > > +int drm_format_info_plane_bpp(const struct drm_format_info *format, int plane); > > > > > > int drm_format_horz_chroma_subsampling(uint32_t format); > > > > > > int drm_format_vert_chroma_subsampling(uint32_t format); > > > > > > int drm_format_plane_width(int width, uint32_t format, int plane); > > > > > > -- > > > > > > 2.16.1 > > > > > > > > > > > > > > > > -- > > > > > Daniel Vetter > > > > > Software Engineer, Intel Corporation > > > > > http://blog.ffwll.ch > > > > > > -- > > > Daniel Vetter > > > Software Engineer, Intel Corporation > > > http://blog.ffwll.ch > > _______________________________________________ > > dri-devel mailing list > > dri-devel@lists.freedesktop.org > > https://lists.freedesktop.org/mailman/listinfo/dri-devel > > -- > Daniel Vetter > Software Engineer, Intel Corporation > http://blog.ffwll.ch -- ==================== | I would like to | | fix the world, | | but they're not | | giving me the | \ source code! / --------------- ¯\_(ツ)_/¯ From mboxrd@z Thu Jan 1 00:00:00 1970 From: Liviu Dudau Subject: Re: [RFC PATCH v2 1/3] drm/fourcc: Add 'bpp' field for formats with non-integer bytes-per-pixel Date: Wed, 12 Sep 2018 16:27:04 +0100 Message-ID: <20180912152704.GF936@e110455-lin.cambridge.arm.com> References: <20180823152343.6474-1-brian.starkey@arm.com> <20180823152343.6474-2-brian.starkey@arm.com> <20180831081730.GM21634@phenom.ffwll.local> <20180907124535.GA3461@DESKTOP-E1NTVVP.localdomain> <20180907192626.GA7176@phenom.ffwll.local> <20180910085003.GA36@DESKTOP-E1NTVVP.localdomain> <20180910195325.GC19774@phenom.ffwll.local> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from foss.arm.com (foss.arm.com [217.140.101.70]) by gabe.freedesktop.org (Postfix) with ESMTP id 51D4E6E573 for ; Wed, 12 Sep 2018 15:27:06 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20180910195325.GC19774@phenom.ffwll.local> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Brian Starkey , dri-devel@lists.freedesktop.org, daniel@fooishbar.org, airlied@linux.ie, gustavo@padovan.org, maarten.lankhorst@linux.intel.com, seanpaul@chromium.org, linux-kernel@vger.kernel.org, alexandru-cosmin.gheorghe@arm.com, ayan.halder@arm.com, tfiga@chromium.org, hoegsberg@chromium.org List-Id: dri-devel@lists.freedesktop.org T24gTW9uLCBTZXAgMTAsIDIwMTggYXQgMDk6NTM6MjVQTSArMDIwMCwgRGFuaWVsIFZldHRlciB3 cm90ZToKPiBPbiBNb24sIFNlcCAxMCwgMjAxOCBhdCAwOTo1MDowM0FNICswMTAwLCBCcmlhbiBT dGFya2V5IHdyb3RlOgo+ID4gSGksCj4gPiAKPiA+IE9uIEZyaSwgU2VwIDA3LCAyMDE4IGF0IDA5 OjI4OjQ0UE0gKzAyMDAsIERhbmllbCBWZXR0ZXIgd3JvdGU6Cj4gPiA+IE9uIEZyaSwgU2VwIDA3 LCAyMDE4IGF0IDAxOjQ1OjM2UE0gKzAxMDAsIEJyaWFuIFN0YXJrZXkgd3JvdGU6Cj4gPiA+ID4g SGkgRGFuaWVsLAo+ID4gPiA+IAo+ID4gPiA+IE9uIEZyaSwgQXVnIDMxLCAyMDE4IGF0IDEwOjE3 OjMwQU0gKzAyMDAsIERhbmllbCBWZXR0ZXIgd3JvdGU6Cj4gPiA+ID4gPiBPbiBUaHUsIEF1ZyAy MywgMjAxOCBhdCAwNDoyMzo0MVBNICswMTAwLCBCcmlhbiBTdGFya2V5IHdyb3RlOgo+ID4gPiA+ ID4gPiBTb21lIGZvcm1hdHMgaGF2ZSBhIG5vbi1pbnRlZ2VyIG51bWJlciBvZiBieXRlcyBwZXIg cGl4ZWwsIHdoaWNoIGNhbid0Cj4gPiA+ID4gPiA+IGJlIGhhbmRsZWQgd2l0aCB0aGUgZXhpc3Rp bmcgJ2NwcCcgZmllbGQgaW4gZHJtX2Zvcm1hdF9pbmZvLiBUbyBoYW5kbGUKPiA+ID4gPiA+ID4g dGhlc2UgZm9ybWF0cywgYWRkIGEgJ2JwcCcgZmllbGQsIHdoaWNoIGlzIG9ubHkgdXNlZCBpZiBj cHBbMF0gPT0gMC4KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gVGhpcyB1cGRhdGVzIGFsbCB0aGUg dXNlcnMgb2YgZm9ybWF0LT5jcHAgaW4gdGhlIGNvcmUgRFJNIGNvZGUsCj4gPiA+ID4gPiA+IGNv bnZlcnRpbmcgdGhlbSB0byB1c2UgYSBuZXcgZnVuY3Rpb24gdG8gZ2V0IHRoZSBiaXRzLXBlci1w aXhlbCBmb3IgYW55Cj4gPiA+ID4gPiA+IGZvcm1hdC4KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4g SXQncyBhc3N1bWVkIHRoYXQgZHJpdmVycyB3aWxsIHVzZSB0aGUgJ2JwcCcgZmllbGQgd2hlbiB0 aGV5IGFkZCBzdXBwb3J0Cj4gPiA+ID4gPiA+IGZvciBwaXhlbCBmb3JtYXRzIHdpdGggbm9uLWlu dGVnZXIgYnl0ZXMtcGVyLXBpeGVsLgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBTaWduZWQtb2Zm LWJ5OiBCcmlhbiBTdGFya2V5IDxicmlhbi5zdGFya2V5QGFybS5jb20+Cj4gPiA+ID4gPgo+ID4g PiA+ID4gSSBhc3N1bWUgeW91IHN0aWxsIHJlcXVpcmUgdGhhdCBzdHVmZiBpcyBldmVudHVhbGx5 IGFsaWduZWQgdG8gYnl0ZXM/IEluCj4gPiA+ID4gPiB0aGF0IGNhc2UsIGNhbiB3ZSBzdWJzdW1l IHRoaXMgaW50byB0aGUgdGlsZSB3b3JrIEFsZXggaXMgZG9pbmc/IEl0J3MKPiA+ID4gPiA+IGVz c2VudGlhbGx5IGp1c3QgYW5vdGhlciBzcGVjaWFsIGNhc2Ugb2YgaGF2aW5nIHN0b3JhZ2Utc2l6 ZSB1bml0cwo+ID4gPiA+ID4gbWVhc3VyZWQgaW4gYnl0ZXMgd2hpY2ggc3BhbiBtb3JlIHRoYW4g MXgxIHBpeGVsLiBBbmQgSSBraW5kYSBkb24ndCB3YW50IGEKPiA+ID4gPiA+IG1ldHJpYyBwaWxl IG9mIHNwZWNpYWwgY2FzZXMgaGVyZSBpbiB0aGUgZm9ybWF0IGNvZGUsIGJlY2F1c2UgdGhhdCBq dXN0Cj4gPiA+ID4gPiBtZWFucyBldmVyeSBkcml2ZXIgaGFuZGxlcyBhIGRpZmZlcmVudCBzdWJz ZXQsIHdpdGggZGlmZmVyZW50IGJ1Z3MuCj4gPiA+ID4gPiAtRGFuaWVsCj4gPiA+ID4gCj4gPiA+ ID4gU29ycnkgZm9yIHRoZSBkZWxheSwgYmVlbiBzdHJ1Z2dsaW5nIHRvIGZyZWUgc29tZSBjeWNs ZXMgdG8gdGhpbmsKPiA+ID4gPiBhYm91dCB0aGlzLgo+ID4gPiA+IAo+ID4gPiA+IEknbSBub3Qg c3VyZSBob3cgdG8gcHVsbCB0aGlzIGluIHdpdGggdGhlIHRpbGluZyBzdHVmZi4gSW4gdGhlIEFG QkMKPiA+ID4gPiBjYXNlIHRoZW4gb3VyIEFGQkMgc3VwZXJibG9ja3MgYXJlIGFsd2F5cyBuaWNl IHJvdW5kIG51bWJlcnMgKDI1Ngo+ID4gPiA+IHBpeGVscyksIGFuZCBzbyBpdCBkb2VzIGVuZCB1 cCBiZWluZyBhIG11bHRpcGxlIG9mIGJ5dGVzLgo+ID4gPiA+IAo+ID4gPiA+IEhvd2V2ZXIsIEFG QkMgc3VwcG9ydHMgZGlmZmVyZW50IHN1cGVyYmxvY2sgc2l6ZXMsIHNvIHBpY2tpbmcganVzdCBv bmUKPiA+ID4gPiBkb2Vzbid0IHJlYWxseSB3b3JrIG91dCwgYW5kIHB1dHRpbmcgQUZCQyBpbiB0 aGUgY29yZSBmb3JtYXQgdGFibGUKPiA+ID4gPiB3aGljaCByZWZsZWN0cyBBRkJDIGRvZXNuJ3Qg c2VlbSBnb29kLgo+ID4gPiA+IAo+ID4gPiA+IFdlIGNvdWxkIG1ha2Ugc29tZXRoaW5nIHVwIChl LmcuIGNhbGwgdGhlc2UgZm9ybWF0cyAidGlsZWQiIHdpdGggMng0Cj4gPiA+ID4gdGlsZXMsIHdo aWNoIGd1YXJhbnRlZXMgYSBtdWx0aXBsZSBvZiA4KSwgYnV0IGl0IHdvdWxkIGJlIGFuCj4gPiA+ ID4gYXJiaXRyYXJpbHktc2VsZWN0ZWQgbGllLCB3aGljaCBvZnRlbiBzZWVtcyB0byBzcGVsbCB0 cm91YmxlLiBJZiB3ZQo+ID4gPiA+IGRpZCBkbyB0aGF0LCB3b3VsZCB5b3UgcmUtZGVmaW5lIGNw cCBhcyAiYnl0ZXMtcGVyLXRpbGUiPyBPdGhlcndpc2UKPiA+ID4gPiB3ZSBzdGlsbCBuZWVkIHRv IGFkZCBhIG5ldyBmaWVsZCBhbnl3YXkuCj4gPiA+ID4gCj4gPiA+ID4gV2hhdCdzIHRoZSBwaWxl IG9mIHNwZWNpYWwgY2FzZXMgeW91J3JlIHdvcnJpZWQgYWJvdXQ/IFRoZSBoZWxwZXIgSSd2ZQo+ ID4gPiA+IGFkZGVkIGhlcmUgbWVhbnMgdGhhdCBkcml2ZXJzIHdoaWNoIG5lZWQgdG8gY2FyZSBj YW4gdXNlIG9uZSBBUEkgYW5kCj4gPiA+ID4gbm90IGltcGxlbWVudCB0aGVpciBvd24gYnVncy4K PiA+ID4gCj4gPiA+IEknbSBjb25mdXNlZCAuLi4gdGhlIG5ldyBiaXRzLXBlci1waXhlbCBzdHVm ZiB5b3UncmUgYWRkaW5nIGhlcmUgaXMgZm9yCj4gPiA+IHl1diBmb3JtYXRzLCBub3QgYWZiYy4g SSdtIGp1c3Qgc3VnZ2VzdGluZyB3ZSBoYXZlIG9ubHkgMSB3YXkgb2YKPiA+ID4gZGVzY3JpYmlu ZyBzdWNoIGZvcm1hdHMgdGhhdCBuZWVkIG1vcmUgZGVzY3JpcHRpdmUgcG93ZXIgdGhhbiBjcHAs IHdoZXRoZXIKPiA+ID4gdGhleSBoYXZlIHNvbWUga2luZCBvZiBwaXhlbC1ncm91cHMgb3Igc21h bGwgdGlsZXMuCj4gPiAKPiA+IFdlbGwsIG5vdCByZWFsbHkuIFRoZSB0aHJlZSBmb3JtYXRzIHdo aWNoIGhhdmUgbm9uLWludGVnZXIgY3BwIGFyZToKPiA+IERSTV9GT1JNQVRfVlVZMTAxMDEwLCBE Uk1fRk9STUFUX1lVVjQyMF84QklUIGFuZAo+ID4gRFJNX0ZPUk1BVF9ZVVY0MjBfMTBCSVQuIFRo ZXNlIGZvcm1hdHMgYXJlIG9ubHkgdmFsaWQgd2l0aCBub24tbGluZWFyCj4gPiBtb2RpZmllcnMg KG5vIGxpbmVhciBlbmNvZGluZyBpcyBkZWZpbmVkKS4gTWFsaSBvbmx5IHN1cHBvcnRzIHRoZW0K PiA+IHdpdGggQUZCQy4KPiA+IAo+ID4gVGhlIGZvcm1hdHMgdGhlbXNlbHZlcyBoYXZlIG5vIG5v dGlvbiBvZiB0aWxpbmcgb3IgZ3JvdXBpbmcgLSB0aGUKPiA+IG1vZGlmaWVyIGFkZHMgdGhhdC4g SSdtIG5vdCBhd2FyZSBvZiBhbnkgbm9uLUFGQkMgdXNlcyBvZiB0aGVzZQo+ID4gZm9ybWF0cywg c28gSSBkb24ndCB3YW50IHRvICJtYWtlIHVwIiBhIHNtYWxsLXRpbGUgbGF5b3V0IHJlc3RyaWN0 aW9uCj4gPiBmb3IgdGhlbS4KPiAKPiBBaCwgSSBtaXNzZWQgdGhhdC4KPiAKPiA+ID4gRm9yIHZl cnkgc3BlY2lhbCBzdHVmZiBsaWtlIGFmYmMgeW91IG5lZWQgdG8gdmFsaWRhdGUgaW4gdGhlIGRy aXZlcgo+ID4gPiBhbnl3YXksIHRvbyBjb21wbGljYXRlZC4gU28gSSBoYXZlIG5vIGlkZWEgd2h5 IHlvdSBicmluZyB0aGlzIHVwIGhlcmU/Cj4gPiAKPiA+IFN1cmUsIHdlIGNhbiBqdXN0IGxldCBk cml2ZXJzIHByb3ZpZGUgdGhlaXIgb3duIGZvcm1hdF9pbmZvJ3MgZm9yCj4gPiB0aGVzZSwgaWYg dGhhdCdzIHdoYXQgeW91IHByZWZlci4gVGhlIGNvcmUgZm9ybWF0IGNoZWNraW5nIGNvZGUgY2Fu Cj4gPiBlcnJvciBvdXQgaWYgaXQgZXZlciBlbmNvdW50ZXJzIHRoZW0uCj4gCj4gSXQncyBmb3Jt YXRfaW5mbyB3ZSdyZSB0YWxraW5nIGFib3V0LiBXaGF0IEkgbWVhbiBpcyB0aGF0IHlvdSBqdXN0 IHNldCBhbGwKPiB0aGVzZSB0byAwIGFuZCBsZXQgdGhlIGZvcm1hdF9pbmZvIGNvZGUgaWdub3Jl IGl0LiBBbmQgdGhlbiBoYXZpbmcgYQo+IGJlc3Bva2UgZHJtX2Zvcm1hdF9jaGVja19hZmJjIGhl bHBlciBmdW5jdGlvbiBvciBzaW1pbGFyLCB3aGljaCBjaGVja3MgYWxsCj4gdGhlIGxheW91dCBy ZXN0cmljdGlvbnMgb2YgYWZiYy4KPiAKPiBJIHN0aWxsIG1haW50YWluIHRoYXQgYnBwIGFuZCB0 aWxlX3NpemUgYXJlIGVxdWF2YWxlbnQsIGFuZCB3ZSByZWFsbHkKPiBkb24ndCBuZWVkIGJvdGgu IEJvdGggYXJlIGRlZmFjdG8gYSBmb3JtIG9mIG51bWVyYXRvci9kZW51bWVyYXRvci4gSWYgeW91 Cj4gZG9uJ3QgbGlrZSB0aGF0IHlvdSBoYXZlIHRvIGludHJvZHVjZSAiZmFrZSIgdGlsZXMgZm9y IGFmYmMsIHRoZW4gd2UgY2FuCj4gcmVuYW1lIHRpbGVfc2l6ZSB0byBudW1lcmF0b3IgYW5kIHRp bGVfaC93IHRvIGRlbnVtZXJhdG9yX2gvdy4gRG9lc24ndAo+IGNoYW5nZSBvbmUgYml0IG9mIHRo ZSBtYXRoLiBicHAgc2ltcGx5IGhhcmRjb2RlcyBhIGRlbnVtZXJhdG9yIG9mIDgsIGFuZCBJCj4g ZG9uJ3Qgc2VlIHdoeSB3ZSBuZWVkIHRoYXQgc3BlY2lhbCBjYXNlLiBFeGNlcHQgaWYgeW91IGxv dmUgdG8gd3JpdGUKPiByZWR1bmRhbnQgc2VsZiB0ZXN0cyBmb3IgYWxsIHRoZSBtYXRoIDotKQoK TXkgJC4wMiB3b3J0aCBvZiB0aG91Z2h0czoKCkkgZ2V0IHRoZSBmYWN0IHRoYXQgRGFuaWVsIGRv ZXNuJ3QgbGlrZSB1cyB0byBhZGQgMyBuZXcgdmFyaWFibGVzIGludG8KZm9ybWF0X2luZm8gKGJw cCwgdGlsZV93LCB0aWxlX2gpIGFuZCB0aGF0IGFkZGluZyBhICJiaXRzX3Blcl91bml0Igp2YXJp YWJsZSBzaG91bGQgYmUgYWJsZSB0byB0YWtlIGNhcmUgb2YgbGluZWFyICh3aGVyZSB1bml0ID0g MSBwaXhlbCkKYW5kIHRpbGVkICh3aGVyZSB1bml0ID0gdGlsZV93ICogdGlsZV9oIHBpeGVscykg Zm9ybWF0cy4gQW5kIEkgYWxzbyBzZWUKRGFuaWVsJ3Mgb3B0aW9uIDIgYmVsb3csIHdoZXJlIGhl IHNheXMgaXQgaXMgcmVhc29uYWJsZSB0byBjaGVjayBBRkJDCndpdGhvdXQgdXNpbmcgZm9ybWF0 X2luZm8uIAoKSG93ZXZlciwgdGhlIHByb2JsZW0gd2UgYXJlIHRyeWluZyB0byBzb2x2ZSBpcyAy IGZvbGQ6IHdlIGFyZSB0cnlpbmcgdG8KY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBmcmFtZWJ1 ZmZlciAoYW5kIHRoZSAiYml0c19wZXJfdW5pdCIgb3IKQnJpYW4ncyBicHAgaXMgdXNlZnVsIGZv ciB0aGF0KSwgYnV0IHdlIGFsc28gdHJ5IHRvIHZhbGlkYXRlIHRoZSBzaXplcwpwYXNzZWQgYnkg dXNlcnNwYWNlIGJhc2VkIG9uIHRoZSBkcm1fZm91cmNjLmgrbW9kaWZpZXIgaW5mby4gSW4gdGhh dApjYXNlLCB0aGUgZHJpdmVyIHN0aWxsIG5lZWRzIHRvIHN0b3JlIHNvbWV3aGVyZSB0aGUgdGls ZV93L3RpbGVfaCBmb3IKdGhhdCBnaXZlbiBmb3JtYXQgaW4gb3JkZXIgdG8gY2hlY2sgdGhhdCB0 aGUgc3RyaWRlIGlzIGEgd2hvbGUgbXVsdGlwbGUKb2YgdGlsZSBzaXplcywgc28gd2UgdGhvdWdo dCB0aGF0IHB1dHRpbmcgaXQgaW4gZm9ybWF0X2luZm8gaXMgbm90CmVudGlyZWx5IHBvaW50bGVz cywgYmVjYXVzZSBvdGhlcnMgbWlnaHQgdXNlIHRob3NlIHZhcmlhYmxlcyBpbiBvcmRlciB0bwpk byB0aGVpciBkcml2ZXIgc3BlY2lmaWMgdmFsaWRhdGlvbiwgd2l0aG91dCBjcmVhdGluZyBuZXcg c3RydWN0dXJlcy4KCkRpZCBJIGNhcHR1cmUgdGhlIGRpc2N1c3Npb24gY29ycmVjdGx5PyBJZiBz bywgY2FuIHdlIGFncmVlIHRoYXQgaXQgaXMKbm90IGp1c3QgdGhlIGZyYW1lYnVmZmVyIHNpemUg Y2FsY3VsYXRpb24gdGhhdCBtYXR0ZXJzIGFuZCB0aGF0IHRpbGVkCmZvcm1hdHMgdmFsaWRhdGlv biByZXF1aXJlcyBhIHRpbGVfdy90aWxlX2ggaW5mbywgdGhlcmVmb3JlIEFsZXgncwpwYXRjaGVz IGFuZCBCcmlhbidzIG5lZWQgdG8gYmUgZGlzY3Vzc2VkIHNlcGFyYXRlbHkgKHNvIHRoYXQgd2Ug Y2FuCmJpa2VzaGVkIG9uIHdoZXRoZXIgZm9ybWF0X2luZm8gaXMgdGhlIHJpZ2h0IHBsYWNlIG9y IG5vdCk/CgpCZXN0IHJlZ2FyZHMsCkxpdml1Cgo+IAo+IFNvIHR3byBvcHRpb25zIHRoYXQgSSB0 aGluayBhcmUgcmVhc29uYWJsZToKPiAtIG9uZSBjb21tb24gbnVtZXJhdG9yL2RlbnVtZXJhdG9y LiBJIGRvbid0IGNhcmUgaG93IHlvdSBjYWxsIHRoYXQKPiAgIGJpa2VzaGVkLgo+IC0gZG9uJ3Qg Y2hlY2sgYWZiYyB1c2luZyBmb3JtYXRfaW5mbywgaGF2ZSB5b3VyIG93biBoZWxwZXIgdGhhdCBk b2VzIHRoYXQKPiAgIHVzaW5nIGN1c3RvbSBjb2RlLgo+IAo+IENoZWVycywgRGFuaWVsCj4gCj4g PiBDaGVlcnMsCj4gPiAtQnJpYW4KPiA+IAo+ID4gPiAtRGFuaWVsCj4gPiA+IAo+ID4gPiA+IAo+ ID4gPiA+IENoZWVycywKPiA+ID4gPiAtQnJpYW4KPiA+ID4gPiAKPiA+ID4gPiA+Cj4gPiA+ID4g PiA+IC0tLQo+ID4gPiA+ID4gPiAgZHJpdmVycy9ncHUvZHJtL2RybV9mYl9jbWFfaGVscGVyLmMg ICAgICAgICAgfCAgNiArKystCj4gPiA+ID4gPiA+ICBkcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hl bHBlci5jICAgICAgICAgICAgICB8ICA4ICsrKy0tCj4gPiA+ID4gPiA+ICBkcml2ZXJzL2dwdS9k cm0vZHJtX2ZvdXJjYy5jICAgICAgICAgICAgICAgICB8IDUwICsrKysrKysrKysrKysrKysrKysr KysrKysrKysKPiA+ID4gPiA+ID4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fZnJhbWVidWZmZXIuYyAg ICAgICAgICAgIHwgIDggKystLS0KPiA+ID4gPiA+ID4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fZ2Vt X2ZyYW1lYnVmZmVyX2hlbHBlci5jIHwgIDMgKy0KPiA+ID4gPiA+ID4gIGluY2x1ZGUvZHJtL2Ry bV9mb3VyY2MuaCAgICAgICAgICAgICAgICAgICAgIHwgIDQgKysrCj4gPiA+ID4gPiA+ICA2IGZp bGVzIGNoYW5nZWQsIDcwIGluc2VydGlvbnMoKyksIDkgZGVsZXRpb25zKC0pCj4gPiA+ID4gPiA+ Cj4gPiA+ID4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2NtYV9oZWxw ZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfY21hX2hlbHBlci5jCj4gPiA+ID4gPiA+IGlu ZGV4IDE4NmQwMGFkZmI1Zi4uZTI3OWQ3MGQzZTYwIDEwMDY0NAo+ID4gPiA+ID4gPiAtLS0gYS9k cml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2NtYV9oZWxwZXIuYwo+ID4gPiA+ID4gPiArKysgYi9kcml2 ZXJzL2dwdS9kcm0vZHJtX2ZiX2NtYV9oZWxwZXIuYwo+ID4gPiA+ID4gPiBAQCAtMTE4LDEzICsx MTgsMTcgQEAgZG1hX2FkZHJfdCBkcm1fZmJfY21hX2dldF9nZW1fYWRkcihzdHJ1Y3QgZHJtX2Zy YW1lYnVmZmVyICpmYiwKPiA+ID4gPiA+ID4gIHsKPiA+ID4gPiA+ID4gIAlzdHJ1Y3QgZHJtX2dl bV9jbWFfb2JqZWN0ICpvYmo7Cj4gPiA+ID4gPiA+ICAJZG1hX2FkZHJfdCBwYWRkcjsKPiA+ID4g PiA+ID4gKwl1OCBicHAgPSBkcm1fZm9ybWF0X2luZm9fcGxhbmVfYnBwKGZiLT5mb3JtYXQsIHBs YW5lKTsKPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiArCS8qIFRoaXMgY2FuJ3Qgd29yayBmb3Ig bm9uLWludGVnZXIgYnl0ZXMtcGVyLXBpeGVsICovCj4gPiA+ID4gPiA+ICsJV0FSTl9PTihicHAg JSA4KTsKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gIAlvYmogPSBkcm1fZmJfY21hX2dldF9nZW1f b2JqKGZiLCBwbGFuZSk7Cj4gPiA+ID4gPiA+ICAJaWYgKCFvYmopCj4gPiA+ID4gPiA+ICAJCXJl dHVybiAwOwo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiAgCXBhZGRyID0gb2JqLT5wYWRkciArIGZi LT5vZmZzZXRzW3BsYW5lXTsKPiA+ID4gPiA+ID4gLQlwYWRkciArPSBmYi0+Zm9ybWF0LT5jcHBb cGxhbmVdICogKHN0YXRlLT5zcmNfeCA+PiAxNik7Cj4gPiA+ID4gPiA+ICsJcGFkZHIgKz0gKGJw cCAvIDgpICogKHN0YXRlLT5zcmNfeCA+PiAxNik7Cj4gPiA+ID4gPiA+ICAJcGFkZHIgKz0gZmIt PnBpdGNoZXNbcGxhbmVdICogKHN0YXRlLT5zcmNfeSA+PiAxNik7Cj4gPiA+ID4gPiA+Cj4gPiA+ ID4gPiA+ICAJcmV0dXJuIHBhZGRyOwo+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2RybV9mYl9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMK PiA+ID4gPiA+ID4gaW5kZXggMDY0NmIxMDgwMzBiLi5hYjM2OWYyNTBhZjQgMTAwNjQ0Cj4gPiA+ ID4gPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKPiA+ID4gPiA+ID4g KysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYwo+ID4gPiA+ID4gPiBAQCAtMTU3 Miw2ICsxNTcyLDcgQEAgaW50IGRybV9mYl9oZWxwZXJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJf c2NyZWVuaW5mbyAqdmFyLAo+ID4gPiA+ID4gPiAgCXN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9o ZWxwZXIgPSBpbmZvLT5wYXI7Cj4gPiA+ID4gPiA+ICAJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAq ZmIgPSBmYl9oZWxwZXItPmZiOwo+ID4gPiA+ID4gPiAgCWludCBkZXB0aDsKPiA+ID4gPiA+ID4g Kwl1OCBicHAgPSBkcm1fZm9ybWF0X2luZm9fcGxhbmVfYnBwKGZiLT5mb3JtYXQsIDApOwo+ID4g PiA+ID4gPgo+ID4gPiA+ID4gPiAgCWlmICh2YXItPnBpeGNsb2NrICE9IDAgfHwgaW5fZGJnX21h c3RlcigpKQo+ID4gPiA+ID4gPiAgCQlyZXR1cm4gLUVJTlZBTDsKPiA+ID4gPiA+ID4gQEAgLTE1 ODAsMTQgKzE1ODEsMTQgQEAgaW50IGRybV9mYl9oZWxwZXJfY2hlY2tfdmFyKHN0cnVjdCBmYl92 YXJfc2NyZWVuaW5mbyAqdmFyLAo+ID4gPiA+ID4gPiAgCSAqIENoYW5nZXMgc3RydWN0IGZiX3Zh cl9zY3JlZW5pbmZvIGFyZSBjdXJyZW50bHkgbm90IHB1c2hlZCBiYWNrCj4gPiA+ID4gPiA+ICAJ ICogdG8gS01TLCBoZW5jZSBmYWlsIGlmIGRpZmZlcmVudCBzZXR0aW5ncyBhcmUgcmVxdWVzdGVk Lgo+ID4gPiA+ID4gPiAgCSAqLwo+ID4gPiA+ID4gPiAtCWlmICh2YXItPmJpdHNfcGVyX3BpeGVs ICE9IGZiLT5mb3JtYXQtPmNwcFswXSAqIDggfHwKPiA+ID4gPiA+ID4gKwlpZiAodmFyLT5iaXRz X3Blcl9waXhlbCAhPSBicHAgfHwKPiA+ID4gPiA+ID4gIAkgICAgdmFyLT54cmVzID4gZmItPndp ZHRoIHx8IHZhci0+eXJlcyA+IGZiLT5oZWlnaHQgfHwKPiA+ID4gPiA+ID4gIAkgICAgdmFyLT54 cmVzX3ZpcnR1YWwgPiBmYi0+d2lkdGggfHwgdmFyLT55cmVzX3ZpcnR1YWwgPiBmYi0+aGVpZ2h0 KSB7Cj4gPiA+ID4gPiA+ICAJCURSTV9ERUJVRygiZmIgcmVxdWVzdGVkIHdpZHRoL2hlaWdodC9i cHAgY2FuJ3QgZml0IGluIGN1cnJlbnQgZmIgIgo+ID4gPiA+ID4gPiAgCQkJICAicmVxdWVzdCAl ZHglZC0lZCAodmlydHVhbCAlZHglZCkgPiAlZHglZC0lZFxuIiwKPiA+ID4gPiA+ID4gIAkJCSAg dmFyLT54cmVzLCB2YXItPnlyZXMsIHZhci0+Yml0c19wZXJfcGl4ZWwsCj4gPiA+ID4gPiA+ICAJ CQkgIHZhci0+eHJlc192aXJ0dWFsLCB2YXItPnlyZXNfdmlydHVhbCwKPiA+ID4gPiA+ID4gLQkJ CSAgZmItPndpZHRoLCBmYi0+aGVpZ2h0LCBmYi0+Zm9ybWF0LT5jcHBbMF0gKiA4KTsKPiA+ID4g PiA+ID4gKwkJCSAgZmItPndpZHRoLCBmYi0+aGVpZ2h0LCBicHApOwo+ID4gPiA+ID4gPiAgCQly ZXR1cm4gLUVJTlZBTDsKPiA+ID4gPiA+ID4gIAl9Cj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IEBA IC0xOTQ5LDExICsxOTUwLDEyIEBAIHZvaWQgZHJtX2ZiX2hlbHBlcl9maWxsX3ZhcihzdHJ1Y3Qg ZmJfaW5mbyAqaW5mbywgc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlCj4gPiA+ID4gPiA+ ICAJCQkgICAgdWludDMyX3QgZmJfd2lkdGgsIHVpbnQzMl90IGZiX2hlaWdodCkKPiA+ID4gPiA+ ID4gIHsKPiA+ID4gPiA+ID4gIAlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9IGZiX2hlbHBl ci0+ZmI7Cj4gPiA+ID4gPiA+ICsJdTggYnBwID0gZHJtX2Zvcm1hdF9pbmZvX3BsYW5lX2JwcChm Yi0+Zm9ybWF0LCAwKTsKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gIAlpbmZvLT5wc2V1ZG9fcGFs ZXR0ZSA9IGZiX2hlbHBlci0+cHNldWRvX3BhbGV0dGU7Cj4gPiA+ID4gPiA+ICAJaW5mby0+dmFy LnhyZXNfdmlydHVhbCA9IGZiLT53aWR0aDsKPiA+ID4gPiA+ID4gIAlpbmZvLT52YXIueXJlc192 aXJ0dWFsID0gZmItPmhlaWdodDsKPiA+ID4gPiA+ID4gLQlpbmZvLT52YXIuYml0c19wZXJfcGl4 ZWwgPSBmYi0+Zm9ybWF0LT5jcHBbMF0gKiA4Owo+ID4gPiA+ID4gPiArCWluZm8tPnZhci5iaXRz X3Blcl9waXhlbCA9IGJwcDsKPiA+ID4gPiA+ID4gIAlpbmZvLT52YXIuYWNjZWxfZmxhZ3MgPSBG Ql9BQ0NFTEZfVEVYVDsKPiA+ID4gPiA+ID4gIAlpbmZvLT52YXIueG9mZnNldCA9IDA7Cj4gPiA+ ID4gPiA+ICAJaW5mby0+dmFyLnlvZmZzZXQgPSAwOwo+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2RybV9mb3VyY2MuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZm91cmNj LmMKPiA+ID4gPiA+ID4gaW5kZXggM2I0MmMyNWJkNThkLi5iYjI4OTE5YzMyZjMgMTAwNjQ0Cj4g PiA+ID4gPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZm91cmNjLmMKPiA+ID4gPiA+ID4g KysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mb3VyY2MuYwo+ID4gPiA+ID4gPiBAQCAtMjcyLDEw ICsyNzIsNjAgQEAgaW50IGRybV9mb3JtYXRfcGxhbmVfY3BwKHVpbnQzMl90IGZvcm1hdCwgaW50 IHBsYW5lKQo+ID4gPiA+ID4gPiAgCWlmICghaW5mbyB8fCBwbGFuZSA+PSBpbmZvLT5udW1fcGxh bmVzKQo+ID4gPiA+ID4gPiAgCQlyZXR1cm4gMDsKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gKwkv Kgo+ID4gPiA+ID4gPiArCSAqIE5vdCB2YWxpZCBmb3IgZm9ybWF0cyB3aXRoIG5vbi1pbnRlZ2Vy IGNwcCwKPiA+ID4gPiA+ID4gKwkgKiB1c2UgZHJtX2Zvcm1hdHtfaW5mb31fcGxhbmVfYnBwIGlu c3RlYWQKPiA+ID4gPiA+ID4gKwkgKi8KPiA+ID4gPiA+ID4gKwlXQVJOX09OKCFpbmZvLT5jcHBb MF0pOwo+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ICAJcmV0dXJuIGluZm8tPmNwcFtwbGFuZV07 Cj4gPiA+ID4gPiA+ICB9Cj4gPiA+ID4gPiA+ICBFWFBPUlRfU1lNQk9MKGRybV9mb3JtYXRfcGxh bmVfY3BwKTsKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gKy8qKgo+ID4gPiA+ID4gPiArICogZHJt X2Zvcm1hdF9wbGFuZV9icHAgLSBkZXRlcm1pbmUgdGhlIGJpdHMgcGVyIHBpeGVsIHZhbHVlCj4g PiA+ID4gPiA+ICsgKiBAZm9ybWF0OiBwaXhlbCBmb3JtYXQgKERSTV9GT1JNQVRfKikKPiA+ID4g PiA+ID4gKyAqIEBwbGFuZTogcGxhbmUgaW5kZXgKPiA+ID4gPiA+ID4gKyAqCj4gPiA+ID4gPiA+ ICsgKiBSZXR1cm5zOgo+ID4gPiA+ID4gPiArICogVGhlIGJpdHMgcGVyIHBpeGVsIHZhbHVlIGZv ciB0aGUgc3BlY2lmaWVkIHBsYW5lLgo+ID4gPiA+ID4gPiArICovCj4gPiA+ID4gPiA+ICtpbnQg ZHJtX2Zvcm1hdF9wbGFuZV9icHAodWludDMyX3QgZm9ybWF0LCBpbnQgcGxhbmUpCj4gPiA+ID4g PiA+ICt7Cj4gPiA+ID4gPiA+ICsJY29uc3Qgc3RydWN0IGRybV9mb3JtYXRfaW5mbyAqaW5mbzsK PiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiArCWluZm8gPSBkcm1fZm9ybWF0X2luZm8oZm9ybWF0 KTsKPiA+ID4gPiA+ID4gKwlpZiAoIWluZm8pCj4gPiA+ID4gPiA+ICsJCXJldHVybiAwOwo+ID4g PiA+ID4gPiArCj4gPiA+ID4gPiA+ICsJcmV0dXJuIGRybV9mb3JtYXRfaW5mb19wbGFuZV9icHAo aW5mbywgcGxhbmUpOwo+ID4gPiA+ID4gPiArfQo+ID4gPiA+ID4gPiArRVhQT1JUX1NZTUJPTChk cm1fZm9ybWF0X3BsYW5lX2JwcCk7Cj4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gKy8qKgo+ID4g PiA+ID4gPiArICogZHJtX2Zvcm1hdF9pbmZvX3BsYW5lX2JwcCAtIGRldGVybWluZSB0aGUgYml0 cyBwZXIgcGl4ZWwgdmFsdWUKPiA+ID4gPiA+ID4gKyAqCj4gPiA+ID4gPiA+ICsgKiBDb252ZW5p ZW5jZSBmdW5jdGlvbiB3aGljaCBoYW5kbGVzIGZvcm1hdHMgd2l0aCBib3RoIGludGVnZXIKPiA+ ID4gPiA+ID4gKyAqIGFuZCBub24taW50ZWdlciBieXRlcy1wZXItcGl4ZWwuCj4gPiA+ID4gPiA+ ICsgKgo+ID4gPiA+ID4gPiArICogQGZvcm1hdDogcGl4ZWwgZm9ybWF0IGluZm8gc3RydWN0dXJl Cj4gPiA+ID4gPiA+ICsgKiBAcGxhbmU6IHBsYW5lIGluZGV4Cj4gPiA+ID4gPiA+ICsgKgo+ID4g PiA+ID4gPiArICogUmV0dXJuczoKPiA+ID4gPiA+ID4gKyAqIFRoZSBiaXRzIHBlciBwaXhlbCB2 YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBwbGFuZS4KPiA+ID4gPiA+ID4gKyAqLwo+ID4gPiA+ID4g PiAraW50IGRybV9mb3JtYXRfaW5mb19wbGFuZV9icHAoY29uc3Qgc3RydWN0IGRybV9mb3JtYXRf aW5mbyAqaW5mbywgaW50IHBsYW5lKQo+ID4gPiA+ID4gPiArewo+ID4gPiA+ID4gPiArCWlmIChw bGFuZSA+PSBpbmZvLT5udW1fcGxhbmVzKQo+ID4gPiA+ID4gPiArCQlyZXR1cm4gMDsKPiA+ID4g PiA+ID4gKwo+ID4gPiA+ID4gPiArCWlmIChpbmZvLT5jcHBbMF0pCj4gPiA+ID4gPiA+ICsJCXJl dHVybiBpbmZvLT5jcHBbcGxhbmVdICogODsKPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiArCXJl dHVybiBpbmZvLT5icHBbcGxhbmVdOwo+ID4gPiA+ID4gPiArfQo+ID4gPiA+ID4gPiArRVhQT1JU X1NZTUJPTChkcm1fZm9ybWF0X2luZm9fcGxhbmVfYnBwKTsKPiA+ID4gPiA+ID4gKwo+ID4gPiA+ ID4gPiAgLyoqCj4gPiA+ID4gPiA+ICAgKiBkcm1fZm9ybWF0X2hvcnpfY2hyb21hX3N1YnNhbXBs aW5nIC0gZ2V0IHRoZSBob3Jpem9udGFsIGNocm9tYSBzdWJzYW1wbGluZyBmYWN0b3IKPiA+ID4g PiA+ID4gICAqIEBmb3JtYXQ6IHBpeGVsIGZvcm1hdCAoRFJNX0ZPUk1BVF8qKQo+ID4gPiA+ID4g PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mcmFtZWJ1ZmZlci5jIGIvZHJpdmVy cy9ncHUvZHJtL2RybV9mcmFtZWJ1ZmZlci5jCj4gPiA+ID4gPiA+IGluZGV4IDhjNGQzMmFkY2Mx Ny4uN2UwMDM2MGZmNzBkIDEwMDY0NAo+ID4gPiA+ID4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0v ZHJtX2ZyYW1lYnVmZmVyLmMKPiA+ID4gPiA+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9m cmFtZWJ1ZmZlci5jCj4gPiA+ID4gPiA+IEBAIC0xODUsMjAgKzE4NSwyMCBAQCBzdGF0aWMgaW50 IGZyYW1lYnVmZmVyX2NoZWNrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4gPiA+ID4gPiA+ICAJ Zm9yIChpID0gMDsgaSA8IGluZm8tPm51bV9wbGFuZXM7IGkrKykgewo+ID4gPiA+ID4gPiAgCQl1 bnNpZ25lZCBpbnQgd2lkdGggPSBmYl9wbGFuZV93aWR0aChyLT53aWR0aCwgaW5mbywgaSk7Cj4g PiA+ID4gPiA+ICAJCXVuc2lnbmVkIGludCBoZWlnaHQgPSBmYl9wbGFuZV9oZWlnaHQoci0+aGVp Z2h0LCBpbmZvLCBpKTsKPiA+ID4gPiA+ID4gLQkJdW5zaWduZWQgaW50IGNwcCA9IGluZm8tPmNw cFtpXTsKPiA+ID4gPiA+ID4gKwkJdW5zaWduZWQgaW50IGJwcCA9IGRybV9mb3JtYXRfaW5mb19w bGFuZV9icHAoaW5mbywgaSk7Cj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ICAJCWlmICghci0+aGFu ZGxlc1tpXSkgewo+ID4gPiA+ID4gPiAgCQkJRFJNX0RFQlVHX0tNUygibm8gYnVmZmVyIG9iamVj dCBoYW5kbGUgZm9yIHBsYW5lICVkXG4iLCBpKTsKPiA+ID4gPiA+ID4gIAkJCXJldHVybiAtRUlO VkFMOwo+ID4gPiA+ID4gPiAgCQl9Cj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IC0JCWlmICgodWlu dDY0X3QpIHdpZHRoICogY3BwID4gVUlOVF9NQVgpCj4gPiA+ID4gPiA+ICsJCWlmICgodWludDY0 X3QpIERJVl9ST1VORF9VUCh3aWR0aCAqIGJwcCwgOCkgPiBVSU5UX01BWCkKPiA+ID4gPiA+ID4g IAkJCXJldHVybiAtRVJBTkdFOwo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiAgCQlpZiAoKHVpbnQ2 NF90KSBoZWlnaHQgKiByLT5waXRjaGVzW2ldICsgci0+b2Zmc2V0c1tpXSA+IFVJTlRfTUFYKQo+ ID4gPiA+ID4gPiAgCQkJcmV0dXJuIC1FUkFOR0U7Cj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IC0J CWlmIChyLT5waXRjaGVzW2ldIDwgd2lkdGggKiBjcHApIHsKPiA+ID4gPiA+ID4gKwkJaWYgKCh1 aW50NjRfdCkgci0+cGl0Y2hlc1tpXSAqIDggPCAodWludDY0X3QpIHdpZHRoICogYnBwKSB7Cj4g PiA+ID4gPiA+ICAJCQlEUk1fREVCVUdfS01TKCJiYWQgcGl0Y2ggJXUgZm9yIHBsYW5lICVkXG4i LCByLT5waXRjaGVzW2ldLCBpKTsKPiA+ID4gPiA+ID4gIAkJCXJldHVybiAtRUlOVkFMOwo+ID4g PiA+ID4gPiAgCQl9Cj4gPiA+ID4gPiA+IEBAIC00NzYsNyArNDc2LDcgQEAgaW50IGRybV9tb2Rl X2dldGZiKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4gPiA+ID4gPiA+ICAJci0+aGVpZ2h0ID0g ZmItPmhlaWdodDsKPiA+ID4gPiA+ID4gIAlyLT53aWR0aCA9IGZiLT53aWR0aDsKPiA+ID4gPiA+ ID4gIAlyLT5kZXB0aCA9IGZiLT5mb3JtYXQtPmRlcHRoOwo+ID4gPiA+ID4gPiAtCXItPmJwcCA9 IGZiLT5mb3JtYXQtPmNwcFswXSAqIDg7Cj4gPiA+ID4gPiA+ICsJci0+YnBwID0gZHJtX2Zvcm1h dF9pbmZvX3BsYW5lX2JwcChmYi0+Zm9ybWF0LCAwKTsKPiA+ID4gPiA+ID4gIAlyLT5waXRjaCA9 IGZiLT5waXRjaGVzWzBdOwo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiAgCS8qIEdFVF9GQigpIGlz IGFuIHVucHJpdmlsZWdlZCBpb2N0bCBzbyB3ZSBtdXN0IG5vdCByZXR1cm4gYQo+ID4gPiA+ID4g PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9nZW1fZnJhbWVidWZmZXJfaGVscGVy LmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbV9mcmFtZWJ1ZmZlcl9oZWxwZXIuYwo+ID4gPiA+ ID4gPiBpbmRleCBhY2ZiYzA2NDFhMDYuLmRmZTIyNGNjYWViYSAxMDA2NDQKPiA+ID4gPiA+ID4g LS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9nZW1fZnJhbWVidWZmZXJfaGVscGVyLmMKPiA+ID4g PiA+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9nZW1fZnJhbWVidWZmZXJfaGVscGVyLmMK PiA+ID4gPiA+ID4gQEAgLTE2MSw2ICsxNjEsNyBAQCBkcm1fZ2VtX2ZiX2NyZWF0ZV93aXRoX2Z1 bmNzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwKPiA+ID4g PiA+ID4gIAkJdW5zaWduZWQgaW50IHdpZHRoID0gbW9kZV9jbWQtPndpZHRoIC8gKGkgPyBpbmZv LT5oc3ViIDogMSk7Cj4gPiA+ID4gPiA+ICAJCXVuc2lnbmVkIGludCBoZWlnaHQgPSBtb2RlX2Nt ZC0+aGVpZ2h0IC8gKGkgPyBpbmZvLT52c3ViIDogMSk7Cj4gPiA+ID4gPiA+ICAJCXVuc2lnbmVk IGludCBtaW5fc2l6ZTsKPiA+ID4gPiA+ID4gKwkJdTggYnBwID0gZHJtX2Zvcm1hdF9pbmZvX3Bs YW5lX2JwcChmYi0+Zm9ybWF0LCBpKTsKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gIAkJb2Jqc1tp XSA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChmaWxlLCBtb2RlX2NtZC0+aGFuZGxlc1tpXSk7Cj4g PiA+ID4gPiA+ICAJCWlmICghb2Jqc1tpXSkgewo+ID4gPiA+ID4gPiBAQCAtMTcwLDcgKzE3MSw3 IEBAIGRybV9nZW1fZmJfY3JlYXRlX3dpdGhfZnVuY3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwg c3RydWN0IGRybV9maWxlICpmaWxlLAo+ID4gPiA+ID4gPiAgCQl9Cj4gPiA+ID4gPiA+Cj4gPiA+ ID4gPiA+ICAJCW1pbl9zaXplID0gKGhlaWdodCAtIDEpICogbW9kZV9jbWQtPnBpdGNoZXNbaV0K PiA+ID4gPiA+ID4gLQkJCSArIHdpZHRoICogaW5mby0+Y3BwW2ldCj4gPiA+ID4gPiA+ICsJCQkg KyBESVZfUk9VTkRfVVAod2lkdGggKiBicHAsIDgpCj4gPiA+ID4gPiA+ICAJCQkgKyBtb2RlX2Nt ZC0+b2Zmc2V0c1tpXTsKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gIAkJaWYgKG9ianNbaV0tPnNp emUgPCBtaW5fc2l6ZSkgewo+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJt X2ZvdXJjYy5oIGIvaW5jbHVkZS9kcm0vZHJtX2ZvdXJjYy5oCj4gPiA+ID4gPiA+IGluZGV4IDNl ODY0MDhkYWM5Zi4uZDRhZjRkYWIxNjIzIDEwMDY0NAo+ID4gPiA+ID4gPiAtLS0gYS9pbmNsdWRl L2RybS9kcm1fZm91cmNjLmgKPiA+ID4gPiA+ID4gKysrIGIvaW5jbHVkZS9kcm0vZHJtX2ZvdXJj Yy5oCj4gPiA+ID4gPiA+IEBAIC0zNiw2ICszNiw3IEBAIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQy Owo+ID4gPiA+ID4gPiAgICoJdXNlIGluIG5ldyBjb2RlIGFuZCBzZXQgdG8gMCBmb3IgbmV3IGZv cm1hdHMuCj4gPiA+ID4gPiA+ICAgKiBAbnVtX3BsYW5lczogTnVtYmVyIG9mIGNvbG9yIHBsYW5l cyAoMSB0byAzKQo+ID4gPiA+ID4gPiAgICogQGNwcDogTnVtYmVyIG9mIGJ5dGVzIHBlciBwaXhl bCAocGVyIHBsYW5lKQo+ID4gPiA+ID4gPiArICogQGJwcDogTnVtYmVyIG9mIGJpdHMgcGVyIHBp eGVsIChwZXIgcGxhbmUpLCBvbmx5IHZhbGlkIGlmIGNwcFswXSA9PSAwLgo+ID4gPiA+ID4gPiAg ICogQGhzdWI6IEhvcml6b250YWwgY2hyb21hIHN1YnNhbXBsaW5nIGZhY3Rvcgo+ID4gPiA+ID4g PiAgICogQHZzdWI6IFZlcnRpY2FsIGNocm9tYSBzdWJzYW1wbGluZyBmYWN0b3IKPiA+ID4gPiA+ ID4gICAqIEBoYXNfYWxwaGE6IERvZXMgdGhlIGZvcm1hdCBlbWJlZHMgYW4gYWxwaGEgY29tcG9u ZW50Pwo+ID4gPiA+ID4gPiBAQCAtNDUsNiArNDYsNyBAQCBzdHJ1Y3QgZHJtX2Zvcm1hdF9pbmZv IHsKPiA+ID4gPiA+ID4gIAl1OCBkZXB0aDsKPiA+ID4gPiA+ID4gIAl1OCBudW1fcGxhbmVzOwo+ ID4gPiA+ID4gPiAgCXU4IGNwcFszXTsKPiA+ID4gPiA+ID4gKwl1OCBicHBbM107Cj4gPiA+ID4g PiA+ICAJdTggaHN1YjsKPiA+ID4gPiA+ID4gIAl1OCB2c3ViOwo+ID4gPiA+ID4gPiAgCWJvb2wg aGFzX2FscGhhOwo+ID4gPiA+ID4gPiBAQCAtNjYsNiArNjgsOCBAQCBkcm1fZ2V0X2Zvcm1hdF9p bmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4gPiA+ID4gPiA+ICB1aW50MzJfdCBkcm1fbW9k ZV9sZWdhY3lfZmJfZm9ybWF0KHVpbnQzMl90IGJwcCwgdWludDMyX3QgZGVwdGgpOwo+ID4gPiA+ ID4gPiAgaW50IGRybV9mb3JtYXRfbnVtX3BsYW5lcyh1aW50MzJfdCBmb3JtYXQpOwo+ID4gPiA+ ID4gPiAgaW50IGRybV9mb3JtYXRfcGxhbmVfY3BwKHVpbnQzMl90IGZvcm1hdCwgaW50IHBsYW5l KTsKPiA+ID4gPiA+ID4gK2ludCBkcm1fZm9ybWF0X3BsYW5lX2JwcCh1aW50MzJfdCBmb3JtYXQs IGludCBwbGFuZSk7Cj4gPiA+ID4gPiA+ICtpbnQgZHJtX2Zvcm1hdF9pbmZvX3BsYW5lX2JwcChj b25zdCBzdHJ1Y3QgZHJtX2Zvcm1hdF9pbmZvICpmb3JtYXQsIGludCBwbGFuZSk7Cj4gPiA+ID4g PiA+ICBpbnQgZHJtX2Zvcm1hdF9ob3J6X2Nocm9tYV9zdWJzYW1wbGluZyh1aW50MzJfdCBmb3Jt YXQpOwo+ID4gPiA+ID4gPiAgaW50IGRybV9mb3JtYXRfdmVydF9jaHJvbWFfc3Vic2FtcGxpbmco dWludDMyX3QgZm9ybWF0KTsKPiA+ID4gPiA+ID4gIGludCBkcm1fZm9ybWF0X3BsYW5lX3dpZHRo KGludCB3aWR0aCwgdWludDMyX3QgZm9ybWF0LCBpbnQgcGxhbmUpOwo+ID4gPiA+ID4gPiAtLQo+ ID4gPiA+ID4gPiAyLjE2LjEKPiA+ID4gPiA+ID4KPiA+ID4gPiA+Cj4gPiA+ID4gPiAtLQo+ID4g PiA+ID4gRGFuaWVsIFZldHRlcgo+ID4gPiA+ID4gU29mdHdhcmUgRW5naW5lZXIsIEludGVsIENv cnBvcmF0aW9uCj4gPiA+ID4gPiBodHRwOi8vYmxvZy5mZndsbC5jaAo+ID4gPiAKPiA+ID4gLS0g Cj4gPiA+IERhbmllbCBWZXR0ZXIKPiA+ID4gU29mdHdhcmUgRW5naW5lZXIsIEludGVsIENvcnBv cmF0aW9uCj4gPiA+IGh0dHA6Ly9ibG9nLmZmd2xsLmNoCj4gPiBfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+ID4gZHJpLWRldmVsIG1haWxpbmcgbGlzdAo+ ID4gZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+ID4gaHR0cHM6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwKPiAKPiAtLSAKPiBEYW5pZWwg VmV0dGVyCj4gU29mdHdhcmUgRW5naW5lZXIsIEludGVsIENvcnBvcmF0aW9uCj4gaHR0cDovL2Js b2cuZmZ3bGwuY2gKCi0tIAo9PT09PT09PT09PT09PT09PT09PQp8IEkgd291bGQgbGlrZSB0byB8 CnwgZml4IHRoZSB3b3JsZCwgIHwKfCBidXQgdGhleSdyZSBub3QgfAp8IGdpdmluZyBtZSB0aGUg ICB8CiBcIHNvdXJjZSBjb2RlISAgLwogIC0tLS0tLS0tLS0tLS0tLQogICAgwq9cXyjjg4QpXy/C rwpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2 ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK