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=-0.6 required=3.0 tests=DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_PASS,T_DKIM_INVALID, URIBL_BLOCKED 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 BFF97C46469 for ; Wed, 12 Sep 2018 18:24:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4D8372087F for ; Wed, 12 Sep 2018 18:24:40 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=ffwll.ch header.i=@ffwll.ch header.b="IE2PkBb7" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4D8372087F Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ffwll.ch 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 S1728003AbeILXaV (ORCPT ); Wed, 12 Sep 2018 19:30:21 -0400 Received: from mail-io1-f67.google.com ([209.85.166.67]:43635 "EHLO mail-io1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726608AbeILXaV (ORCPT ); Wed, 12 Sep 2018 19:30:21 -0400 Received: by mail-io1-f67.google.com with SMTP id y10-v6so990865ioa.10 for ; Wed, 12 Sep 2018 11:24:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc:content-transfer-encoding; bh=yXagAwz9OXVwf8OLa0QMx8bn7g+AHYF3HAHmvVSJz0w=; b=IE2PkBb7J4GIuU39S2Eol2RXr6jxrArRZBNPI0JKdBNpmbIyS+MfSSQHlDEKt6FGf2 ecG8+YPAPFqXsPcyxFRBTigoKFIP2o7U1nXk7XZlXpdcethh19t+Ac/jA3dJPd9yf6fm PdVBmnT3PVjeP8EforyHyl8AK2msEnwI65Q+E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc:content-transfer-encoding; bh=yXagAwz9OXVwf8OLa0QMx8bn7g+AHYF3HAHmvVSJz0w=; b=Z/TqytGM33Raq5CtUl+lM/Jn6ScsBrjFe4eMxjEzvn7d/8pGOMAkyIibOvEY9m86Al yLiysFZEiVs0A9K4YfPerPx9OA2zoaCn0+N69I5+xYEDTHw5R9nen4VbXiYNBPrGWi7Y U/GYqdo4hqlvJx+2dGYRoycDiDk2m5Ud8hfUxr5VIQrwMShKiqCuXEHt/CG76FUhYgcr uEqd11sysa1XwPbJm4/MSwQleWIscyZXd0ceG2F+wJRsBDz6trxv+Uj2B4qJeCZhSTHM 1ddSfyFlCTuw/pdhtnZ+J7nu4n7bYcZ7zrMxOQp3M4DlESeKd6AFbKn5QgzSqEssAoYL nWiw== X-Gm-Message-State: APzg51DVsNZqCbEN6bmh3AZfA/P2up7/HQZxCIcwMjflJA5YAyq9GGkJ 3GdR5w/DvZtitmOdcm0pAPNBZpVk2DnF3ih5AX/fTw== X-Google-Smtp-Source: ANB0VdYuAcP9glj9GqsHRg6fqGpaPfjG+/9uVnDruOBkndrgio53vzbQDTkGKPLi7cClgyFs9cErFJED/3Q8nNRuw40= X-Received: by 2002:a6b:3a0b:: with SMTP id h11-v6mr2953062ioa.278.1536776676304; Wed, 12 Sep 2018 11:24:36 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a4f:bf05:0:0:0:0:0 with HTTP; Wed, 12 Sep 2018 11:24:35 -0700 (PDT) X-Originating-IP: [2a02:168:569e:0:3106:d637:d723:e855] In-Reply-To: <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> <20180912152704.GF936@e110455-lin.cambridge.arm.com> From: Daniel Vetter Date: Wed, 12 Sep 2018 20:24:35 +0200 X-Google-Sender-Auth: 3_7568geInDjOXAMDbXZnArzXQI Message-ID: Subject: Re: [RFC PATCH v2 1/3] drm/fourcc: Add 'bpp' field for formats with non-integer bytes-per-pixel To: Liviu Dudau Cc: Brian Starkey , dri-devel , Daniel Stone , Dave Airlie , Gustavo Padovan , Maarten Lankhorst , Sean Paul , Linux Kernel Mailing List , Alexandru-Cosmin Gheorghe , Ayan Kumar Halder , Tomasz Figa , "Kristian H . Kristensen" Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable 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 5:27 PM, 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, whi= ch can't >> > > > > > be handled with the existing 'cpp' field in drm_format_info. T= o handle >> > > > > > these formats, add a 'bpp' field, which is only used if cpp[0]= =3D=3D 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-pixe= l for any >> > > > > > format. >> > > > > > >> > > > > > It's assumed that drivers will use the 'bpp' field when they a= dd 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 b= ytes? 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 uni= ts >> > > > > measured in bytes which span more than 1x1 pixel. And I kinda do= n't want a >> > > > > metric pile of special cases here in the format code, because th= at just >> > > > > means every driver handles a different subset, with different bu= gs. >> > > > > -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 AFB= C >> > > > 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 2= x4 >> > > > tiles, which guarantees a multiple of 8), but it would be an >> > > > arbitrarily-selected lie, which often seems to spell trouble. If w= e >> > > > did do that, would you re-define cpp as "bytes-per-tile"? Otherwis= e >> > > > 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 a= nd >> > > > 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, w= hether >> > > 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 her= e? >> > >> > 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 a= ll >> 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 a= ll >> 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 yo= u >> 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 =3D 1 pixel) > and tiled (where unit =3D 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)? I dont think this captures the gist of what I have in mind. I've laid out the math in another reply. What I don't want is to add bpp and tile_size/h/w, because that's redundant, and you can express any bpp value in terms of tile_size/w. We should probably also throw out cpp, but that's a bit more involved (well, just need a wrapper to compute cpp and then a cocci script and done). -Daniel > 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 tha= t >> 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(struc= t drm_framebuffer *fb, >> > > > > > { >> > > > > > struct drm_gem_cma_object *obj; >> > > > > > dma_addr_t paddr; >> > > > > > + u8 bpp =3D drm_format_info_plane_bpp(fb->format, plane); >> > > > > > + >> > > > > > + /* This can't work for non-integer bytes-per-pixel */ >> > > > > > + WARN_ON(bpp % 8); >> > > > > > >> > > > > > obj =3D drm_fb_cma_get_gem_obj(fb, plane); >> > > > > > if (!obj) >> > > > > > return 0; >> > > > > > >> > > > > > paddr =3D obj->paddr + fb->offsets[plane]; >> > > > > > - paddr +=3D fb->format->cpp[plane] * (state->src_x >> 16); >> > > > > > + paddr +=3D (bpp / 8) * (state->src_x >> 16); >> > > > > > paddr +=3D 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_va= r_screeninfo *var, >> > > > > > struct drm_fb_helper *fb_helper =3D info->par; >> > > > > > struct drm_framebuffer *fb =3D fb_helper->fb; >> > > > > > int depth; >> > > > > > + u8 bpp =3D drm_format_info_plane_bpp(fb->format, 0); >> > > > > > >> > > > > > if (var->pixclock !=3D 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 push= ed back >> > > > > > * to KMS, hence fail if different settings are requested. >> > > > > > */ >> > > > > > - if (var->bits_per_pixel !=3D fb->format->cpp[0] * 8 || >> > > > > > + if (var->bits_per_pixel !=3D bpp || >> > > > > > var->xres > fb->width || var->yres > fb->height || >> > > > > > var->xres_virtual > fb->width || var->yres_virtual > f= b->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_pixe= l, >> > > > > > 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 =3D fb_helper->fb; >> > > > > > + u8 bpp =3D drm_format_info_plane_bpp(fb->format, 0); >> > > > > > >> > > > > > info->pseudo_palette =3D fb_helper->pseudo_palette; >> > > > > > info->var.xres_virtual =3D fb->width; >> > > > > > info->var.yres_virtual =3D fb->height; >> > > > > > - info->var.bits_per_pixel =3D fb->format->cpp[0] * 8; >> > > > > > + info->var.bits_per_pixel =3D bpp; >> > > > > > info->var.accel_flags =3D FB_ACCELF_TEXT; >> > > > > > info->var.xoffset =3D 0; >> > > > > > info->var.yoffset =3D 0; >> > > > > > diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/dr= m_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 >=3D 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 =3D 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 v= alue >> > > > > > + * >> > > > > > + * Convenience function which handles formats with both integ= er >> > > > > > + * 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 *i= nfo, int plane) >> > > > > > +{ >> > > > > > + if (plane >=3D 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 ch= roma subsampling factor >> > > > > > * @format: pixel format (DRM_FORMAT_*) >> > > > > > diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/d= rm/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 =3D 0; i < info->num_planes; i++) { >> > > > > > unsigned int width =3D fb_plane_width(r->width, in= fo, i); >> > > > > > unsigned int height =3D fb_plane_height(r->height,= info, i); >> > > > > > - unsigned int cpp =3D info->cpp[i]; >> > > > > > + unsigned int bpp =3D drm_format_info_plane_bpp(inf= o, 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) widt= h * 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 =3D fb->height; >> > > > > > r->width =3D fb->width; >> > > > > > r->depth =3D fb->format->depth; >> > > > > > - r->bpp =3D fb->format->cpp[0] * 8; >> > > > > > + r->bpp =3D drm_format_info_plane_bpp(fb->format, 0); >> > > > > > r->pitch =3D 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/dr= ivers/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_de= vice *dev, struct drm_file *file, >> > > > > > unsigned int width =3D mode_cmd->width / (i ? info= ->hsub : 1); >> > > > > > unsigned int height =3D mode_cmd->height / (i ? in= fo->vsub : 1); >> > > > > > unsigned int min_size; >> > > > > > + u8 bpp =3D drm_format_info_plane_bpp(fb->format, i= ); >> > > > > > >> > > > > > objs[i] =3D drm_gem_object_lookup(file, mode_cmd->= handles[i]); >> > > > > > if (!objs[i]) { >> > > > > > @@ -170,7 +171,7 @@ drm_gem_fb_create_with_funcs(struct drm_de= vice *dev, struct drm_file *file, >> > > > > > } >> > > > > > >> > > > > > min_size =3D (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] =3D=3D 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 dep= th); >> > > > > > 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 *f= ormat, 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 pl= ane); >> > > > > > -- >> > > > > > 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 > > -- > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > | I would like to | > | fix the world, | > | but they're not | > | giving me the | > \ source code! / > --------------- > =C2=AF\_(=E3=83=84)_/=C2=AF > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel --=20 Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter 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 20:24:35 +0200 Message-ID: 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" Content-Transfer-Encoding: base64 Return-path: Received: from mail-io1-xd43.google.com (mail-io1-xd43.google.com [IPv6:2607:f8b0:4864:20::d43]) by gabe.freedesktop.org (Postfix) with ESMTPS id 36DD76E0E6 for ; Wed, 12 Sep 2018 18:24:37 +0000 (UTC) Received: by mail-io1-xd43.google.com with SMTP id q5-v6so1026928iop.3 for ; Wed, 12 Sep 2018 11:24:37 -0700 (PDT) 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: Dave Airlie , Alexandru-Cosmin Gheorghe , Linux Kernel Mailing List , Tomasz Figa , Sean Paul , dri-devel , "Kristian H . Kristensen" , Ayan Kumar Halder List-Id: dri-devel@lists.freedesktop.org T24gV2VkLCBTZXAgMTIsIDIwMTggYXQgNToyNyBQTSwgTGl2aXUgRHVkYXUgPGxpdml1LmR1ZGF1 QGFybS5jb20+IHdyb3RlOgo+IE9uIE1vbiwgU2VwIDEwLCAyMDE4IGF0IDA5OjUzOjI1UE0gKzAy MDAsIERhbmllbCBWZXR0ZXIgd3JvdGU6Cj4+IE9uIE1vbiwgU2VwIDEwLCAyMDE4IGF0IDA5OjUw OjAzQU0gKzAxMDAsIEJyaWFuIFN0YXJrZXkgd3JvdGU6Cj4+ID4gSGksCj4+ID4KPj4gPiBPbiBG cmksIFNlcCAwNywgMjAxOCBhdCAwOToyODo0NFBNICswMjAwLCBEYW5pZWwgVmV0dGVyIHdyb3Rl Ogo+PiA+ID4gT24gRnJpLCBTZXAgMDcsIDIwMTggYXQgMDE6NDU6MzZQTSArMDEwMCwgQnJpYW4g U3RhcmtleSB3cm90ZToKPj4gPiA+ID4gSGkgRGFuaWVsLAo+PiA+ID4gPgo+PiA+ID4gPiBPbiBG cmksIEF1ZyAzMSwgMjAxOCBhdCAxMDoxNzozMEFNICswMjAwLCBEYW5pZWwgVmV0dGVyIHdyb3Rl Ogo+PiA+ID4gPiA+IE9uIFRodSwgQXVnIDIzLCAyMDE4IGF0IDA0OjIzOjQxUE0gKzAxMDAsIEJy aWFuIFN0YXJrZXkgd3JvdGU6Cj4+ID4gPiA+ID4gPiBTb21lIGZvcm1hdHMgaGF2ZSBhIG5vbi1p bnRlZ2VyIG51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwsIHdoaWNoIGNhbid0Cj4+ID4gPiA+ID4g PiBiZSBoYW5kbGVkIHdpdGggdGhlIGV4aXN0aW5nICdjcHAnIGZpZWxkIGluIGRybV9mb3JtYXRf aW5mby4gVG8gaGFuZGxlCj4+ID4gPiA+ID4gPiB0aGVzZSBmb3JtYXRzLCBhZGQgYSAnYnBwJyBm aWVsZCwgd2hpY2ggaXMgb25seSB1c2VkIGlmIGNwcFswXSA9PSAwLgo+PiA+ID4gPiA+ID4KPj4g PiA+ID4gPiA+IFRoaXMgdXBkYXRlcyBhbGwgdGhlIHVzZXJzIG9mIGZvcm1hdC0+Y3BwIGluIHRo ZSBjb3JlIERSTSBjb2RlLAo+PiA+ID4gPiA+ID4gY29udmVydGluZyB0aGVtIHRvIHVzZSBhIG5l dyBmdW5jdGlvbiB0byBnZXQgdGhlIGJpdHMtcGVyLXBpeGVsIGZvciBhbnkKPj4gPiA+ID4gPiA+ IGZvcm1hdC4KPj4gPiA+ID4gPiA+Cj4+ID4gPiA+ID4gPiBJdCdzIGFzc3VtZWQgdGhhdCBkcml2 ZXJzIHdpbGwgdXNlIHRoZSAnYnBwJyBmaWVsZCB3aGVuIHRoZXkgYWRkIHN1cHBvcnQKPj4gPiA+ ID4gPiA+IGZvciBwaXhlbCBmb3JtYXRzIHdpdGggbm9uLWludGVnZXIgYnl0ZXMtcGVyLXBpeGVs Lgo+PiA+ID4gPiA+ID4KPj4gPiA+ID4gPiA+IFNpZ25lZC1vZmYtYnk6IEJyaWFuIFN0YXJrZXkg PGJyaWFuLnN0YXJrZXlAYXJtLmNvbT4KPj4gPiA+ID4gPgo+PiA+ID4gPiA+IEkgYXNzdW1lIHlv dSBzdGlsbCByZXF1aXJlIHRoYXQgc3R1ZmYgaXMgZXZlbnR1YWxseSBhbGlnbmVkIHRvIGJ5dGVz PyBJbgo+PiA+ID4gPiA+IHRoYXQgY2FzZSwgY2FuIHdlIHN1YnN1bWUgdGhpcyBpbnRvIHRoZSB0 aWxlIHdvcmsgQWxleCBpcyBkb2luZz8gSXQncwo+PiA+ID4gPiA+IGVzc2VudGlhbGx5IGp1c3Qg YW5vdGhlciBzcGVjaWFsIGNhc2Ugb2YgaGF2aW5nIHN0b3JhZ2Utc2l6ZSB1bml0cwo+PiA+ID4g PiA+IG1lYXN1cmVkIGluIGJ5dGVzIHdoaWNoIHNwYW4gbW9yZSB0aGFuIDF4MSBwaXhlbC4gQW5k IEkga2luZGEgZG9uJ3Qgd2FudCBhCj4+ID4gPiA+ID4gbWV0cmljIHBpbGUgb2Ygc3BlY2lhbCBj YXNlcyBoZXJlIGluIHRoZSBmb3JtYXQgY29kZSwgYmVjYXVzZSB0aGF0IGp1c3QKPj4gPiA+ID4g PiBtZWFucyBldmVyeSBkcml2ZXIgaGFuZGxlcyBhIGRpZmZlcmVudCBzdWJzZXQsIHdpdGggZGlm ZmVyZW50IGJ1Z3MuCj4+ID4gPiA+ID4gLURhbmllbAo+PiA+ID4gPgo+PiA+ID4gPiBTb3JyeSBm b3IgdGhlIGRlbGF5LCBiZWVuIHN0cnVnZ2xpbmcgdG8gZnJlZSBzb21lIGN5Y2xlcyB0byB0aGlu awo+PiA+ID4gPiBhYm91dCB0aGlzLgo+PiA+ID4gPgo+PiA+ID4gPiBJJ20gbm90IHN1cmUgaG93 IHRvIHB1bGwgdGhpcyBpbiB3aXRoIHRoZSB0aWxpbmcgc3R1ZmYuIEluIHRoZSBBRkJDCj4+ID4g PiA+IGNhc2UgdGhlbiBvdXIgQUZCQyBzdXBlcmJsb2NrcyBhcmUgYWx3YXlzIG5pY2Ugcm91bmQg bnVtYmVycyAoMjU2Cj4+ID4gPiA+IHBpeGVscyksIGFuZCBzbyBpdCBkb2VzIGVuZCB1cCBiZWlu ZyBhIG11bHRpcGxlIG9mIGJ5dGVzLgo+PiA+ID4gPgo+PiA+ID4gPiBIb3dldmVyLCBBRkJDIHN1 cHBvcnRzIGRpZmZlcmVudCBzdXBlcmJsb2NrIHNpemVzLCBzbyBwaWNraW5nIGp1c3Qgb25lCj4+ ID4gPiA+IGRvZXNuJ3QgcmVhbGx5IHdvcmsgb3V0LCBhbmQgcHV0dGluZyBBRkJDIGluIHRoZSBj b3JlIGZvcm1hdCB0YWJsZQo+PiA+ID4gPiB3aGljaCByZWZsZWN0cyBBRkJDIGRvZXNuJ3Qgc2Vl bSBnb29kLgo+PiA+ID4gPgo+PiA+ID4gPiBXZSBjb3VsZCBtYWtlIHNvbWV0aGluZyB1cCAoZS5n LiBjYWxsIHRoZXNlIGZvcm1hdHMgInRpbGVkIiB3aXRoIDJ4NAo+PiA+ID4gPiB0aWxlcywgd2hp Y2ggZ3VhcmFudGVlcyBhIG11bHRpcGxlIG9mIDgpLCBidXQgaXQgd291bGQgYmUgYW4KPj4gPiA+ ID4gYXJiaXRyYXJpbHktc2VsZWN0ZWQgbGllLCB3aGljaCBvZnRlbiBzZWVtcyB0byBzcGVsbCB0 cm91YmxlLiBJZiB3ZQo+PiA+ID4gPiBkaWQgZG8gdGhhdCwgd291bGQgeW91IHJlLWRlZmluZSBj cHAgYXMgImJ5dGVzLXBlci10aWxlIj8gT3RoZXJ3aXNlCj4+ID4gPiA+IHdlIHN0aWxsIG5lZWQg dG8gYWRkIGEgbmV3IGZpZWxkIGFueXdheS4KPj4gPiA+ID4KPj4gPiA+ID4gV2hhdCdzIHRoZSBw aWxlIG9mIHNwZWNpYWwgY2FzZXMgeW91J3JlIHdvcnJpZWQgYWJvdXQ/IFRoZSBoZWxwZXIgSSd2 ZQo+PiA+ID4gPiBhZGRlZCBoZXJlIG1lYW5zIHRoYXQgZHJpdmVycyB3aGljaCBuZWVkIHRvIGNh cmUgY2FuIHVzZSBvbmUgQVBJIGFuZAo+PiA+ID4gPiBub3QgaW1wbGVtZW50IHRoZWlyIG93biBi dWdzLgo+PiA+ID4KPj4gPiA+IEknbSBjb25mdXNlZCAuLi4gdGhlIG5ldyBiaXRzLXBlci1waXhl bCBzdHVmZiB5b3UncmUgYWRkaW5nIGhlcmUgaXMgZm9yCj4+ID4gPiB5dXYgZm9ybWF0cywgbm90 IGFmYmMuIEknbSBqdXN0IHN1Z2dlc3Rpbmcgd2UgaGF2ZSBvbmx5IDEgd2F5IG9mCj4+ID4gPiBk ZXNjcmliaW5nIHN1Y2ggZm9ybWF0cyB0aGF0IG5lZWQgbW9yZSBkZXNjcmlwdGl2ZSBwb3dlciB0 aGFuIGNwcCwgd2hldGhlcgo+PiA+ID4gdGhleSBoYXZlIHNvbWUga2luZCBvZiBwaXhlbC1ncm91 cHMgb3Igc21hbGwgdGlsZXMuCj4+ID4KPj4gPiBXZWxsLCBub3QgcmVhbGx5LiBUaGUgdGhyZWUg Zm9ybWF0cyB3aGljaCBoYXZlIG5vbi1pbnRlZ2VyIGNwcCBhcmU6Cj4+ID4gRFJNX0ZPUk1BVF9W VVkxMDEwMTAsIERSTV9GT1JNQVRfWVVWNDIwXzhCSVQgYW5kCj4+ID4gRFJNX0ZPUk1BVF9ZVVY0 MjBfMTBCSVQuIFRoZXNlIGZvcm1hdHMgYXJlIG9ubHkgdmFsaWQgd2l0aCBub24tbGluZWFyCj4+ ID4gbW9kaWZpZXJzIChubyBsaW5lYXIgZW5jb2RpbmcgaXMgZGVmaW5lZCkuIE1hbGkgb25seSBz dXBwb3J0cyB0aGVtCj4+ID4gd2l0aCBBRkJDLgo+PiA+Cj4+ID4gVGhlIGZvcm1hdHMgdGhlbXNl bHZlcyBoYXZlIG5vIG5vdGlvbiBvZiB0aWxpbmcgb3IgZ3JvdXBpbmcgLSB0aGUKPj4gPiBtb2Rp ZmllciBhZGRzIHRoYXQuIEknbSBub3QgYXdhcmUgb2YgYW55IG5vbi1BRkJDIHVzZXMgb2YgdGhl c2UKPj4gPiBmb3JtYXRzLCBzbyBJIGRvbid0IHdhbnQgdG8gIm1ha2UgdXAiIGEgc21hbGwtdGls ZSBsYXlvdXQgcmVzdHJpY3Rpb24KPj4gPiBmb3IgdGhlbS4KPj4KPj4gQWgsIEkgbWlzc2VkIHRo YXQuCj4+Cj4+ID4gPiBGb3IgdmVyeSBzcGVjaWFsIHN0dWZmIGxpa2UgYWZiYyB5b3UgbmVlZCB0 byB2YWxpZGF0ZSBpbiB0aGUgZHJpdmVyCj4+ID4gPiBhbnl3YXksIHRvbyBjb21wbGljYXRlZC4g U28gSSBoYXZlIG5vIGlkZWEgd2h5IHlvdSBicmluZyB0aGlzIHVwIGhlcmU/Cj4+ID4KPj4gPiBT dXJlLCB3ZSBjYW4ganVzdCBsZXQgZHJpdmVycyBwcm92aWRlIHRoZWlyIG93biBmb3JtYXRfaW5m bydzIGZvcgo+PiA+IHRoZXNlLCBpZiB0aGF0J3Mgd2hhdCB5b3UgcHJlZmVyLiBUaGUgY29yZSBm b3JtYXQgY2hlY2tpbmcgY29kZSBjYW4KPj4gPiBlcnJvciBvdXQgaWYgaXQgZXZlciBlbmNvdW50 ZXJzIHRoZW0uCj4+Cj4+IEl0J3MgZm9ybWF0X2luZm8gd2UncmUgdGFsa2luZyBhYm91dC4gV2hh dCBJIG1lYW4gaXMgdGhhdCB5b3UganVzdCBzZXQgYWxsCj4+IHRoZXNlIHRvIDAgYW5kIGxldCB0 aGUgZm9ybWF0X2luZm8gY29kZSBpZ25vcmUgaXQuIEFuZCB0aGVuIGhhdmluZyBhCj4+IGJlc3Bv a2UgZHJtX2Zvcm1hdF9jaGVja19hZmJjIGhlbHBlciBmdW5jdGlvbiBvciBzaW1pbGFyLCB3aGlj aCBjaGVja3MgYWxsCj4+IHRoZSBsYXlvdXQgcmVzdHJpY3Rpb25zIG9mIGFmYmMuCj4+Cj4+IEkg c3RpbGwgbWFpbnRhaW4gdGhhdCBicHAgYW5kIHRpbGVfc2l6ZSBhcmUgZXF1YXZhbGVudCwgYW5k IHdlIHJlYWxseQo+PiBkb24ndCBuZWVkIGJvdGguIEJvdGggYXJlIGRlZmFjdG8gYSBmb3JtIG9m IG51bWVyYXRvci9kZW51bWVyYXRvci4gSWYgeW91Cj4+IGRvbid0IGxpa2UgdGhhdCB5b3UgaGF2 ZSB0byBpbnRyb2R1Y2UgImZha2UiIHRpbGVzIGZvciBhZmJjLCB0aGVuIHdlIGNhbgo+PiByZW5h bWUgdGlsZV9zaXplIHRvIG51bWVyYXRvciBhbmQgdGlsZV9oL3cgdG8gZGVudW1lcmF0b3JfaC93 LiBEb2Vzbid0Cj4+IGNoYW5nZSBvbmUgYml0IG9mIHRoZSBtYXRoLiBicHAgc2ltcGx5IGhhcmRj b2RlcyBhIGRlbnVtZXJhdG9yIG9mIDgsIGFuZCBJCj4+IGRvbid0IHNlZSB3aHkgd2UgbmVlZCB0 aGF0IHNwZWNpYWwgY2FzZS4gRXhjZXB0IGlmIHlvdSBsb3ZlIHRvIHdyaXRlCj4+IHJlZHVuZGFu dCBzZWxmIHRlc3RzIGZvciBhbGwgdGhlIG1hdGggOi0pCj4KPiBNeSAkLjAyIHdvcnRoIG9mIHRo b3VnaHRzOgo+Cj4gSSBnZXQgdGhlIGZhY3QgdGhhdCBEYW5pZWwgZG9lc24ndCBsaWtlIHVzIHRv IGFkZCAzIG5ldyB2YXJpYWJsZXMgaW50bwo+IGZvcm1hdF9pbmZvIChicHAsIHRpbGVfdywgdGls ZV9oKSBhbmQgdGhhdCBhZGRpbmcgYSAiYml0c19wZXJfdW5pdCIKPiB2YXJpYWJsZSBzaG91bGQg YmUgYWJsZSB0byB0YWtlIGNhcmUgb2YgbGluZWFyICh3aGVyZSB1bml0ID0gMSBwaXhlbCkKPiBh bmQgdGlsZWQgKHdoZXJlIHVuaXQgPSB0aWxlX3cgKiB0aWxlX2ggcGl4ZWxzKSBmb3JtYXRzLiBB bmQgSSBhbHNvIHNlZQo+IERhbmllbCdzIG9wdGlvbiAyIGJlbG93LCB3aGVyZSBoZSBzYXlzIGl0 IGlzIHJlYXNvbmFibGUgdG8gY2hlY2sgQUZCQwo+IHdpdGhvdXQgdXNpbmcgZm9ybWF0X2luZm8u Cj4KPiBIb3dldmVyLCB0aGUgcHJvYmxlbSB3ZSBhcmUgdHJ5aW5nIHRvIHNvbHZlIGlzIDIgZm9s ZDogd2UgYXJlIHRyeWluZyB0bwo+IGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgZnJhbWVidWZm ZXIgKGFuZCB0aGUgImJpdHNfcGVyX3VuaXQiIG9yCj4gQnJpYW4ncyBicHAgaXMgdXNlZnVsIGZv ciB0aGF0KSwgYnV0IHdlIGFsc28gdHJ5IHRvIHZhbGlkYXRlIHRoZSBzaXplcwo+IHBhc3NlZCBi eSB1c2Vyc3BhY2UgYmFzZWQgb24gdGhlIGRybV9mb3VyY2MuaCttb2RpZmllciBpbmZvLiBJbiB0 aGF0Cj4gY2FzZSwgdGhlIGRyaXZlciBzdGlsbCBuZWVkcyB0byBzdG9yZSBzb21ld2hlcmUgdGhl IHRpbGVfdy90aWxlX2ggZm9yCj4gdGhhdCBnaXZlbiBmb3JtYXQgaW4gb3JkZXIgdG8gY2hlY2sg dGhhdCB0aGUgc3RyaWRlIGlzIGEgd2hvbGUgbXVsdGlwbGUKPiBvZiB0aWxlIHNpemVzLCBzbyB3 ZSB0aG91Z2h0IHRoYXQgcHV0dGluZyBpdCBpbiBmb3JtYXRfaW5mbyBpcyBub3QKPiBlbnRpcmVs eSBwb2ludGxlc3MsIGJlY2F1c2Ugb3RoZXJzIG1pZ2h0IHVzZSB0aG9zZSB2YXJpYWJsZXMgaW4g b3JkZXIgdG8KPiBkbyB0aGVpciBkcml2ZXIgc3BlY2lmaWMgdmFsaWRhdGlvbiwgd2l0aG91dCBj cmVhdGluZyBuZXcgc3RydWN0dXJlcy4KPgo+IERpZCBJIGNhcHR1cmUgdGhlIGRpc2N1c3Npb24g Y29ycmVjdGx5PyBJZiBzbywgY2FuIHdlIGFncmVlIHRoYXQgaXQgaXMKPiBub3QganVzdCB0aGUg ZnJhbWVidWZmZXIgc2l6ZSBjYWxjdWxhdGlvbiB0aGF0IG1hdHRlcnMgYW5kIHRoYXQgdGlsZWQK PiBmb3JtYXRzIHZhbGlkYXRpb24gcmVxdWlyZXMgYSB0aWxlX3cvdGlsZV9oIGluZm8sIHRoZXJl Zm9yZSBBbGV4J3MKPiBwYXRjaGVzIGFuZCBCcmlhbidzIG5lZWQgdG8gYmUgZGlzY3Vzc2VkIHNl cGFyYXRlbHkgKHNvIHRoYXQgd2UgY2FuCj4gYmlrZXNoZWQgb24gd2hldGhlciBmb3JtYXRfaW5m byBpcyB0aGUgcmlnaHQgcGxhY2Ugb3Igbm90KT8KCkkgZG9udCB0aGluayB0aGlzIGNhcHR1cmVz IHRoZSBnaXN0IG9mIHdoYXQgSSBoYXZlIGluIG1pbmQuIEkndmUgbGFpZApvdXQgdGhlIG1hdGgg aW4gYW5vdGhlciByZXBseS4gV2hhdCBJIGRvbid0IHdhbnQgaXMgdG8gYWRkIGJwcCBhbmQKdGls ZV9zaXplL2gvdywgYmVjYXVzZSB0aGF0J3MgcmVkdW5kYW50LCBhbmQgeW91IGNhbiBleHByZXNz IGFueSBicHAKdmFsdWUgaW4gdGVybXMgb2YgdGlsZV9zaXplL3cuIFdlIHNob3VsZCBwcm9iYWJs eSBhbHNvIHRocm93IG91dCBjcHAsCmJ1dCB0aGF0J3MgYSBiaXQgbW9yZSBpbnZvbHZlZCAod2Vs bCwganVzdCBuZWVkIGEgd3JhcHBlciB0byBjb21wdXRlCmNwcCBhbmQgdGhlbiBhIGNvY2NpIHNj cmlwdCBhbmQgZG9uZSkuCi1EYW5pZWwKCj4gQmVzdCByZWdhcmRzLAo+IExpdml1Cj4KPj4KPj4g U28gdHdvIG9wdGlvbnMgdGhhdCBJIHRoaW5rIGFyZSByZWFzb25hYmxlOgo+PiAtIG9uZSBjb21t b24gbnVtZXJhdG9yL2RlbnVtZXJhdG9yLiBJIGRvbid0IGNhcmUgaG93IHlvdSBjYWxsIHRoYXQK Pj4gICBiaWtlc2hlZC4KPj4gLSBkb24ndCBjaGVjayBhZmJjIHVzaW5nIGZvcm1hdF9pbmZvLCBo YXZlIHlvdXIgb3duIGhlbHBlciB0aGF0IGRvZXMgdGhhdAo+PiAgIHVzaW5nIGN1c3RvbSBjb2Rl Lgo+Pgo+PiBDaGVlcnMsIERhbmllbAo+Pgo+PiA+IENoZWVycywKPj4gPiAtQnJpYW4KPj4gPgo+ PiA+ID4gLURhbmllbAo+PiA+ID4KPj4gPiA+ID4KPj4gPiA+ID4gQ2hlZXJzLAo+PiA+ID4gPiAt QnJpYW4KPj4gPiA+ID4KPj4gPiA+ID4gPgo+PiA+ID4gPiA+ID4gLS0tCj4+ID4gPiA+ID4gPiAg ZHJpdmVycy9ncHUvZHJtL2RybV9mYl9jbWFfaGVscGVyLmMgICAgICAgICAgfCAgNiArKystCj4+ ID4gPiA+ID4gPiAgZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYyAgICAgICAgICAgICAg fCAgOCArKystLQo+PiA+ID4gPiA+ID4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fZm91cmNjLmMgICAg ICAgICAgICAgICAgIHwgNTAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+PiA+ID4gPiA+ ID4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fZnJhbWVidWZmZXIuYyAgICAgICAgICAgIHwgIDggKyst LS0KPj4gPiA+ID4gPiA+ICBkcml2ZXJzL2dwdS9kcm0vZHJtX2dlbV9mcmFtZWJ1ZmZlcl9oZWxw ZXIuYyB8ICAzICstCj4+ID4gPiA+ID4gPiAgaW5jbHVkZS9kcm0vZHJtX2ZvdXJjYy5oICAgICAg ICAgICAgICAgICAgICAgfCAgNCArKysKPj4gPiA+ID4gPiA+ICA2IGZpbGVzIGNoYW5nZWQsIDcw IGluc2VydGlvbnMoKyksIDkgZGVsZXRpb25zKC0pCj4+ID4gPiA+ID4gPgo+PiA+ID4gPiA+ID4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfY21hX2hlbHBlci5jIGIvZHJpdmVy cy9ncHUvZHJtL2RybV9mYl9jbWFfaGVscGVyLmMKPj4gPiA+ID4gPiA+IGluZGV4IDE4NmQwMGFk ZmI1Zi4uZTI3OWQ3MGQzZTYwIDEwMDY0NAo+PiA+ID4gPiA+ID4gLS0tIGEvZHJpdmVycy9ncHUv ZHJtL2RybV9mYl9jbWFfaGVscGVyLmMKPj4gPiA+ID4gPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9kcm1fZmJfY21hX2hlbHBlci5jCj4+ID4gPiA+ID4gPiBAQCAtMTE4LDEzICsxMTgsMTcgQEAg ZG1hX2FkZHJfdCBkcm1fZmJfY21hX2dldF9nZW1fYWRkcihzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVy ICpmYiwKPj4gPiA+ID4gPiA+ICB7Cj4+ID4gPiA+ID4gPiAgICAgc3RydWN0IGRybV9nZW1fY21h X29iamVjdCAqb2JqOwo+PiA+ID4gPiA+ID4gICAgIGRtYV9hZGRyX3QgcGFkZHI7Cj4+ID4gPiA+ ID4gPiArICAgdTggYnBwID0gZHJtX2Zvcm1hdF9pbmZvX3BsYW5lX2JwcChmYi0+Zm9ybWF0LCBw bGFuZSk7Cj4+ID4gPiA+ID4gPiArCj4+ID4gPiA+ID4gPiArICAgLyogVGhpcyBjYW4ndCB3b3Jr IGZvciBub24taW50ZWdlciBieXRlcy1wZXItcGl4ZWwgKi8KPj4gPiA+ID4gPiA+ICsgICBXQVJO X09OKGJwcCAlIDgpOwo+PiA+ID4gPiA+ID4KPj4gPiA+ID4gPiA+ICAgICBvYmogPSBkcm1fZmJf Y21hX2dldF9nZW1fb2JqKGZiLCBwbGFuZSk7Cj4+ID4gPiA+ID4gPiAgICAgaWYgKCFvYmopCj4+ ID4gPiA+ID4gPiAgICAgICAgICAgICByZXR1cm4gMDsKPj4gPiA+ID4gPiA+Cj4+ID4gPiA+ID4g PiAgICAgcGFkZHIgPSBvYmotPnBhZGRyICsgZmItPm9mZnNldHNbcGxhbmVdOwo+PiA+ID4gPiA+ ID4gLSAgIHBhZGRyICs9IGZiLT5mb3JtYXQtPmNwcFtwbGFuZV0gKiAoc3RhdGUtPnNyY194ID4+ IDE2KTsKPj4gPiA+ID4gPiA+ICsgICBwYWRkciArPSAoYnBwIC8gOCkgKiAoc3RhdGUtPnNyY194 ID4+IDE2KTsKPj4gPiA+ID4gPiA+ICAgICBwYWRkciArPSBmYi0+cGl0Y2hlc1twbGFuZV0gKiAo c3RhdGUtPnNyY195ID4+IDE2KTsKPj4gPiA+ID4gPiA+Cj4+ID4gPiA+ID4gPiAgICAgcmV0dXJu IHBhZGRyOwo+PiA+ID4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJf aGVscGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCj4+ID4gPiA+ID4gPiBp bmRleCAwNjQ2YjEwODAzMGIuLmFiMzY5ZjI1MGFmNCAxMDA2NDQKPj4gPiA+ID4gPiA+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKPj4gPiA+ID4gPiA+ICsrKyBiL2RyaXZl cnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKPj4gPiA+ID4gPiA+IEBAIC0xNTcyLDYgKzE1NzIs NyBAQCBpbnQgZHJtX2ZiX2hlbHBlcl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZv ICp2YXIsCj4+ID4gPiA+ID4gPiAgICAgc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlciA9 IGluZm8tPnBhcjsKPj4gPiA+ID4gPiA+ICAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9 IGZiX2hlbHBlci0+ZmI7Cj4+ID4gPiA+ID4gPiAgICAgaW50IGRlcHRoOwo+PiA+ID4gPiA+ID4g KyAgIHU4IGJwcCA9IGRybV9mb3JtYXRfaW5mb19wbGFuZV9icHAoZmItPmZvcm1hdCwgMCk7Cj4+ ID4gPiA+ID4gPgo+PiA+ID4gPiA+ID4gICAgIGlmICh2YXItPnBpeGNsb2NrICE9IDAgfHwgaW5f ZGJnX21hc3RlcigpKQo+PiA+ID4gPiA+ID4gICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4+ ID4gPiA+ID4gPiBAQCAtMTU4MCwxNCArMTU4MSwxNCBAQCBpbnQgZHJtX2ZiX2hlbHBlcl9jaGVj a192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCj4+ID4gPiA+ID4gPiAgICAgICog Q2hhbmdlcyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gYXJlIGN1cnJlbnRseSBub3QgcHVzaGVk IGJhY2sKPj4gPiA+ID4gPiA+ICAgICAgKiB0byBLTVMsIGhlbmNlIGZhaWwgaWYgZGlmZmVyZW50 IHNldHRpbmdzIGFyZSByZXF1ZXN0ZWQuCj4+ID4gPiA+ID4gPiAgICAgICovCj4+ID4gPiA+ID4g PiAtICAgaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgIT0gZmItPmZvcm1hdC0+Y3BwWzBdICogOCB8 fAo+PiA+ID4gPiA+ID4gKyAgIGlmICh2YXItPmJpdHNfcGVyX3BpeGVsICE9IGJwcCB8fAo+PiA+ ID4gPiA+ID4gICAgICAgICB2YXItPnhyZXMgPiBmYi0+d2lkdGggfHwgdmFyLT55cmVzID4gZmIt PmhlaWdodCB8fAo+PiA+ID4gPiA+ID4gICAgICAgICB2YXItPnhyZXNfdmlydHVhbCA+IGZiLT53 aWR0aCB8fCB2YXItPnlyZXNfdmlydHVhbCA+IGZiLT5oZWlnaHQpIHsKPj4gPiA+ID4gPiA+ICAg ICAgICAgICAgIERSTV9ERUJVRygiZmIgcmVxdWVzdGVkIHdpZHRoL2hlaWdodC9icHAgY2FuJ3Qg Zml0IGluIGN1cnJlbnQgZmIgIgo+PiA+ID4gPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICJy ZXF1ZXN0ICVkeCVkLSVkICh2aXJ0dWFsICVkeCVkKSA+ICVkeCVkLSVkXG4iLAo+PiA+ID4gPiA+ ID4gICAgICAgICAgICAgICAgICAgICAgIHZhci0+eHJlcywgdmFyLT55cmVzLCB2YXItPmJpdHNf cGVyX3BpeGVsLAo+PiA+ID4gPiA+ID4gICAgICAgICAgICAgICAgICAgICAgIHZhci0+eHJlc192 aXJ0dWFsLCB2YXItPnlyZXNfdmlydHVhbCwKPj4gPiA+ID4gPiA+IC0gICAgICAgICAgICAgICAg ICAgICBmYi0+d2lkdGgsIGZiLT5oZWlnaHQsIGZiLT5mb3JtYXQtPmNwcFswXSAqIDgpOwo+PiA+ ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIGZiLT53aWR0aCwgZmItPmhlaWdodCwgYnBw KTsKPj4gPiA+ID4gPiA+ICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+PiA+ID4gPiA+ID4g ICAgIH0KPj4gPiA+ID4gPiA+Cj4+ID4gPiA+ID4gPiBAQCAtMTk0OSwxMSArMTk1MCwxMiBAQCB2 b2lkIGRybV9mYl9oZWxwZXJfZmlsbF92YXIoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBk cm1fZmJfaGVscGVyICpmYl9oZWxwZQo+PiA+ID4gPiA+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgdWludDMyX3QgZmJfd2lkdGgsIHVpbnQzMl90IGZiX2hlaWdodCkKPj4gPiA+ID4gPiA+ICB7 Cj4+ID4gPiA+ID4gPiAgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIgPSBmYl9oZWxwZXIt PmZiOwo+PiA+ID4gPiA+ID4gKyAgIHU4IGJwcCA9IGRybV9mb3JtYXRfaW5mb19wbGFuZV9icHAo ZmItPmZvcm1hdCwgMCk7Cj4+ID4gPiA+ID4gPgo+PiA+ID4gPiA+ID4gICAgIGluZm8tPnBzZXVk b19wYWxldHRlID0gZmJfaGVscGVyLT5wc2V1ZG9fcGFsZXR0ZTsKPj4gPiA+ID4gPiA+ICAgICBp bmZvLT52YXIueHJlc192aXJ0dWFsID0gZmItPndpZHRoOwo+PiA+ID4gPiA+ID4gICAgIGluZm8t PnZhci55cmVzX3ZpcnR1YWwgPSBmYi0+aGVpZ2h0Owo+PiA+ID4gPiA+ID4gLSAgIGluZm8tPnZh ci5iaXRzX3Blcl9waXhlbCA9IGZiLT5mb3JtYXQtPmNwcFswXSAqIDg7Cj4+ID4gPiA+ID4gPiAr ICAgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID0gYnBwOwo+PiA+ID4gPiA+ID4gICAgIGluZm8t PnZhci5hY2NlbF9mbGFncyA9IEZCX0FDQ0VMRl9URVhUOwo+PiA+ID4gPiA+ID4gICAgIGluZm8t PnZhci54b2Zmc2V0ID0gMDsKPj4gPiA+ID4gPiA+ICAgICBpbmZvLT52YXIueW9mZnNldCA9IDA7 Cj4+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3VyY2MuYyBi L2RyaXZlcnMvZ3B1L2RybS9kcm1fZm91cmNjLmMKPj4gPiA+ID4gPiA+IGluZGV4IDNiNDJjMjVi ZDU4ZC4uYmIyODkxOWMzMmYzIDEwMDY0NAo+PiA+ID4gPiA+ID4gLS0tIGEvZHJpdmVycy9ncHUv ZHJtL2RybV9mb3VyY2MuYwo+PiA+ID4gPiA+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9m b3VyY2MuYwo+PiA+ID4gPiA+ID4gQEAgLTI3MiwxMCArMjcyLDYwIEBAIGludCBkcm1fZm9ybWF0 X3BsYW5lX2NwcCh1aW50MzJfdCBmb3JtYXQsIGludCBwbGFuZSkKPj4gPiA+ID4gPiA+ICAgICBp ZiAoIWluZm8gfHwgcGxhbmUgPj0gaW5mby0+bnVtX3BsYW5lcykKPj4gPiA+ID4gPiA+ICAgICAg ICAgICAgIHJldHVybiAwOwo+PiA+ID4gPiA+ID4KPj4gPiA+ID4gPiA+ICsgICAvKgo+PiA+ID4g PiA+ID4gKyAgICAqIE5vdCB2YWxpZCBmb3IgZm9ybWF0cyB3aXRoIG5vbi1pbnRlZ2VyIGNwcCwK Pj4gPiA+ID4gPiA+ICsgICAgKiB1c2UgZHJtX2Zvcm1hdHtfaW5mb31fcGxhbmVfYnBwIGluc3Rl YWQKPj4gPiA+ID4gPiA+ICsgICAgKi8KPj4gPiA+ID4gPiA+ICsgICBXQVJOX09OKCFpbmZvLT5j cHBbMF0pOwo+PiA+ID4gPiA+ID4gKwo+PiA+ID4gPiA+ID4gICAgIHJldHVybiBpbmZvLT5jcHBb cGxhbmVdOwo+PiA+ID4gPiA+ID4gIH0KPj4gPiA+ID4gPiA+ICBFWFBPUlRfU1lNQk9MKGRybV9m b3JtYXRfcGxhbmVfY3BwKTsKPj4gPiA+ID4gPiA+Cj4+ID4gPiA+ID4gPiArLyoqCj4+ID4gPiA+ ID4gPiArICogZHJtX2Zvcm1hdF9wbGFuZV9icHAgLSBkZXRlcm1pbmUgdGhlIGJpdHMgcGVyIHBp eGVsIHZhbHVlCj4+ID4gPiA+ID4gPiArICogQGZvcm1hdDogcGl4ZWwgZm9ybWF0IChEUk1fRk9S TUFUXyopCj4+ID4gPiA+ID4gPiArICogQHBsYW5lOiBwbGFuZSBpbmRleAo+PiA+ID4gPiA+ID4g KyAqCj4+ID4gPiA+ID4gPiArICogUmV0dXJuczoKPj4gPiA+ID4gPiA+ICsgKiBUaGUgYml0cyBw ZXIgcGl4ZWwgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgcGxhbmUuCj4+ID4gPiA+ID4gPiArICov Cj4+ID4gPiA+ID4gPiAraW50IGRybV9mb3JtYXRfcGxhbmVfYnBwKHVpbnQzMl90IGZvcm1hdCwg aW50IHBsYW5lKQo+PiA+ID4gPiA+ID4gK3sKPj4gPiA+ID4gPiA+ICsgICBjb25zdCBzdHJ1Y3Qg ZHJtX2Zvcm1hdF9pbmZvICppbmZvOwo+PiA+ID4gPiA+ID4gKwo+PiA+ID4gPiA+ID4gKyAgIGlu Zm8gPSBkcm1fZm9ybWF0X2luZm8oZm9ybWF0KTsKPj4gPiA+ID4gPiA+ICsgICBpZiAoIWluZm8p Cj4+ID4gPiA+ID4gPiArICAgICAgICAgICByZXR1cm4gMDsKPj4gPiA+ID4gPiA+ICsKPj4gPiA+ ID4gPiA+ICsgICByZXR1cm4gZHJtX2Zvcm1hdF9pbmZvX3BsYW5lX2JwcChpbmZvLCBwbGFuZSk7 Cj4+ID4gPiA+ID4gPiArfQo+PiA+ID4gPiA+ID4gK0VYUE9SVF9TWU1CT0woZHJtX2Zvcm1hdF9w bGFuZV9icHApOwo+PiA+ID4gPiA+ID4gKwo+PiA+ID4gPiA+ID4gKy8qKgo+PiA+ID4gPiA+ID4g KyAqIGRybV9mb3JtYXRfaW5mb19wbGFuZV9icHAgLSBkZXRlcm1pbmUgdGhlIGJpdHMgcGVyIHBp eGVsIHZhbHVlCj4+ID4gPiA+ID4gPiArICoKPj4gPiA+ID4gPiA+ICsgKiBDb252ZW5pZW5jZSBm dW5jdGlvbiB3aGljaCBoYW5kbGVzIGZvcm1hdHMgd2l0aCBib3RoIGludGVnZXIKPj4gPiA+ID4g PiA+ICsgKiBhbmQgbm9uLWludGVnZXIgYnl0ZXMtcGVyLXBpeGVsLgo+PiA+ID4gPiA+ID4gKyAq Cj4+ID4gPiA+ID4gPiArICogQGZvcm1hdDogcGl4ZWwgZm9ybWF0IGluZm8gc3RydWN0dXJlCj4+ ID4gPiA+ID4gPiArICogQHBsYW5lOiBwbGFuZSBpbmRleAo+PiA+ID4gPiA+ID4gKyAqCj4+ID4g PiA+ID4gPiArICogUmV0dXJuczoKPj4gPiA+ID4gPiA+ICsgKiBUaGUgYml0cyBwZXIgcGl4ZWwg dmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgcGxhbmUuCj4+ID4gPiA+ID4gPiArICovCj4+ID4gPiA+ ID4gPiAraW50IGRybV9mb3JtYXRfaW5mb19wbGFuZV9icHAoY29uc3Qgc3RydWN0IGRybV9mb3Jt YXRfaW5mbyAqaW5mbywgaW50IHBsYW5lKQo+PiA+ID4gPiA+ID4gK3sKPj4gPiA+ID4gPiA+ICsg ICBpZiAocGxhbmUgPj0gaW5mby0+bnVtX3BsYW5lcykKPj4gPiA+ID4gPiA+ICsgICAgICAgICAg IHJldHVybiAwOwo+PiA+ID4gPiA+ID4gKwo+PiA+ID4gPiA+ID4gKyAgIGlmIChpbmZvLT5jcHBb MF0pCj4+ID4gPiA+ID4gPiArICAgICAgICAgICByZXR1cm4gaW5mby0+Y3BwW3BsYW5lXSAqIDg7 Cj4+ID4gPiA+ID4gPiArCj4+ID4gPiA+ID4gPiArICAgcmV0dXJuIGluZm8tPmJwcFtwbGFuZV07 Cj4+ID4gPiA+ID4gPiArfQo+PiA+ID4gPiA+ID4gK0VYUE9SVF9TWU1CT0woZHJtX2Zvcm1hdF9p bmZvX3BsYW5lX2JwcCk7Cj4+ID4gPiA+ID4gPiArCj4+ID4gPiA+ID4gPiAgLyoqCj4+ID4gPiA+ ID4gPiAgICogZHJtX2Zvcm1hdF9ob3J6X2Nocm9tYV9zdWJzYW1wbGluZyAtIGdldCB0aGUgaG9y aXpvbnRhbCBjaHJvbWEgc3Vic2FtcGxpbmcgZmFjdG9yCj4+ID4gPiA+ID4gPiAgICogQGZvcm1h dDogcGl4ZWwgZm9ybWF0IChEUk1fRk9STUFUXyopCj4+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2RybV9mcmFtZWJ1ZmZlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9m cmFtZWJ1ZmZlci5jCj4+ID4gPiA+ID4gPiBpbmRleCA4YzRkMzJhZGNjMTcuLjdlMDAzNjBmZjcw ZCAxMDA2NDQKPj4gPiA+ID4gPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZnJhbWVidWZm ZXIuYwo+PiA+ID4gPiA+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mcmFtZWJ1ZmZlci5j Cj4+ID4gPiA+ID4gPiBAQCAtMTg1LDIwICsxODUsMjAgQEAgc3RhdGljIGludCBmcmFtZWJ1ZmZl cl9jaGVjayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAo+PiA+ID4gPiA+ID4gICAgIGZvciAoaSA9 IDA7IGkgPCBpbmZvLT5udW1fcGxhbmVzOyBpKyspIHsKPj4gPiA+ID4gPiA+ICAgICAgICAgICAg IHVuc2lnbmVkIGludCB3aWR0aCA9IGZiX3BsYW5lX3dpZHRoKHItPndpZHRoLCBpbmZvLCBpKTsK Pj4gPiA+ID4gPiA+ICAgICAgICAgICAgIHVuc2lnbmVkIGludCBoZWlnaHQgPSBmYl9wbGFuZV9o ZWlnaHQoci0+aGVpZ2h0LCBpbmZvLCBpKTsKPj4gPiA+ID4gPiA+IC0gICAgICAgICAgIHVuc2ln bmVkIGludCBjcHAgPSBpbmZvLT5jcHBbaV07Cj4+ID4gPiA+ID4gPiArICAgICAgICAgICB1bnNp Z25lZCBpbnQgYnBwID0gZHJtX2Zvcm1hdF9pbmZvX3BsYW5lX2JwcChpbmZvLCBpKTsKPj4gPiA+ ID4gPiA+Cj4+ID4gPiA+ID4gPiAgICAgICAgICAgICBpZiAoIXItPmhhbmRsZXNbaV0pIHsKPj4g PiA+ID4gPiA+ICAgICAgICAgICAgICAgICAgICAgRFJNX0RFQlVHX0tNUygibm8gYnVmZmVyIG9i amVjdCBoYW5kbGUgZm9yIHBsYW5lICVkXG4iLCBpKTsKPj4gPiA+ID4gPiA+ICAgICAgICAgICAg ICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4+ID4gPiA+ID4gPiAgICAgICAgICAgICB9Cj4+ID4g PiA+ID4gPgo+PiA+ID4gPiA+ID4gLSAgICAgICAgICAgaWYgKCh1aW50NjRfdCkgd2lkdGggKiBj cHAgPiBVSU5UX01BWCkKPj4gPiA+ID4gPiA+ICsgICAgICAgICAgIGlmICgodWludDY0X3QpIERJ Vl9ST1VORF9VUCh3aWR0aCAqIGJwcCwgOCkgPiBVSU5UX01BWCkKPj4gPiA+ID4gPiA+ICAgICAg ICAgICAgICAgICAgICAgcmV0dXJuIC1FUkFOR0U7Cj4+ID4gPiA+ID4gPgo+PiA+ID4gPiA+ID4g ICAgICAgICAgICAgaWYgKCh1aW50NjRfdCkgaGVpZ2h0ICogci0+cGl0Y2hlc1tpXSArIHItPm9m ZnNldHNbaV0gPiBVSU5UX01BWCkKPj4gPiA+ID4gPiA+ICAgICAgICAgICAgICAgICAgICAgcmV0 dXJuIC1FUkFOR0U7Cj4+ID4gPiA+ID4gPgo+PiA+ID4gPiA+ID4gLSAgICAgICAgICAgaWYgKHIt PnBpdGNoZXNbaV0gPCB3aWR0aCAqIGNwcCkgewo+PiA+ID4gPiA+ID4gKyAgICAgICAgICAgaWYg KCh1aW50NjRfdCkgci0+cGl0Y2hlc1tpXSAqIDggPCAodWludDY0X3QpIHdpZHRoICogYnBwKSB7 Cj4+ID4gPiA+ID4gPiAgICAgICAgICAgICAgICAgICAgIERSTV9ERUJVR19LTVMoImJhZCBwaXRj aCAldSBmb3IgcGxhbmUgJWRcbiIsIHItPnBpdGNoZXNbaV0sIGkpOwo+PiA+ID4gPiA+ID4gICAg ICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKPj4gPiA+ID4gPiA+ICAgICAgICAgICAg IH0KPj4gPiA+ID4gPiA+IEBAIC00NzYsNyArNDc2LDcgQEAgaW50IGRybV9tb2RlX2dldGZiKHN0 cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4+ID4gPiA+ID4gPiAgICAgci0+aGVpZ2h0ID0gZmItPmhl aWdodDsKPj4gPiA+ID4gPiA+ICAgICByLT53aWR0aCA9IGZiLT53aWR0aDsKPj4gPiA+ID4gPiA+ ICAgICByLT5kZXB0aCA9IGZiLT5mb3JtYXQtPmRlcHRoOwo+PiA+ID4gPiA+ID4gLSAgIHItPmJw cCA9IGZiLT5mb3JtYXQtPmNwcFswXSAqIDg7Cj4+ID4gPiA+ID4gPiArICAgci0+YnBwID0gZHJt X2Zvcm1hdF9pbmZvX3BsYW5lX2JwcChmYi0+Zm9ybWF0LCAwKTsKPj4gPiA+ID4gPiA+ICAgICBy LT5waXRjaCA9IGZiLT5waXRjaGVzWzBdOwo+PiA+ID4gPiA+ID4KPj4gPiA+ID4gPiA+ICAgICAv KiBHRVRfRkIoKSBpcyBhbiB1bnByaXZpbGVnZWQgaW9jdGwgc28gd2UgbXVzdCBub3QgcmV0dXJu IGEKPj4gPiA+ID4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbV9mcmFt ZWJ1ZmZlcl9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtX2ZyYW1lYnVmZmVyX2hl bHBlci5jCj4+ID4gPiA+ID4gPiBpbmRleCBhY2ZiYzA2NDFhMDYuLmRmZTIyNGNjYWViYSAxMDA2 NDQKPj4gPiA+ID4gPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtX2ZyYW1lYnVmZmVy X2hlbHBlci5jCj4+ID4gPiA+ID4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbV9mcmFt ZWJ1ZmZlcl9oZWxwZXIuYwo+PiA+ID4gPiA+ID4gQEAgLTE2MSw2ICsxNjEsNyBAQCBkcm1fZ2Vt X2ZiX2NyZWF0ZV93aXRoX2Z1bmNzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1f ZmlsZSAqZmlsZSwKPj4gPiA+ID4gPiA+ICAgICAgICAgICAgIHVuc2lnbmVkIGludCB3aWR0aCA9 IG1vZGVfY21kLT53aWR0aCAvIChpID8gaW5mby0+aHN1YiA6IDEpOwo+PiA+ID4gPiA+ID4gICAg ICAgICAgICAgdW5zaWduZWQgaW50IGhlaWdodCA9IG1vZGVfY21kLT5oZWlnaHQgLyAoaSA/IGlu Zm8tPnZzdWIgOiAxKTsKPj4gPiA+ID4gPiA+ICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtaW5f c2l6ZTsKPj4gPiA+ID4gPiA+ICsgICAgICAgICAgIHU4IGJwcCA9IGRybV9mb3JtYXRfaW5mb19w bGFuZV9icHAoZmItPmZvcm1hdCwgaSk7Cj4+ID4gPiA+ID4gPgo+PiA+ID4gPiA+ID4gICAgICAg ICAgICAgb2Jqc1tpXSA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChmaWxlLCBtb2RlX2NtZC0+aGFu ZGxlc1tpXSk7Cj4+ID4gPiA+ID4gPiAgICAgICAgICAgICBpZiAoIW9ianNbaV0pIHsKPj4gPiA+ ID4gPiA+IEBAIC0xNzAsNyArMTcxLDcgQEAgZHJtX2dlbV9mYl9jcmVhdGVfd2l0aF9mdW5jcyhz dHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCj4+ID4gPiA+ID4g PiAgICAgICAgICAgICB9Cj4+ID4gPiA+ID4gPgo+PiA+ID4gPiA+ID4gICAgICAgICAgICAgbWlu X3NpemUgPSAoaGVpZ2h0IC0gMSkgKiBtb2RlX2NtZC0+cGl0Y2hlc1tpXQo+PiA+ID4gPiA+ID4g LSAgICAgICAgICAgICAgICAgICAgKyB3aWR0aCAqIGluZm8tPmNwcFtpXQo+PiA+ID4gPiA+ID4g KyAgICAgICAgICAgICAgICAgICAgKyBESVZfUk9VTkRfVVAod2lkdGggKiBicHAsIDgpCj4+ID4g PiA+ID4gPiAgICAgICAgICAgICAgICAgICAgICArIG1vZGVfY21kLT5vZmZzZXRzW2ldOwo+PiA+ ID4gPiA+ID4KPj4gPiA+ID4gPiA+ICAgICAgICAgICAgIGlmIChvYmpzW2ldLT5zaXplIDwgbWlu X3NpemUpIHsKPj4gPiA+ID4gPiA+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fZm91cmNj LmggYi9pbmNsdWRlL2RybS9kcm1fZm91cmNjLmgKPj4gPiA+ID4gPiA+IGluZGV4IDNlODY0MDhk YWM5Zi4uZDRhZjRkYWIxNjIzIDEwMDY0NAo+PiA+ID4gPiA+ID4gLS0tIGEvaW5jbHVkZS9kcm0v ZHJtX2ZvdXJjYy5oCj4+ID4gPiA+ID4gPiArKysgYi9pbmNsdWRlL2RybS9kcm1fZm91cmNjLmgK Pj4gPiA+ID4gPiA+IEBAIC0zNiw2ICszNiw3IEBAIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQyOwo+ PiA+ID4gPiA+ID4gICAqIHVzZSBpbiBuZXcgY29kZSBhbmQgc2V0IHRvIDAgZm9yIG5ldyBmb3Jt YXRzLgo+PiA+ID4gPiA+ID4gICAqIEBudW1fcGxhbmVzOiBOdW1iZXIgb2YgY29sb3IgcGxhbmVz ICgxIHRvIDMpCj4+ID4gPiA+ID4gPiAgICogQGNwcDogTnVtYmVyIG9mIGJ5dGVzIHBlciBwaXhl bCAocGVyIHBsYW5lKQo+PiA+ID4gPiA+ID4gKyAqIEBicHA6IE51bWJlciBvZiBiaXRzIHBlciBw aXhlbCAocGVyIHBsYW5lKSwgb25seSB2YWxpZCBpZiBjcHBbMF0gPT0gMC4KPj4gPiA+ID4gPiA+ ICAgKiBAaHN1YjogSG9yaXpvbnRhbCBjaHJvbWEgc3Vic2FtcGxpbmcgZmFjdG9yCj4+ID4gPiA+ ID4gPiAgICogQHZzdWI6IFZlcnRpY2FsIGNocm9tYSBzdWJzYW1wbGluZyBmYWN0b3IKPj4gPiA+ ID4gPiA+ICAgKiBAaGFzX2FscGhhOiBEb2VzIHRoZSBmb3JtYXQgZW1iZWRzIGFuIGFscGhhIGNv bXBvbmVudD8KPj4gPiA+ID4gPiA+IEBAIC00NSw2ICs0Niw3IEBAIHN0cnVjdCBkcm1fZm9ybWF0 X2luZm8gewo+PiA+ID4gPiA+ID4gICAgIHU4IGRlcHRoOwo+PiA+ID4gPiA+ID4gICAgIHU4IG51 bV9wbGFuZXM7Cj4+ID4gPiA+ID4gPiAgICAgdTggY3BwWzNdOwo+PiA+ID4gPiA+ID4gKyAgIHU4 IGJwcFszXTsKPj4gPiA+ID4gPiA+ICAgICB1OCBoc3ViOwo+PiA+ID4gPiA+ID4gICAgIHU4IHZz dWI7Cj4+ID4gPiA+ID4gPiAgICAgYm9vbCBoYXNfYWxwaGE7Cj4+ID4gPiA+ID4gPiBAQCAtNjYs NiArNjgsOCBAQCBkcm1fZ2V0X2Zvcm1hdF9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4+ ID4gPiA+ID4gPiAgdWludDMyX3QgZHJtX21vZGVfbGVnYWN5X2ZiX2Zvcm1hdCh1aW50MzJfdCBi cHAsIHVpbnQzMl90IGRlcHRoKTsKPj4gPiA+ID4gPiA+ICBpbnQgZHJtX2Zvcm1hdF9udW1fcGxh bmVzKHVpbnQzMl90IGZvcm1hdCk7Cj4+ID4gPiA+ID4gPiAgaW50IGRybV9mb3JtYXRfcGxhbmVf Y3BwKHVpbnQzMl90IGZvcm1hdCwgaW50IHBsYW5lKTsKPj4gPiA+ID4gPiA+ICtpbnQgZHJtX2Zv cm1hdF9wbGFuZV9icHAodWludDMyX3QgZm9ybWF0LCBpbnQgcGxhbmUpOwo+PiA+ID4gPiA+ID4g K2ludCBkcm1fZm9ybWF0X2luZm9fcGxhbmVfYnBwKGNvbnN0IHN0cnVjdCBkcm1fZm9ybWF0X2lu Zm8gKmZvcm1hdCwgaW50IHBsYW5lKTsKPj4gPiA+ID4gPiA+ICBpbnQgZHJtX2Zvcm1hdF9ob3J6 X2Nocm9tYV9zdWJzYW1wbGluZyh1aW50MzJfdCBmb3JtYXQpOwo+PiA+ID4gPiA+ID4gIGludCBk cm1fZm9ybWF0X3ZlcnRfY2hyb21hX3N1YnNhbXBsaW5nKHVpbnQzMl90IGZvcm1hdCk7Cj4+ID4g PiA+ID4gPiAgaW50IGRybV9mb3JtYXRfcGxhbmVfd2lkdGgoaW50IHdpZHRoLCB1aW50MzJfdCBm b3JtYXQsIGludCBwbGFuZSk7Cj4+ID4gPiA+ID4gPiAtLQo+PiA+ID4gPiA+ID4gMi4xNi4xCj4+ ID4gPiA+ID4gPgo+PiA+ID4gPiA+Cj4+ID4gPiA+ID4gLS0KPj4gPiA+ID4gPiBEYW5pZWwgVmV0 dGVyCj4+ID4gPiA+ID4gU29mdHdhcmUgRW5naW5lZXIsIEludGVsIENvcnBvcmF0aW9uCj4+ID4g PiA+ID4gaHR0cDovL2Jsb2cuZmZ3bGwuY2gKPj4gPiA+Cj4+ID4gPiAtLQo+PiA+ID4gRGFuaWVs IFZldHRlcgo+PiA+ID4gU29mdHdhcmUgRW5naW5lZXIsIEludGVsIENvcnBvcmF0aW9uCj4+ID4g PiBodHRwOi8vYmxvZy5mZndsbC5jaAo+PiA+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCj4+ID4gZHJpLWRldmVsIG1haWxpbmcgbGlzdAo+PiA+IGRyaS1k ZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKPj4gPiBodHRwczovL2xpc3RzLmZyZWVkZXNrdG9w Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo+Pgo+PiAtLQo+PiBEYW5pZWwgVmV0dGVy Cj4+IFNvZnR3YXJlIEVuZ2luZWVyLCBJbnRlbCBDb3Jwb3JhdGlvbgo+PiBodHRwOi8vYmxvZy5m ZndsbC5jaAo+Cj4gLS0KPiA9PT09PT09PT09PT09PT09PT09PQo+IHwgSSB3b3VsZCBsaWtlIHRv IHwKPiB8IGZpeCB0aGUgd29ybGQsICB8Cj4gfCBidXQgdGhleSdyZSBub3QgfAo+IHwgZ2l2aW5n IG1lIHRoZSAgIHwKPiAgXCBzb3VyY2UgY29kZSEgIC8KPiAgIC0tLS0tLS0tLS0tLS0tLQo+ICAg ICDCr1xfKOODhClfL8KvCj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KPiBkcmktZGV2ZWwgbWFpbGluZyBsaXN0Cj4gZHJpLWRldmVsQGxpc3RzLmZyZWVk ZXNrdG9wLm9yZwo+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGlu Zm8vZHJpLWRldmVsCgoKCi0tIApEYW5pZWwgVmV0dGVyClNvZnR3YXJlIEVuZ2luZWVyLCBJbnRl bCBDb3Jwb3JhdGlvbgorNDEgKDApIDc5IDM2NSA1NyA0OCAtIGh0dHA6Ly9ibG9nLmZmd2xsLmNo Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZl bCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xp c3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=