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 D66ABC6778D for ; Wed, 12 Sep 2018 15:40:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6C5EA20833 for ; Wed, 12 Sep 2018 15:40:31 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6C5EA20833 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 S1727616AbeILUpc (ORCPT ); Wed, 12 Sep 2018 16:45:32 -0400 Received: from foss.arm.com ([217.140.101.70]:33974 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726640AbeILUpc (ORCPT ); Wed, 12 Sep 2018 16:45:32 -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 ADFAF7A9; Wed, 12 Sep 2018 08:40:27 -0700 (PDT) Received: from DESKTOP-E1NTVVP.localdomain (desktop-e1ntvvp.cambridge.arm.com [10.1.34.160]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 8F9E73F5C0; Wed, 12 Sep 2018 08:40:25 -0700 (PDT) Date: Wed, 12 Sep 2018 16:40:17 +0100 From: Brian Starkey To: Liviu Dudau Cc: 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: <20180912154016.GA22445@DESKTOP-E1NTVVP.localdomain> 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> <20180912152704.GF936@e110455-lin.cambridge.arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20180912152704.GF936@e110455-lin.cambridge.arm.com> User-Agent: Mutt/1.9.4 (2018-02-28) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Sep 12, 2018 at 04:27:04PM +0100, Liviu Dudau wrote: >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. Even if we only wanted to do one of those things (calculate the size in bytes of the framebuffer), we need to know the bits_per_unit, as well as the number of units. Without the second (+third) variables, we can't figure out number of units and so we can't figure out the size. Separate point: modifiers certainly shouldn't come in to this discussion - modifier-related validation is always going to need to be in the driver, and is a separate thing entirely (not contained in drm_format_info). > >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)? It looks to me that the right thing to do is set cpp to zero for the "non integer" formats I want to add, and entirely defer to drivers to figure those out (after all, any size calculation the core does for them will be moot, because they are only valid with modifiers, and modifiers can change the size). How the tiled stuff (Y0L0, Y0L2) gets described can be a separate topic. If it happens to support non-integer cpp formats as a side effect, then more the better - when someone comes along with a non-integer-cpp format which actually _is_ supported in linear layout they can use it. I hope Daniel can describe in more detail exactly how he sees that bit working though, because I don't think that either Alex or me understand that yet. Cheers, -Brian > >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: Brian Starkey 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:40:17 +0100 Message-ID: <20180912154016.GA22445@DESKTOP-E1NTVVP.localdomain> 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> <20180912152704.GF936@e110455-lin.cambridge.arm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from foss.arm.com (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by gabe.freedesktop.org (Postfix) with ESMTP id D2F7588F04 for ; Wed, 12 Sep 2018 15:40:27 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20180912152704.GF936@e110455-lin.cambridge.arm.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Liviu Dudau Cc: airlied@linux.ie, alexandru-cosmin.gheorghe@arm.com, linux-kernel@vger.kernel.org, tfiga@chromium.org, seanpaul@chromium.org, dri-devel@lists.freedesktop.org, hoegsberg@chromium.org, ayan.halder@arm.com List-Id: dri-devel@lists.freedesktop.org T24gV2VkLCBTZXAgMTIsIDIwMTggYXQgMDQ6Mjc6MDRQTSArMDEwMCwgTGl2aXUgRHVkYXUgd3Jv dGU6Cj5PbiBNb24sIFNlcCAxMCwgMjAxOCBhdCAwOTo1MzoyNVBNICswMjAwLCBEYW5pZWwgVmV0 dGVyIHdyb3RlOgo+PiBPbiBNb24sIFNlcCAxMCwgMjAxOCBhdCAwOTo1MDowM0FNICswMTAwLCBC cmlhbiBTdGFya2V5IHdyb3RlOgo+PiA+IEhpLAo+PiA+Cj4+ID4gT24gRnJpLCBTZXAgMDcsIDIw MTggYXQgMDk6Mjg6NDRQTSArMDIwMCwgRGFuaWVsIFZldHRlciB3cm90ZToKPj4gPiA+IE9uIEZy aSwgU2VwIDA3LCAyMDE4IGF0IDAxOjQ1OjM2UE0gKzAxMDAsIEJyaWFuIFN0YXJrZXkgd3JvdGU6 Cj4+ID4gPiA+IEhpIERhbmllbCwKPj4gPiA+ID4KPj4gPiA+ID4gT24gRnJpLCBBdWcgMzEsIDIw MTggYXQgMTA6MTc6MzBBTSArMDIwMCwgRGFuaWVsIFZldHRlciB3cm90ZToKPj4gPiA+ID4gPiBP biBUaHUsIEF1ZyAyMywgMjAxOCBhdCAwNDoyMzo0MVBNICswMTAwLCBCcmlhbiBTdGFya2V5IHdy b3RlOgo+PiA+ID4gPiA+ID4gU29tZSBmb3JtYXRzIGhhdmUgYSBub24taW50ZWdlciBudW1iZXIg b2YgYnl0ZXMgcGVyIHBpeGVsLCB3aGljaCBjYW4ndAo+PiA+ID4gPiA+ID4gYmUgaGFuZGxlZCB3 aXRoIHRoZSBleGlzdGluZyAnY3BwJyBmaWVsZCBpbiBkcm1fZm9ybWF0X2luZm8uIFRvIGhhbmRs ZQo+PiA+ID4gPiA+ID4gdGhlc2UgZm9ybWF0cywgYWRkIGEgJ2JwcCcgZmllbGQsIHdoaWNoIGlz IG9ubHkgdXNlZCBpZiBjcHBbMF0gPT0gMC4KPj4gPiA+ID4gPiA+Cj4+ID4gPiA+ID4gPiBUaGlz IHVwZGF0ZXMgYWxsIHRoZSB1c2VycyBvZiBmb3JtYXQtPmNwcCBpbiB0aGUgY29yZSBEUk0gY29k ZSwKPj4gPiA+ID4gPiA+IGNvbnZlcnRpbmcgdGhlbSB0byB1c2UgYSBuZXcgZnVuY3Rpb24gdG8g Z2V0IHRoZSBiaXRzLXBlci1waXhlbCBmb3IgYW55Cj4+ID4gPiA+ID4gPiBmb3JtYXQuCj4+ID4g PiA+ID4gPgo+PiA+ID4gPiA+ID4gSXQncyBhc3N1bWVkIHRoYXQgZHJpdmVycyB3aWxsIHVzZSB0 aGUgJ2JwcCcgZmllbGQgd2hlbiB0aGV5IGFkZCBzdXBwb3J0Cj4+ID4gPiA+ID4gPiBmb3IgcGl4 ZWwgZm9ybWF0cyB3aXRoIG5vbi1pbnRlZ2VyIGJ5dGVzLXBlci1waXhlbC4KPj4gPiA+ID4gPiA+ Cj4+ID4gPiA+ID4gPiBTaWduZWQtb2ZmLWJ5OiBCcmlhbiBTdGFya2V5IDxicmlhbi5zdGFya2V5 QGFybS5jb20+Cj4+ID4gPiA+ID4KPj4gPiA+ID4gPiBJIGFzc3VtZSB5b3Ugc3RpbGwgcmVxdWly ZSB0aGF0IHN0dWZmIGlzIGV2ZW50dWFsbHkgYWxpZ25lZCB0byBieXRlcz8gSW4KPj4gPiA+ID4g PiB0aGF0IGNhc2UsIGNhbiB3ZSBzdWJzdW1lIHRoaXMgaW50byB0aGUgdGlsZSB3b3JrIEFsZXgg aXMgZG9pbmc/IEl0J3MKPj4gPiA+ID4gPiBlc3NlbnRpYWxseSBqdXN0IGFub3RoZXIgc3BlY2lh bCBjYXNlIG9mIGhhdmluZyBzdG9yYWdlLXNpemUgdW5pdHMKPj4gPiA+ID4gPiBtZWFzdXJlZCBp biBieXRlcyB3aGljaCBzcGFuIG1vcmUgdGhhbiAxeDEgcGl4ZWwuIEFuZCBJIGtpbmRhIGRvbid0 IHdhbnQgYQo+PiA+ID4gPiA+IG1ldHJpYyBwaWxlIG9mIHNwZWNpYWwgY2FzZXMgaGVyZSBpbiB0 aGUgZm9ybWF0IGNvZGUsIGJlY2F1c2UgdGhhdCBqdXN0Cj4+ID4gPiA+ID4gbWVhbnMgZXZlcnkg ZHJpdmVyIGhhbmRsZXMgYSBkaWZmZXJlbnQgc3Vic2V0LCB3aXRoIGRpZmZlcmVudCBidWdzLgo+ PiA+ID4gPiA+IC1EYW5pZWwKPj4gPiA+ID4KPj4gPiA+ID4gU29ycnkgZm9yIHRoZSBkZWxheSwg YmVlbiBzdHJ1Z2dsaW5nIHRvIGZyZWUgc29tZSBjeWNsZXMgdG8gdGhpbmsKPj4gPiA+ID4gYWJv dXQgdGhpcy4KPj4gPiA+ID4KPj4gPiA+ID4gSSdtIG5vdCBzdXJlIGhvdyB0byBwdWxsIHRoaXMg aW4gd2l0aCB0aGUgdGlsaW5nIHN0dWZmLiBJbiB0aGUgQUZCQwo+PiA+ID4gPiBjYXNlIHRoZW4g b3VyIEFGQkMgc3VwZXJibG9ja3MgYXJlIGFsd2F5cyBuaWNlIHJvdW5kIG51bWJlcnMgKDI1Ngo+ PiA+ID4gPiBwaXhlbHMpLCBhbmQgc28gaXQgZG9lcyBlbmQgdXAgYmVpbmcgYSBtdWx0aXBsZSBv ZiBieXRlcy4KPj4gPiA+ID4KPj4gPiA+ID4gSG93ZXZlciwgQUZCQyBzdXBwb3J0cyBkaWZmZXJl bnQgc3VwZXJibG9jayBzaXplcywgc28gcGlja2luZyBqdXN0IG9uZQo+PiA+ID4gPiBkb2Vzbid0 IHJlYWxseSB3b3JrIG91dCwgYW5kIHB1dHRpbmcgQUZCQyBpbiB0aGUgY29yZSBmb3JtYXQgdGFi bGUKPj4gPiA+ID4gd2hpY2ggcmVmbGVjdHMgQUZCQyBkb2Vzbid0IHNlZW0gZ29vZC4KPj4gPiA+ ID4KPj4gPiA+ID4gV2UgY291bGQgbWFrZSBzb21ldGhpbmcgdXAgKGUuZy4gY2FsbCB0aGVzZSBm b3JtYXRzICJ0aWxlZCIgd2l0aCAyeDQKPj4gPiA+ID4gdGlsZXMsIHdoaWNoIGd1YXJhbnRlZXMg YSBtdWx0aXBsZSBvZiA4KSwgYnV0IGl0IHdvdWxkIGJlIGFuCj4+ID4gPiA+IGFyYml0cmFyaWx5 LXNlbGVjdGVkIGxpZSwgd2hpY2ggb2Z0ZW4gc2VlbXMgdG8gc3BlbGwgdHJvdWJsZS4gSWYgd2UK Pj4gPiA+ID4gZGlkIGRvIHRoYXQsIHdvdWxkIHlvdSByZS1kZWZpbmUgY3BwIGFzICJieXRlcy1w ZXItdGlsZSI/IE90aGVyd2lzZQo+PiA+ID4gPiB3ZSBzdGlsbCBuZWVkIHRvIGFkZCBhIG5ldyBm aWVsZCBhbnl3YXkuCj4+ID4gPiA+Cj4+ID4gPiA+IFdoYXQncyB0aGUgcGlsZSBvZiBzcGVjaWFs IGNhc2VzIHlvdSdyZSB3b3JyaWVkIGFib3V0PyBUaGUgaGVscGVyIEkndmUKPj4gPiA+ID4gYWRk ZWQgaGVyZSBtZWFucyB0aGF0IGRyaXZlcnMgd2hpY2ggbmVlZCB0byBjYXJlIGNhbiB1c2Ugb25l IEFQSSBhbmQKPj4gPiA+ID4gbm90IGltcGxlbWVudCB0aGVpciBvd24gYnVncy4KPj4gPiA+Cj4+ ID4gPiBJJ20gY29uZnVzZWQgLi4uIHRoZSBuZXcgYml0cy1wZXItcGl4ZWwgc3R1ZmYgeW91J3Jl IGFkZGluZyBoZXJlIGlzIGZvcgo+PiA+ID4geXV2IGZvcm1hdHMsIG5vdCBhZmJjLiBJJ20ganVz dCBzdWdnZXN0aW5nIHdlIGhhdmUgb25seSAxIHdheSBvZgo+PiA+ID4gZGVzY3JpYmluZyBzdWNo IGZvcm1hdHMgdGhhdCBuZWVkIG1vcmUgZGVzY3JpcHRpdmUgcG93ZXIgdGhhbiBjcHAsIHdoZXRo ZXIKPj4gPiA+IHRoZXkgaGF2ZSBzb21lIGtpbmQgb2YgcGl4ZWwtZ3JvdXBzIG9yIHNtYWxsIHRp bGVzLgo+PiA+Cj4+ID4gV2VsbCwgbm90IHJlYWxseS4gVGhlIHRocmVlIGZvcm1hdHMgd2hpY2gg aGF2ZSBub24taW50ZWdlciBjcHAgYXJlOgo+PiA+IERSTV9GT1JNQVRfVlVZMTAxMDEwLCBEUk1f Rk9STUFUX1lVVjQyMF84QklUIGFuZAo+PiA+IERSTV9GT1JNQVRfWVVWNDIwXzEwQklULiBUaGVz ZSBmb3JtYXRzIGFyZSBvbmx5IHZhbGlkIHdpdGggbm9uLWxpbmVhcgo+PiA+IG1vZGlmaWVycyAo bm8gbGluZWFyIGVuY29kaW5nIGlzIGRlZmluZWQpLiBNYWxpIG9ubHkgc3VwcG9ydHMgdGhlbQo+ PiA+IHdpdGggQUZCQy4KPj4gPgo+PiA+IFRoZSBmb3JtYXRzIHRoZW1zZWx2ZXMgaGF2ZSBubyBu b3Rpb24gb2YgdGlsaW5nIG9yIGdyb3VwaW5nIC0gdGhlCj4+ID4gbW9kaWZpZXIgYWRkcyB0aGF0 LiBJJ20gbm90IGF3YXJlIG9mIGFueSBub24tQUZCQyB1c2VzIG9mIHRoZXNlCj4+ID4gZm9ybWF0 cywgc28gSSBkb24ndCB3YW50IHRvICJtYWtlIHVwIiBhIHNtYWxsLXRpbGUgbGF5b3V0IHJlc3Ry aWN0aW9uCj4+ID4gZm9yIHRoZW0uCj4+Cj4+IEFoLCBJIG1pc3NlZCB0aGF0Lgo+Pgo+PiA+ID4g Rm9yIHZlcnkgc3BlY2lhbCBzdHVmZiBsaWtlIGFmYmMgeW91IG5lZWQgdG8gdmFsaWRhdGUgaW4g dGhlIGRyaXZlcgo+PiA+ID4gYW55d2F5LCB0b28gY29tcGxpY2F0ZWQuIFNvIEkgaGF2ZSBubyBp ZGVhIHdoeSB5b3UgYnJpbmcgdGhpcyB1cCBoZXJlPwo+PiA+Cj4+ID4gU3VyZSwgd2UgY2FuIGp1 c3QgbGV0IGRyaXZlcnMgcHJvdmlkZSB0aGVpciBvd24gZm9ybWF0X2luZm8ncyBmb3IKPj4gPiB0 aGVzZSwgaWYgdGhhdCdzIHdoYXQgeW91IHByZWZlci4gVGhlIGNvcmUgZm9ybWF0IGNoZWNraW5n IGNvZGUgY2FuCj4+ID4gZXJyb3Igb3V0IGlmIGl0IGV2ZXIgZW5jb3VudGVycyB0aGVtLgo+Pgo+ PiBJdCdzIGZvcm1hdF9pbmZvIHdlJ3JlIHRhbGtpbmcgYWJvdXQuIFdoYXQgSSBtZWFuIGlzIHRo YXQgeW91IGp1c3Qgc2V0IGFsbAo+PiB0aGVzZSB0byAwIGFuZCBsZXQgdGhlIGZvcm1hdF9pbmZv IGNvZGUgaWdub3JlIGl0LiBBbmQgdGhlbiBoYXZpbmcgYQo+PiBiZXNwb2tlIGRybV9mb3JtYXRf Y2hlY2tfYWZiYyBoZWxwZXIgZnVuY3Rpb24gb3Igc2ltaWxhciwgd2hpY2ggY2hlY2tzIGFsbAo+ PiB0aGUgbGF5b3V0IHJlc3RyaWN0aW9ucyBvZiBhZmJjLgo+Pgo+PiBJIHN0aWxsIG1haW50YWlu IHRoYXQgYnBwIGFuZCB0aWxlX3NpemUgYXJlIGVxdWF2YWxlbnQsIGFuZCB3ZSByZWFsbHkKPj4g ZG9uJ3QgbmVlZCBib3RoLiBCb3RoIGFyZSBkZWZhY3RvIGEgZm9ybSBvZiBudW1lcmF0b3IvZGVu dW1lcmF0b3IuIElmIHlvdQo+PiBkb24ndCBsaWtlIHRoYXQgeW91IGhhdmUgdG8gaW50cm9kdWNl ICJmYWtlIiB0aWxlcyBmb3IgYWZiYywgdGhlbiB3ZSBjYW4KPj4gcmVuYW1lIHRpbGVfc2l6ZSB0 byBudW1lcmF0b3IgYW5kIHRpbGVfaC93IHRvIGRlbnVtZXJhdG9yX2gvdy4gRG9lc24ndAo+PiBj aGFuZ2Ugb25lIGJpdCBvZiB0aGUgbWF0aC4gYnBwIHNpbXBseSBoYXJkY29kZXMgYSBkZW51bWVy YXRvciBvZiA4LCBhbmQgSQo+PiBkb24ndCBzZWUgd2h5IHdlIG5lZWQgdGhhdCBzcGVjaWFsIGNh c2UuIEV4Y2VwdCBpZiB5b3UgbG92ZSB0byB3cml0ZQo+PiByZWR1bmRhbnQgc2VsZiB0ZXN0cyBm b3IgYWxsIHRoZSBtYXRoIDotKQo+Cj5NeSAkLjAyIHdvcnRoIG9mIHRob3VnaHRzOgo+Cj5JIGdl dCB0aGUgZmFjdCB0aGF0IERhbmllbCBkb2Vzbid0IGxpa2UgdXMgdG8gYWRkIDMgbmV3IHZhcmlh YmxlcyBpbnRvCj5mb3JtYXRfaW5mbyAoYnBwLCB0aWxlX3csIHRpbGVfaCkgYW5kIHRoYXQgYWRk aW5nIGEgImJpdHNfcGVyX3VuaXQiCj52YXJpYWJsZSBzaG91bGQgYmUgYWJsZSB0byB0YWtlIGNh cmUgb2YgbGluZWFyICh3aGVyZSB1bml0ID0gMSBwaXhlbCkKPmFuZCB0aWxlZCAod2hlcmUgdW5p dCA9IHRpbGVfdyAqIHRpbGVfaCBwaXhlbHMpIGZvcm1hdHMuIEFuZCBJIGFsc28gc2VlCj5EYW5p ZWwncyBvcHRpb24gMiBiZWxvdywgd2hlcmUgaGUgc2F5cyBpdCBpcyByZWFzb25hYmxlIHRvIGNo ZWNrIEFGQkMKPndpdGhvdXQgdXNpbmcgZm9ybWF0X2luZm8uCj4KPkhvd2V2ZXIsIHRoZSBwcm9i bGVtIHdlIGFyZSB0cnlpbmcgdG8gc29sdmUgaXMgMiBmb2xkOiB3ZSBhcmUgdHJ5aW5nIHRvCj5j YWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGZyYW1lYnVmZmVyIChhbmQgdGhlICJiaXRzX3Blcl91 bml0IiBvcgo+QnJpYW4ncyBicHAgaXMgdXNlZnVsIGZvciB0aGF0KSwgYnV0IHdlIGFsc28gdHJ5 IHRvIHZhbGlkYXRlIHRoZSBzaXplcwo+cGFzc2VkIGJ5IHVzZXJzcGFjZSBiYXNlZCBvbiB0aGUg ZHJtX2ZvdXJjYy5oK21vZGlmaWVyIGluZm8uIEluIHRoYXQKPmNhc2UsIHRoZSBkcml2ZXIgc3Rp bGwgbmVlZHMgdG8gc3RvcmUgc29tZXdoZXJlIHRoZSB0aWxlX3cvdGlsZV9oIGZvcgo+dGhhdCBn aXZlbiBmb3JtYXQgaW4gb3JkZXIgdG8gY2hlY2sgdGhhdCB0aGUgc3RyaWRlIGlzIGEgd2hvbGUg bXVsdGlwbGUKPm9mIHRpbGUgc2l6ZXMsIHNvIHdlIHRob3VnaHQgdGhhdCBwdXR0aW5nIGl0IGlu IGZvcm1hdF9pbmZvIGlzIG5vdAo+ZW50aXJlbHkgcG9pbnRsZXNzLCBiZWNhdXNlIG90aGVycyBt aWdodCB1c2UgdGhvc2UgdmFyaWFibGVzIGluIG9yZGVyIHRvCj5kbyB0aGVpciBkcml2ZXIgc3Bl Y2lmaWMgdmFsaWRhdGlvbiwgd2l0aG91dCBjcmVhdGluZyBuZXcgc3RydWN0dXJlcy4KCkV2ZW4g aWYgd2Ugb25seSB3YW50ZWQgdG8gZG8gb25lIG9mIHRob3NlIHRoaW5ncyAoY2FsY3VsYXRlIHRo ZSBzaXplCmluIGJ5dGVzIG9mIHRoZSBmcmFtZWJ1ZmZlciksIHdlIG5lZWQgdG8ga25vdyB0aGUg Yml0c19wZXJfdW5pdCwgYXMKd2VsbCBhcyB0aGUgbnVtYmVyIG9mIHVuaXRzLiBXaXRob3V0IHRo ZSBzZWNvbmQgKCt0aGlyZCkgdmFyaWFibGVzLCB3ZQpjYW4ndCBmaWd1cmUgb3V0IG51bWJlciBv ZiB1bml0cyBhbmQgc28gd2UgY2FuJ3QgZmlndXJlIG91dCB0aGUgc2l6ZS4KClNlcGFyYXRlIHBv aW50OiBtb2RpZmllcnMgY2VydGFpbmx5IHNob3VsZG4ndCBjb21lIGluIHRvIHRoaXMKZGlzY3Vz c2lvbiAtIG1vZGlmaWVyLXJlbGF0ZWQgdmFsaWRhdGlvbiBpcyBhbHdheXMgZ29pbmcgdG8gbmVl ZCB0byBiZQppbiB0aGUgZHJpdmVyLCBhbmQgaXMgYSBzZXBhcmF0ZSB0aGluZyBlbnRpcmVseSAo bm90IGNvbnRhaW5lZCBpbgpkcm1fZm9ybWF0X2luZm8pLgoKPgo+RGlkIEkgY2FwdHVyZSB0aGUg ZGlzY3Vzc2lvbiBjb3JyZWN0bHk/IElmIHNvLCBjYW4gd2UgYWdyZWUgdGhhdCBpdCBpcwo+bm90 IGp1c3QgdGhlIGZyYW1lYnVmZmVyIHNpemUgY2FsY3VsYXRpb24gdGhhdCBtYXR0ZXJzIGFuZCB0 aGF0IHRpbGVkCj5mb3JtYXRzIHZhbGlkYXRpb24gcmVxdWlyZXMgYSB0aWxlX3cvdGlsZV9oIGlu Zm8sIHRoZXJlZm9yZSBBbGV4J3MKPnBhdGNoZXMgYW5kIEJyaWFuJ3MgbmVlZCB0byBiZSBkaXNj dXNzZWQgc2VwYXJhdGVseSAoc28gdGhhdCB3ZSBjYW4KPmJpa2VzaGVkIG9uIHdoZXRoZXIgZm9y bWF0X2luZm8gaXMgdGhlIHJpZ2h0IHBsYWNlIG9yIG5vdCk/CgpJdCBsb29rcyB0byBtZSB0aGF0 IHRoZSByaWdodCB0aGluZyB0byBkbyBpcyBzZXQgY3BwIHRvIHplcm8gZm9yIHRoZQoibm9uIGlu dGVnZXIiIGZvcm1hdHMgSSB3YW50IHRvIGFkZCwgYW5kIGVudGlyZWx5IGRlZmVyIHRvIGRyaXZl cnMgdG8KZmlndXJlIHRob3NlIG91dCAoYWZ0ZXIgYWxsLCBhbnkgc2l6ZSBjYWxjdWxhdGlvbiB0 aGUgY29yZSBkb2VzIGZvcgp0aGVtIHdpbGwgYmUgbW9vdCwgYmVjYXVzZSB0aGV5IGFyZSBvbmx5 IHZhbGlkIHdpdGggbW9kaWZpZXJzLCBhbmQKbW9kaWZpZXJzIGNhbiBjaGFuZ2UgdGhlIHNpemUp LgoKSG93IHRoZSB0aWxlZCBzdHVmZiAoWTBMMCwgWTBMMikgZ2V0cyBkZXNjcmliZWQgY2FuIGJl IGEgc2VwYXJhdGUKdG9waWMuIElmIGl0IGhhcHBlbnMgdG8gc3VwcG9ydCBub24taW50ZWdlciBj cHAgZm9ybWF0cyBhcyBhIHNpZGUKZWZmZWN0LCB0aGVuIG1vcmUgdGhlIGJldHRlciAtIHdoZW4g c29tZW9uZSBjb21lcyBhbG9uZyB3aXRoIGEKbm9uLWludGVnZXItY3BwIGZvcm1hdCB3aGljaCBh Y3R1YWxseSBfaXNfIHN1cHBvcnRlZCBpbiBsaW5lYXIgbGF5b3V0CnRoZXkgY2FuIHVzZSBpdC4g SSBob3BlIERhbmllbCBjYW4gZGVzY3JpYmUgaW4gbW9yZSBkZXRhaWwgZXhhY3RseSBob3cKaGUg c2VlcyB0aGF0IGJpdCB3b3JraW5nIHRob3VnaCwgYmVjYXVzZSBJIGRvbid0IHRoaW5rIHRoYXQg ZWl0aGVyCkFsZXggb3IgbWUgdW5kZXJzdGFuZCB0aGF0IHlldC4KCkNoZWVycywKLUJyaWFuCgo+ Cj5CZXN0IHJlZ2FyZHMsCj5MaXZpdQo+Cj4+Cj4+IFNvIHR3byBvcHRpb25zIHRoYXQgSSB0aGlu ayBhcmUgcmVhc29uYWJsZToKPj4gLSBvbmUgY29tbW9uIG51bWVyYXRvci9kZW51bWVyYXRvci4g SSBkb24ndCBjYXJlIGhvdyB5b3UgY2FsbCB0aGF0Cj4+ICAgYmlrZXNoZWQuCj4+IC0gZG9uJ3Qg Y2hlY2sgYWZiYyB1c2luZyBmb3JtYXRfaW5mbywgaGF2ZSB5b3VyIG93biBoZWxwZXIgdGhhdCBk b2VzIHRoYXQKPj4gICB1c2luZyBjdXN0b20gY29kZS4KPj4KPj4gQ2hlZXJzLCBEYW5pZWwKPj4K Pj4gPiBDaGVlcnMsCj4+ID4gLUJyaWFuCj4+ID4KPj4gPiA+IC1EYW5pZWwKPj4gPiA+Cj4+ID4g PiA+Cj4+ID4gPiA+IENoZWVycywKPj4gPiA+ID4gLUJyaWFuCj4+ID4gPiA+Cj4+ID4gPiA+ID4K Pj4gPiA+ID4gPiA+IC0tLQo+PiA+ID4gPiA+ID4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fZmJfY21h X2hlbHBlci5jICAgICAgICAgIHwgIDYgKysrLQo+PiA+ID4gPiA+ID4gIGRyaXZlcnMvZ3B1L2Ry bS9kcm1fZmJfaGVscGVyLmMgICAgICAgICAgICAgIHwgIDggKysrLS0KPj4gPiA+ID4gPiA+ICBk cml2ZXJzL2dwdS9kcm0vZHJtX2ZvdXJjYy5jICAgICAgICAgICAgICAgICB8IDUwICsrKysrKysr KysrKysrKysrKysrKysrKysrKysKPj4gPiA+ID4gPiA+ICBkcml2ZXJzL2dwdS9kcm0vZHJtX2Zy YW1lYnVmZmVyLmMgICAgICAgICAgICB8ICA4ICsrLS0tCj4+ID4gPiA+ID4gPiAgZHJpdmVycy9n cHUvZHJtL2RybV9nZW1fZnJhbWVidWZmZXJfaGVscGVyLmMgfCAgMyArLQo+PiA+ID4gPiA+ID4g IGluY2x1ZGUvZHJtL2RybV9mb3VyY2MuaCAgICAgICAgICAgICAgICAgICAgIHwgIDQgKysrCj4+ ID4gPiA+ID4gPiAgNiBmaWxlcyBjaGFuZ2VkLCA3MCBpbnNlcnRpb25zKCspLCA5IGRlbGV0aW9u cygtKQo+PiA+ID4gPiA+ID4KPj4gPiA+ID4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vZHJtX2ZiX2NtYV9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfY21hX2hlbHBl ci5jCj4+ID4gPiA+ID4gPiBpbmRleCAxODZkMDBhZGZiNWYuLmUyNzlkNzBkM2U2MCAxMDA2NDQK Pj4gPiA+ID4gPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfY21hX2hlbHBlci5jCj4+ ID4gPiA+ID4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2NtYV9oZWxwZXIuYwo+PiA+ ID4gPiA+ID4gQEAgLTExOCwxMyArMTE4LDE3IEBAIGRtYV9hZGRyX3QgZHJtX2ZiX2NtYV9nZXRf Z2VtX2FkZHIoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCj4+ID4gPiA+ID4gPiAgewo+PiA+ ID4gPiA+ID4gIAlzdHJ1Y3QgZHJtX2dlbV9jbWFfb2JqZWN0ICpvYmo7Cj4+ID4gPiA+ID4gPiAg CWRtYV9hZGRyX3QgcGFkZHI7Cj4+ID4gPiA+ID4gPiArCXU4IGJwcCA9IGRybV9mb3JtYXRfaW5m b19wbGFuZV9icHAoZmItPmZvcm1hdCwgcGxhbmUpOwo+PiA+ID4gPiA+ID4gKwo+PiA+ID4gPiA+ ID4gKwkvKiBUaGlzIGNhbid0IHdvcmsgZm9yIG5vbi1pbnRlZ2VyIGJ5dGVzLXBlci1waXhlbCAq Lwo+PiA+ID4gPiA+ID4gKwlXQVJOX09OKGJwcCAlIDgpOwo+PiA+ID4gPiA+ID4KPj4gPiA+ID4g PiA+ICAJb2JqID0gZHJtX2ZiX2NtYV9nZXRfZ2VtX29iaihmYiwgcGxhbmUpOwo+PiA+ID4gPiA+ ID4gIAlpZiAoIW9iaikKPj4gPiA+ID4gPiA+ICAJCXJldHVybiAwOwo+PiA+ID4gPiA+ID4KPj4g PiA+ID4gPiA+ICAJcGFkZHIgPSBvYmotPnBhZGRyICsgZmItPm9mZnNldHNbcGxhbmVdOwo+PiA+ ID4gPiA+ID4gLQlwYWRkciArPSBmYi0+Zm9ybWF0LT5jcHBbcGxhbmVdICogKHN0YXRlLT5zcmNf eCA+PiAxNik7Cj4+ID4gPiA+ID4gPiArCXBhZGRyICs9IChicHAgLyA4KSAqIChzdGF0ZS0+c3Jj X3ggPj4gMTYpOwo+PiA+ID4gPiA+ID4gIAlwYWRkciArPSBmYi0+cGl0Y2hlc1twbGFuZV0gKiAo c3RhdGUtPnNyY195ID4+IDE2KTsKPj4gPiA+ID4gPiA+Cj4+ID4gPiA+ID4gPiAgCXJldHVybiBw YWRkcjsKPj4gPiA+ID4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hl bHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYwo+PiA+ID4gPiA+ID4gaW5k ZXggMDY0NmIxMDgwMzBiLi5hYjM2OWYyNTBhZjQgMTAwNjQ0Cj4+ID4gPiA+ID4gPiAtLS0gYS9k cml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCj4+ID4gPiA+ID4gPiArKysgYi9kcml2ZXJz L2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCj4+ID4gPiA+ID4gPiBAQCAtMTU3Miw2ICsxNTcyLDcg QEAgaW50IGRybV9mYl9oZWxwZXJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAq dmFyLAo+PiA+ID4gPiA+ID4gIAlzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqZmJfaGVscGVyID0gaW5m by0+cGFyOwo+PiA+ID4gPiA+ID4gIAlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9IGZiX2hl bHBlci0+ZmI7Cj4+ID4gPiA+ID4gPiAgCWludCBkZXB0aDsKPj4gPiA+ID4gPiA+ICsJdTggYnBw ID0gZHJtX2Zvcm1hdF9pbmZvX3BsYW5lX2JwcChmYi0+Zm9ybWF0LCAwKTsKPj4gPiA+ID4gPiA+ Cj4+ID4gPiA+ID4gPiAgCWlmICh2YXItPnBpeGNsb2NrICE9IDAgfHwgaW5fZGJnX21hc3Rlcigp KQo+PiA+ID4gPiA+ID4gIAkJcmV0dXJuIC1FSU5WQUw7Cj4+ID4gPiA+ID4gPiBAQCAtMTU4MCwx NCArMTU4MSwxNCBAQCBpbnQgZHJtX2ZiX2hlbHBlcl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9z Y3JlZW5pbmZvICp2YXIsCj4+ID4gPiA+ID4gPiAgCSAqIENoYW5nZXMgc3RydWN0IGZiX3Zhcl9z Y3JlZW5pbmZvIGFyZSBjdXJyZW50bHkgbm90IHB1c2hlZCBiYWNrCj4+ID4gPiA+ID4gPiAgCSAq IHRvIEtNUywgaGVuY2UgZmFpbCBpZiBkaWZmZXJlbnQgc2V0dGluZ3MgYXJlIHJlcXVlc3RlZC4K Pj4gPiA+ID4gPiA+ICAJICovCj4+ID4gPiA+ID4gPiAtCWlmICh2YXItPmJpdHNfcGVyX3BpeGVs ICE9IGZiLT5mb3JtYXQtPmNwcFswXSAqIDggfHwKPj4gPiA+ID4gPiA+ICsJaWYgKHZhci0+Yml0 c19wZXJfcGl4ZWwgIT0gYnBwIHx8Cj4+ID4gPiA+ID4gPiAgCSAgICB2YXItPnhyZXMgPiBmYi0+ d2lkdGggfHwgdmFyLT55cmVzID4gZmItPmhlaWdodCB8fAo+PiA+ID4gPiA+ID4gIAkgICAgdmFy LT54cmVzX3ZpcnR1YWwgPiBmYi0+d2lkdGggfHwgdmFyLT55cmVzX3ZpcnR1YWwgPiBmYi0+aGVp Z2h0KSB7Cj4+ID4gPiA+ID4gPiAgCQlEUk1fREVCVUcoImZiIHJlcXVlc3RlZCB3aWR0aC9oZWln aHQvYnBwIGNhbid0IGZpdCBpbiBjdXJyZW50IGZiICIKPj4gPiA+ID4gPiA+ICAJCQkgICJyZXF1 ZXN0ICVkeCVkLSVkICh2aXJ0dWFsICVkeCVkKSA+ICVkeCVkLSVkXG4iLAo+PiA+ID4gPiA+ID4g IAkJCSAgdmFyLT54cmVzLCB2YXItPnlyZXMsIHZhci0+Yml0c19wZXJfcGl4ZWwsCj4+ID4gPiA+ ID4gPiAgCQkJICB2YXItPnhyZXNfdmlydHVhbCwgdmFyLT55cmVzX3ZpcnR1YWwsCj4+ID4gPiA+ ID4gPiAtCQkJICBmYi0+d2lkdGgsIGZiLT5oZWlnaHQsIGZiLT5mb3JtYXQtPmNwcFswXSAqIDgp Owo+PiA+ID4gPiA+ID4gKwkJCSAgZmItPndpZHRoLCBmYi0+aGVpZ2h0LCBicHApOwo+PiA+ID4g PiA+ID4gIAkJcmV0dXJuIC1FSU5WQUw7Cj4+ID4gPiA+ID4gPiAgCX0KPj4gPiA+ID4gPiA+Cj4+ ID4gPiA+ID4gPiBAQCAtMTk0OSwxMSArMTk1MCwxMiBAQCB2b2lkIGRybV9mYl9oZWxwZXJfZmls bF92YXIoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxw ZQo+PiA+ID4gPiA+ID4gIAkJCSAgICB1aW50MzJfdCBmYl93aWR0aCwgdWludDMyX3QgZmJfaGVp Z2h0KQo+PiA+ID4gPiA+ID4gIHsKPj4gPiA+ID4gPiA+ICAJc3RydWN0IGRybV9mcmFtZWJ1ZmZl ciAqZmIgPSBmYl9oZWxwZXItPmZiOwo+PiA+ID4gPiA+ID4gKwl1OCBicHAgPSBkcm1fZm9ybWF0 X2luZm9fcGxhbmVfYnBwKGZiLT5mb3JtYXQsIDApOwo+PiA+ID4gPiA+ID4KPj4gPiA+ID4gPiA+ ICAJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBmYl9oZWxwZXItPnBzZXVkb19wYWxldHRlOwo+PiA+ ID4gPiA+ID4gIAlpbmZvLT52YXIueHJlc192aXJ0dWFsID0gZmItPndpZHRoOwo+PiA+ID4gPiA+ ID4gIAlpbmZvLT52YXIueXJlc192aXJ0dWFsID0gZmItPmhlaWdodDsKPj4gPiA+ID4gPiA+IC0J aW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID0gZmItPmZvcm1hdC0+Y3BwWzBdICogODsKPj4gPiA+ ID4gPiA+ICsJaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID0gYnBwOwo+PiA+ID4gPiA+ID4gIAlp bmZvLT52YXIuYWNjZWxfZmxhZ3MgPSBGQl9BQ0NFTEZfVEVYVDsKPj4gPiA+ID4gPiA+ICAJaW5m by0+dmFyLnhvZmZzZXQgPSAwOwo+PiA+ID4gPiA+ID4gIAlpbmZvLT52YXIueW9mZnNldCA9IDA7 Cj4+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3VyY2MuYyBi L2RyaXZlcnMvZ3B1L2RybS9kcm1fZm91cmNjLmMKPj4gPiA+ID4gPiA+IGluZGV4IDNiNDJjMjVi ZDU4ZC4uYmIyODkxOWMzMmYzIDEwMDY0NAo+PiA+ID4gPiA+ID4gLS0tIGEvZHJpdmVycy9ncHUv ZHJtL2RybV9mb3VyY2MuYwo+PiA+ID4gPiA+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9m b3VyY2MuYwo+PiA+ID4gPiA+ID4gQEAgLTI3MiwxMCArMjcyLDYwIEBAIGludCBkcm1fZm9ybWF0 X3BsYW5lX2NwcCh1aW50MzJfdCBmb3JtYXQsIGludCBwbGFuZSkKPj4gPiA+ID4gPiA+ICAJaWYg KCFpbmZvIHx8IHBsYW5lID49IGluZm8tPm51bV9wbGFuZXMpCj4+ID4gPiA+ID4gPiAgCQlyZXR1 cm4gMDsKPj4gPiA+ID4gPiA+Cj4+ID4gPiA+ID4gPiArCS8qCj4+ID4gPiA+ID4gPiArCSAqIE5v dCB2YWxpZCBmb3IgZm9ybWF0cyB3aXRoIG5vbi1pbnRlZ2VyIGNwcCwKPj4gPiA+ID4gPiA+ICsJ ICogdXNlIGRybV9mb3JtYXR7X2luZm99X3BsYW5lX2JwcCBpbnN0ZWFkCj4+ID4gPiA+ID4gPiAr CSAqLwo+PiA+ID4gPiA+ID4gKwlXQVJOX09OKCFpbmZvLT5jcHBbMF0pOwo+PiA+ID4gPiA+ID4g Kwo+PiA+ID4gPiA+ID4gIAlyZXR1cm4gaW5mby0+Y3BwW3BsYW5lXTsKPj4gPiA+ID4gPiA+ICB9 Cj4+ID4gPiA+ID4gPiAgRVhQT1JUX1NZTUJPTChkcm1fZm9ybWF0X3BsYW5lX2NwcCk7Cj4+ID4g PiA+ID4gPgo+PiA+ID4gPiA+ID4gKy8qKgo+PiA+ID4gPiA+ID4gKyAqIGRybV9mb3JtYXRfcGxh bmVfYnBwIC0gZGV0ZXJtaW5lIHRoZSBiaXRzIHBlciBwaXhlbCB2YWx1ZQo+PiA+ID4gPiA+ID4g KyAqIEBmb3JtYXQ6IHBpeGVsIGZvcm1hdCAoRFJNX0ZPUk1BVF8qKQo+PiA+ID4gPiA+ID4gKyAq IEBwbGFuZTogcGxhbmUgaW5kZXgKPj4gPiA+ID4gPiA+ICsgKgo+PiA+ID4gPiA+ID4gKyAqIFJl dHVybnM6Cj4+ID4gPiA+ID4gPiArICogVGhlIGJpdHMgcGVyIHBpeGVsIHZhbHVlIGZvciB0aGUg c3BlY2lmaWVkIHBsYW5lLgo+PiA+ID4gPiA+ID4gKyAqLwo+PiA+ID4gPiA+ID4gK2ludCBkcm1f Zm9ybWF0X3BsYW5lX2JwcCh1aW50MzJfdCBmb3JtYXQsIGludCBwbGFuZSkKPj4gPiA+ID4gPiA+ ICt7Cj4+ID4gPiA+ID4gPiArCWNvbnN0IHN0cnVjdCBkcm1fZm9ybWF0X2luZm8gKmluZm87Cj4+ ID4gPiA+ID4gPiArCj4+ID4gPiA+ID4gPiArCWluZm8gPSBkcm1fZm9ybWF0X2luZm8oZm9ybWF0 KTsKPj4gPiA+ID4gPiA+ICsJaWYgKCFpbmZvKQo+PiA+ID4gPiA+ID4gKwkJcmV0dXJuIDA7Cj4+ ID4gPiA+ID4gPiArCj4+ID4gPiA+ID4gPiArCXJldHVybiBkcm1fZm9ybWF0X2luZm9fcGxhbmVf YnBwKGluZm8sIHBsYW5lKTsKPj4gPiA+ID4gPiA+ICt9Cj4+ID4gPiA+ID4gPiArRVhQT1JUX1NZ TUJPTChkcm1fZm9ybWF0X3BsYW5lX2JwcCk7Cj4+ID4gPiA+ID4gPiArCj4+ID4gPiA+ID4gPiAr LyoqCj4+ID4gPiA+ID4gPiArICogZHJtX2Zvcm1hdF9pbmZvX3BsYW5lX2JwcCAtIGRldGVybWlu ZSB0aGUgYml0cyBwZXIgcGl4ZWwgdmFsdWUKPj4gPiA+ID4gPiA+ICsgKgo+PiA+ID4gPiA+ID4g KyAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHdoaWNoIGhhbmRsZXMgZm9ybWF0cyB3aXRoIGJvdGgg aW50ZWdlcgo+PiA+ID4gPiA+ID4gKyAqIGFuZCBub24taW50ZWdlciBieXRlcy1wZXItcGl4ZWwu Cj4+ID4gPiA+ID4gPiArICoKPj4gPiA+ID4gPiA+ICsgKiBAZm9ybWF0OiBwaXhlbCBmb3JtYXQg aW5mbyBzdHJ1Y3R1cmUKPj4gPiA+ID4gPiA+ICsgKiBAcGxhbmU6IHBsYW5lIGluZGV4Cj4+ID4g PiA+ID4gPiArICoKPj4gPiA+ID4gPiA+ICsgKiBSZXR1cm5zOgo+PiA+ID4gPiA+ID4gKyAqIFRo ZSBiaXRzIHBlciBwaXhlbCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBwbGFuZS4KPj4gPiA+ID4g PiA+ICsgKi8KPj4gPiA+ID4gPiA+ICtpbnQgZHJtX2Zvcm1hdF9pbmZvX3BsYW5lX2JwcChjb25z dCBzdHJ1Y3QgZHJtX2Zvcm1hdF9pbmZvICppbmZvLCBpbnQgcGxhbmUpCj4+ID4gPiA+ID4gPiAr ewo+PiA+ID4gPiA+ID4gKwlpZiAocGxhbmUgPj0gaW5mby0+bnVtX3BsYW5lcykKPj4gPiA+ID4g PiA+ICsJCXJldHVybiAwOwo+PiA+ID4gPiA+ID4gKwo+PiA+ID4gPiA+ID4gKwlpZiAoaW5mby0+ Y3BwWzBdKQo+PiA+ID4gPiA+ID4gKwkJcmV0dXJuIGluZm8tPmNwcFtwbGFuZV0gKiA4Owo+PiA+ ID4gPiA+ID4gKwo+PiA+ID4gPiA+ID4gKwlyZXR1cm4gaW5mby0+YnBwW3BsYW5lXTsKPj4gPiA+ ID4gPiA+ICt9Cj4+ID4gPiA+ID4gPiArRVhQT1JUX1NZTUJPTChkcm1fZm9ybWF0X2luZm9fcGxh bmVfYnBwKTsKPj4gPiA+ID4gPiA+ICsKPj4gPiA+ID4gPiA+ICAvKioKPj4gPiA+ID4gPiA+ICAg KiBkcm1fZm9ybWF0X2hvcnpfY2hyb21hX3N1YnNhbXBsaW5nIC0gZ2V0IHRoZSBob3Jpem9udGFs IGNocm9tYSBzdWJzYW1wbGluZyBmYWN0b3IKPj4gPiA+ID4gPiA+ICAgKiBAZm9ybWF0OiBwaXhl bCBmb3JtYXQgKERSTV9GT1JNQVRfKikKPj4gPiA+ID4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vZHJtX2ZyYW1lYnVmZmVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZyYW1lYnVm ZmVyLmMKPj4gPiA+ID4gPiA+IGluZGV4IDhjNGQzMmFkY2MxNy4uN2UwMDM2MGZmNzBkIDEwMDY0 NAo+PiA+ID4gPiA+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9mcmFtZWJ1ZmZlci5jCj4+ ID4gPiA+ID4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZyYW1lYnVmZmVyLmMKPj4gPiA+ ID4gPiA+IEBAIC0xODUsMjAgKzE4NSwyMCBAQCBzdGF0aWMgaW50IGZyYW1lYnVmZmVyX2NoZWNr KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4+ID4gPiA+ID4gPiAgCWZvciAoaSA9IDA7IGkgPCBp bmZvLT5udW1fcGxhbmVzOyBpKyspIHsKPj4gPiA+ID4gPiA+ICAJCXVuc2lnbmVkIGludCB3aWR0 aCA9IGZiX3BsYW5lX3dpZHRoKHItPndpZHRoLCBpbmZvLCBpKTsKPj4gPiA+ID4gPiA+ICAJCXVu c2lnbmVkIGludCBoZWlnaHQgPSBmYl9wbGFuZV9oZWlnaHQoci0+aGVpZ2h0LCBpbmZvLCBpKTsK Pj4gPiA+ID4gPiA+IC0JCXVuc2lnbmVkIGludCBjcHAgPSBpbmZvLT5jcHBbaV07Cj4+ID4gPiA+ ID4gPiArCQl1bnNpZ25lZCBpbnQgYnBwID0gZHJtX2Zvcm1hdF9pbmZvX3BsYW5lX2JwcChpbmZv LCBpKTsKPj4gPiA+ID4gPiA+Cj4+ID4gPiA+ID4gPiAgCQlpZiAoIXItPmhhbmRsZXNbaV0pIHsK Pj4gPiA+ID4gPiA+ICAJCQlEUk1fREVCVUdfS01TKCJubyBidWZmZXIgb2JqZWN0IGhhbmRsZSBm b3IgcGxhbmUgJWRcbiIsIGkpOwo+PiA+ID4gPiA+ID4gIAkJCXJldHVybiAtRUlOVkFMOwo+PiA+ ID4gPiA+ID4gIAkJfQo+PiA+ID4gPiA+ID4KPj4gPiA+ID4gPiA+IC0JCWlmICgodWludDY0X3Qp IHdpZHRoICogY3BwID4gVUlOVF9NQVgpCj4+ID4gPiA+ID4gPiArCQlpZiAoKHVpbnQ2NF90KSBE SVZfUk9VTkRfVVAod2lkdGggKiBicHAsIDgpID4gVUlOVF9NQVgpCj4+ID4gPiA+ID4gPiAgCQkJ cmV0dXJuIC1FUkFOR0U7Cj4+ID4gPiA+ID4gPgo+PiA+ID4gPiA+ID4gIAkJaWYgKCh1aW50NjRf dCkgaGVpZ2h0ICogci0+cGl0Y2hlc1tpXSArIHItPm9mZnNldHNbaV0gPiBVSU5UX01BWCkKPj4g PiA+ID4gPiA+ICAJCQlyZXR1cm4gLUVSQU5HRTsKPj4gPiA+ID4gPiA+Cj4+ID4gPiA+ID4gPiAt CQlpZiAoci0+cGl0Y2hlc1tpXSA8IHdpZHRoICogY3BwKSB7Cj4+ID4gPiA+ID4gPiArCQlpZiAo KHVpbnQ2NF90KSByLT5waXRjaGVzW2ldICogOCA8ICh1aW50NjRfdCkgd2lkdGggKiBicHApIHsK Pj4gPiA+ID4gPiA+ICAJCQlEUk1fREVCVUdfS01TKCJiYWQgcGl0Y2ggJXUgZm9yIHBsYW5lICVk XG4iLCByLT5waXRjaGVzW2ldLCBpKTsKPj4gPiA+ID4gPiA+ICAJCQlyZXR1cm4gLUVJTlZBTDsK Pj4gPiA+ID4gPiA+ICAJCX0KPj4gPiA+ID4gPiA+IEBAIC00NzYsNyArNDc2LDcgQEAgaW50IGRy bV9tb2RlX2dldGZiKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4+ID4gPiA+ID4gPiAgCXItPmhl aWdodCA9IGZiLT5oZWlnaHQ7Cj4+ID4gPiA+ID4gPiAgCXItPndpZHRoID0gZmItPndpZHRoOwo+ PiA+ID4gPiA+ID4gIAlyLT5kZXB0aCA9IGZiLT5mb3JtYXQtPmRlcHRoOwo+PiA+ID4gPiA+ID4g LQlyLT5icHAgPSBmYi0+Zm9ybWF0LT5jcHBbMF0gKiA4Owo+PiA+ID4gPiA+ID4gKwlyLT5icHAg PSBkcm1fZm9ybWF0X2luZm9fcGxhbmVfYnBwKGZiLT5mb3JtYXQsIDApOwo+PiA+ID4gPiA+ID4g IAlyLT5waXRjaCA9IGZiLT5waXRjaGVzWzBdOwo+PiA+ID4gPiA+ID4KPj4gPiA+ID4gPiA+ICAJ LyogR0VUX0ZCKCkgaXMgYW4gdW5wcml2aWxlZ2VkIGlvY3RsIHNvIHdlIG11c3Qgbm90IHJldHVy biBhCj4+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9nZW1fZnJh bWVidWZmZXJfaGVscGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbV9mcmFtZWJ1ZmZlcl9o ZWxwZXIuYwo+PiA+ID4gPiA+ID4gaW5kZXggYWNmYmMwNjQxYTA2Li5kZmUyMjRjY2FlYmEgMTAw NjQ0Cj4+ID4gPiA+ID4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbV9mcmFtZWJ1ZmZl cl9oZWxwZXIuYwo+PiA+ID4gPiA+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9nZW1fZnJh bWVidWZmZXJfaGVscGVyLmMKPj4gPiA+ID4gPiA+IEBAIC0xNjEsNiArMTYxLDcgQEAgZHJtX2dl bV9mYl9jcmVhdGVfd2l0aF9mdW5jcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJt X2ZpbGUgKmZpbGUsCj4+ID4gPiA+ID4gPiAgCQl1bnNpZ25lZCBpbnQgd2lkdGggPSBtb2RlX2Nt ZC0+d2lkdGggLyAoaSA/IGluZm8tPmhzdWIgOiAxKTsKPj4gPiA+ID4gPiA+ICAJCXVuc2lnbmVk IGludCBoZWlnaHQgPSBtb2RlX2NtZC0+aGVpZ2h0IC8gKGkgPyBpbmZvLT52c3ViIDogMSk7Cj4+ ID4gPiA+ID4gPiAgCQl1bnNpZ25lZCBpbnQgbWluX3NpemU7Cj4+ID4gPiA+ID4gPiArCQl1OCBi cHAgPSBkcm1fZm9ybWF0X2luZm9fcGxhbmVfYnBwKGZiLT5mb3JtYXQsIGkpOwo+PiA+ID4gPiA+ ID4KPj4gPiA+ID4gPiA+ICAJCW9ianNbaV0gPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZmlsZSwg bW9kZV9jbWQtPmhhbmRsZXNbaV0pOwo+PiA+ID4gPiA+ID4gIAkJaWYgKCFvYmpzW2ldKSB7Cj4+ ID4gPiA+ID4gPiBAQCAtMTcwLDcgKzE3MSw3IEBAIGRybV9nZW1fZmJfY3JlYXRlX3dpdGhfZnVu Y3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9maWxlICpmaWxlLAo+PiA+ID4g PiA+ID4gIAkJfQo+PiA+ID4gPiA+ID4KPj4gPiA+ID4gPiA+ICAJCW1pbl9zaXplID0gKGhlaWdo dCAtIDEpICogbW9kZV9jbWQtPnBpdGNoZXNbaV0KPj4gPiA+ID4gPiA+IC0JCQkgKyB3aWR0aCAq IGluZm8tPmNwcFtpXQo+PiA+ID4gPiA+ID4gKwkJCSArIERJVl9ST1VORF9VUCh3aWR0aCAqIGJw cCwgOCkKPj4gPiA+ID4gPiA+ICAJCQkgKyBtb2RlX2NtZC0+b2Zmc2V0c1tpXTsKPj4gPiA+ID4g PiA+Cj4+ID4gPiA+ID4gPiAgCQlpZiAob2Jqc1tpXS0+c2l6ZSA8IG1pbl9zaXplKSB7Cj4+ID4g PiA+ID4gPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2ZvdXJjYy5oIGIvaW5jbHVkZS9k cm0vZHJtX2ZvdXJjYy5oCj4+ID4gPiA+ID4gPiBpbmRleCAzZTg2NDA4ZGFjOWYuLmQ0YWY0ZGFi MTYyMyAxMDA2NDQKPj4gPiA+ID4gPiA+IC0tLSBhL2luY2x1ZGUvZHJtL2RybV9mb3VyY2MuaAo+ PiA+ID4gPiA+ID4gKysrIGIvaW5jbHVkZS9kcm0vZHJtX2ZvdXJjYy5oCj4+ID4gPiA+ID4gPiBA QCAtMzYsNiArMzYsNyBAQCBzdHJ1Y3QgZHJtX21vZGVfZmJfY21kMjsKPj4gPiA+ID4gPiA+ICAg Kgl1c2UgaW4gbmV3IGNvZGUgYW5kIHNldCB0byAwIGZvciBuZXcgZm9ybWF0cy4KPj4gPiA+ID4g PiA+ICAgKiBAbnVtX3BsYW5lczogTnVtYmVyIG9mIGNvbG9yIHBsYW5lcyAoMSB0byAzKQo+PiA+ ID4gPiA+ID4gICAqIEBjcHA6IE51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwgKHBlciBwbGFuZSkK Pj4gPiA+ID4gPiA+ICsgKiBAYnBwOiBOdW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwgKHBlciBwbGFu ZSksIG9ubHkgdmFsaWQgaWYgY3BwWzBdID09IDAuCj4+ID4gPiA+ID4gPiAgICogQGhzdWI6IEhv cml6b250YWwgY2hyb21hIHN1YnNhbXBsaW5nIGZhY3Rvcgo+PiA+ID4gPiA+ID4gICAqIEB2c3Vi OiBWZXJ0aWNhbCBjaHJvbWEgc3Vic2FtcGxpbmcgZmFjdG9yCj4+ID4gPiA+ID4gPiAgICogQGhh c19hbHBoYTogRG9lcyB0aGUgZm9ybWF0IGVtYmVkcyBhbiBhbHBoYSBjb21wb25lbnQ/Cj4+ID4g PiA+ID4gPiBAQCAtNDUsNiArNDYsNyBAQCBzdHJ1Y3QgZHJtX2Zvcm1hdF9pbmZvIHsKPj4gPiA+ ID4gPiA+ICAJdTggZGVwdGg7Cj4+ID4gPiA+ID4gPiAgCXU4IG51bV9wbGFuZXM7Cj4+ID4gPiA+ ID4gPiAgCXU4IGNwcFszXTsKPj4gPiA+ID4gPiA+ICsJdTggYnBwWzNdOwo+PiA+ID4gPiA+ID4g IAl1OCBoc3ViOwo+PiA+ID4gPiA+ID4gIAl1OCB2c3ViOwo+PiA+ID4gPiA+ID4gIAlib29sIGhh c19hbHBoYTsKPj4gPiA+ID4gPiA+IEBAIC02Niw2ICs2OCw4IEBAIGRybV9nZXRfZm9ybWF0X2lu Zm8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKPj4gPiA+ID4gPiA+ICB1aW50MzJfdCBkcm1fbW9k ZV9sZWdhY3lfZmJfZm9ybWF0KHVpbnQzMl90IGJwcCwgdWludDMyX3QgZGVwdGgpOwo+PiA+ID4g PiA+ID4gIGludCBkcm1fZm9ybWF0X251bV9wbGFuZXModWludDMyX3QgZm9ybWF0KTsKPj4gPiA+ ID4gPiA+ICBpbnQgZHJtX2Zvcm1hdF9wbGFuZV9jcHAodWludDMyX3QgZm9ybWF0LCBpbnQgcGxh bmUpOwo+PiA+ID4gPiA+ID4gK2ludCBkcm1fZm9ybWF0X3BsYW5lX2JwcCh1aW50MzJfdCBmb3Jt YXQsIGludCBwbGFuZSk7Cj4+ID4gPiA+ID4gPiAraW50IGRybV9mb3JtYXRfaW5mb19wbGFuZV9i cHAoY29uc3Qgc3RydWN0IGRybV9mb3JtYXRfaW5mbyAqZm9ybWF0LCBpbnQgcGxhbmUpOwo+PiA+ ID4gPiA+ID4gIGludCBkcm1fZm9ybWF0X2hvcnpfY2hyb21hX3N1YnNhbXBsaW5nKHVpbnQzMl90 IGZvcm1hdCk7Cj4+ID4gPiA+ID4gPiAgaW50IGRybV9mb3JtYXRfdmVydF9jaHJvbWFfc3Vic2Ft cGxpbmcodWludDMyX3QgZm9ybWF0KTsKPj4gPiA+ID4gPiA+ICBpbnQgZHJtX2Zvcm1hdF9wbGFu ZV93aWR0aChpbnQgd2lkdGgsIHVpbnQzMl90IGZvcm1hdCwgaW50IHBsYW5lKTsKPj4gPiA+ID4g PiA+IC0tCj4+ID4gPiA+ID4gPiAyLjE2LjEKPj4gPiA+ID4gPiA+Cj4+ID4gPiA+ID4KPj4gPiA+ ID4gPiAtLQo+PiA+ID4gPiA+IERhbmllbCBWZXR0ZXIKPj4gPiA+ID4gPiBTb2Z0d2FyZSBFbmdp bmVlciwgSW50ZWwgQ29ycG9yYXRpb24KPj4gPiA+ID4gPiBodHRwOi8vYmxvZy5mZndsbC5jaAo+ PiA+ID4KPj4gPiA+IC0tCj4+ID4gPiBEYW5pZWwgVmV0dGVyCj4+ID4gPiBTb2Z0d2FyZSBFbmdp bmVlciwgSW50ZWwgQ29ycG9yYXRpb24KPj4gPiA+IGh0dHA6Ly9ibG9nLmZmd2xsLmNoCj4+ID4g X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPj4gPiBkcmkt ZGV2ZWwgbWFpbGluZyBsaXN0Cj4+ID4gZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+ PiA+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRl dmVsCj4+Cj4+IC0tCj4+IERhbmllbCBWZXR0ZXIKPj4gU29mdHdhcmUgRW5naW5lZXIsIEludGVs IENvcnBvcmF0aW9uCj4+IGh0dHA6Ly9ibG9nLmZmd2xsLmNoCj4KPi0tIAo+PT09PT09PT09PT09 PT09PT09PT0KPnwgSSB3b3VsZCBsaWtlIHRvIHwKPnwgZml4IHRoZSB3b3JsZCwgIHwKPnwgYnV0 IHRoZXkncmUgbm90IHwKPnwgZ2l2aW5nIG1lIHRoZSAgIHwKPiBcIHNvdXJjZSBjb2RlISAgLwo+ ICAtLS0tLS0tLS0tLS0tLS0KPiAgICDCr1xfKOODhClfL8KvCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRl dmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=