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=-6.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS 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 961B8C43331 for ; Wed, 13 Nov 2019 10:04:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 62A7821D7F for ; Wed, 13 Nov 2019 10:04:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mMAN3fdI" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727442AbfKMKES (ORCPT ); Wed, 13 Nov 2019 05:04:18 -0500 Received: from mail-lj1-f195.google.com ([209.85.208.195]:38583 "EHLO mail-lj1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726107AbfKMKEO (ORCPT ); Wed, 13 Nov 2019 05:04:14 -0500 Received: by mail-lj1-f195.google.com with SMTP id v8so1859391ljh.5 for ; Wed, 13 Nov 2019 02:04:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=7+8BQXrFfd7vVPmmII5MsvQgRN4CoXbnwomYZzYOuqY=; b=mMAN3fdIVYqvkW+CCwE1FaCWLT/+gk7vKGNzCppol6zgvEuroWh9/jm7pl4xT8LIGX 3LjJ3sR8oUGViV3RJEyRlI7im8IbX48BTncshoWro0q7EL4bbvzjEymw4MTqwEcf9jtI 9BWNAEe43iBAc2tXQvJeo7HfELxKrC3V99rStbt8WYXVbh8Z0db4yl5ang30F9LnZxn9 ZYgpU+bzQRKAyFCzqmIVuvD822+mOYDUqOye8/CbIl2fbIDHENMjxIwxeFfJvjZhkiT3 Ps4mcdrA/v0jpDT8QJIq1TNkd5GeNrPpsf/Tcf7kcu+1z5O6lyGbZBuhWiByv7fUMHvg D76A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=7+8BQXrFfd7vVPmmII5MsvQgRN4CoXbnwomYZzYOuqY=; b=goO8rVij7DOn34KEgSgO+ROPYOjd9XHWC2j2HDyimtFOCPTsNQNflQHyTSfGoTsyCU RBdj+jtcTaoyICQ485w0HUUcCN+0ATEqPCCi86FOByukZ8EPjFamRnNP1+gorv+cDqB4 QO06rLX7chyDDdNF6t13CFBIVg6AgL8AKRsGM4Obworu8F9UsLTb8KyikiTRtt0TG/UA clxLYnVgO4MyY8/QWMoBOarAIRYjDlhVx2QpdKwD8Y5bOsv2Vm27vJBUE5ljxtUilJ6I XGJDyl6soTHuKJw0elK3t0Jh0zxs/FJREmhCRGVdm8cWrfmOmoo5oaZPZnc4H1qLCz6t JnIg== X-Gm-Message-State: APjAAAV8HWZkVrR/vt9O6RzqSIt2XnuMfzhV700aWBn39q3sfjQn2m53 ZorQUOG7Q/QjTQX52EmcUOP7XXO43EV8/GGClVw= X-Google-Smtp-Source: APXvYqzrkpAd6Hpz3oz1kJ9bkYQ6lCyOOdYOttbdfnR7t7OIB4Lor9ihWI0dnmDs0iE8LILZppn3CI05bzG6SSFxJnw= X-Received: by 2002:a2e:8805:: with SMTP id x5mr1762023ljh.44.1573639450872; Wed, 13 Nov 2019 02:04:10 -0800 (PST) MIME-Version: 1.0 References: <20191107153048.843881-1-paul.kocialkowski@bootlin.com> <20191112151157.GD4506@aptenodytes> <20191112155012.GE4506@aptenodytes> In-Reply-To: <20191112155012.GE4506@aptenodytes> From: Patrik Jakobsson Date: Wed, 13 Nov 2019 11:04:00 +0100 Message-ID: Subject: Re: [PATCH] drm/gma500: Fixup fbdev stolen size usage evaluation To: Paul Kocialkowski Cc: dri-devel , linux-kernel , David Airlie , Daniel Vetter , Thomas Petazzoni , James Hilliard Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Nov 12, 2019 at 4:50 PM Paul Kocialkowski wrote: > > Hi, > > On Tue 12 Nov 19, 16:11, Paul Kocialkowski wrote: > > Hi, > > > > On Tue 12 Nov 19, 11:20, Patrik Jakobsson wrote: > > > On Thu, Nov 7, 2019 at 4:30 PM Paul Kocialkowski > > > wrote: > > > > > > > > psbfb_probe performs an evaluation of the required size from the stolen > > > > GTT memory, but gets it wrong in two distinct ways: > > > > - The resulting size must be page-size-aligned; > > > > - The size to allocate is derived from the surface dimensions, not the fb > > > > dimensions. > > > > > > > > When two connectors are connected with different modes, the smallest will > > > > be stored in the fb dimensions, but the size that needs to be allocated must > > > > match the largest (surface) dimensions. This is what is used in the actual > > > > allocation code. > > > > > > > > Fix this by correcting the evaluation to conform to the two points above. > > > > It allows correctly switching to 16bpp when one connector is e.g. 1920x1080 > > > > and the other is 1024x768. > > > > > > > > Signed-off-by: Paul Kocialkowski > > > > --- > > > > drivers/gpu/drm/gma500/framebuffer.c | 8 ++++++-- > > > > 1 file changed, 6 insertions(+), 2 deletions(-) > > > > > > > > diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c > > > > index 218f3bb15276..90237abee088 100644 > > > > --- a/drivers/gpu/drm/gma500/framebuffer.c > > > > +++ b/drivers/gpu/drm/gma500/framebuffer.c > > > > @@ -462,6 +462,7 @@ static int psbfb_probe(struct drm_fb_helper *helper, > > > > container_of(helper, struct psb_fbdev, psb_fb_helper); > > > > struct drm_device *dev = psb_fbdev->psb_fb_helper.dev; > > > > struct drm_psb_private *dev_priv = dev->dev_private; > > > > + unsigned int fb_size; > > > > int bytespp; > > > > > > > > bytespp = sizes->surface_bpp / 8; > > > > @@ -471,8 +472,11 @@ static int psbfb_probe(struct drm_fb_helper *helper, > > > > /* If the mode will not fit in 32bit then switch to 16bit to get > > > > a console on full resolution. The X mode setting server will > > > > allocate its own 32bit GEM framebuffer */ > > > > - if (ALIGN(sizes->fb_width * bytespp, 64) * sizes->fb_height > > > > > - dev_priv->vram_stolen_size) { > > > > + fb_size = ALIGN(sizes->surface_width * bytespp, 64) * > > > > + sizes->surface_height; > > > > + fb_size = ALIGN(fb_size, PAGE_SIZE); > > > > + > > > > + if (fb_size > dev_priv->vram_stolen_size) { > > > > > > psb_gtt_alloc_range() already aligns by PAGE_SIZE for us. Looks like > > > we align a couple of times extra for luck. This needs cleaning up > > > instead of adding even more aligns. > > > > I'm not sure this is really for luck. As far as I can see, we need to do it > > properly for this size estimation since it's the final size that will be > > allocated (and thus needs to be available in whole). Ok now I understand what you meant. Actually vram_stolen_size is always page aligned so fb_size doesn't need any page alignment here. There is also no need to align for psbfb_create() since it also takes care of this. > > > > For the other times there is explicit alignment, they seem justified too: > > - in psb_gem_create: it is common to pass the aligned size when creating the > > associated GEM object with drm_gem_object_init, even though it's probably not > > crucial given that this is not where allocation actually happens; > > - in psbfb_create: the full size is apparently only really used to memset 0 > > the allocated buffer. I think this makes sense for security reasons (and not > > leak previous contents in the additional space required for alignment). What I would prefer is to have a single place where the alignment is made so any hardware requirements would be transparent to the rest of the code. Best would be if alignment is only made in psb_gtt_alloc_range() and then store the actual size in struct gtt_range. That way we can just pass along that value to memset() and drm_gem_object_init() without caring about how it is adjusted. > > > > What strikes me however is that each call to psb_gtt_alloc_range takes the > > alignment as a parameter when it's really always PAGE_SIZE, so it should > > probably just be hardcoded in the call to allocate_resource. This is a remnant from trying to add support for 2D and/or overlay planes (don't really remember). Doesn't matter if it stays or goes away. > > > > What do you think? I suppose most of this is outside the scope of what you're trying to do so we can just leave it as is and I can clean it up later. > > > > > Your size calculation looks correct and indeed makes my 1024x600 + > > > 1920x1080 setup actually display something, but for some reason I get > > > an incorrect panning on the smaller screen and stale data on the > > > surface only visible by the larger CRTC. Any idea what's going on? > > > > I'm not seeing this immediately, but I definitely have something strange > > after having printed more lines than the smallest display can handle or > > scrolling, where more than the actual size of the fb is used. > > > > Maybe this is related to using the PowerVR-accelerated fb ops, that aren't > > quite ready for this use case? > > > > I'll give it a try with psbfb_roll_ops and psbfb_unaccel_ops instead to see > > if it changes something for me. Maybe it would help for you too? > > Some quick feedback about that: > - psbfb_unaccel_ops gives a correct result where the scrolling area is bound > to the smallest display; Yes, this also works correctly for me. > - psbfb_roll_ops gives a working scrolling but bound to the largest display > (so the current shell line becomes invisible on the smallest one eventually); It's not panning at all for me. I never really found gtt rolling to be useful. It's a neat trick but I didn't have a problem with console scrolling speed to begin with. I might just remove it. > - psbfb_ops gives the same issue as above and seems to add artifacts on top. Did you try this on CDV? There's only 2D acceleration on Poulsbo and Oaktrail. > > There's probably limited interest in working on that aspect on our side though. > I'd be interested to know if it affects the issue you're seeing though. Focus on your requirements and I'll look at the rest. -Patrik > > Cheers, > > Paul > > > I suspect that the generic implementation is already bullet-proof for these > > kinds of use case. > > > > Cheers and thanks for the feedback, > > > > Paul > > > > > > > > > sizes->surface_bpp = 16; > > > > sizes->surface_depth = 16; > > > > } > > > > -- > > > > 2.23.0 > > > > > > > > -- > > Paul Kocialkowski, Bootlin > > Embedded Linux and kernel engineering > > https://bootlin.com > > > > -- > Paul Kocialkowski, Bootlin > Embedded Linux and kernel engineering > https://bootlin.com From mboxrd@z Thu Jan 1 00:00:00 1970 From: Patrik Jakobsson Subject: Re: [PATCH] drm/gma500: Fixup fbdev stolen size usage evaluation Date: Wed, 13 Nov 2019 11:04:00 +0100 Message-ID: References: <20191107153048.843881-1-paul.kocialkowski@bootlin.com> <20191112151157.GD4506@aptenodytes> <20191112155012.GE4506@aptenodytes> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-lj1-x243.google.com (mail-lj1-x243.google.com [IPv6:2a00:1450:4864:20::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id A03686ECBA for ; Wed, 13 Nov 2019 10:04:12 +0000 (UTC) Received: by mail-lj1-x243.google.com with SMTP id p18so1864188ljc.6 for ; Wed, 13 Nov 2019 02:04:12 -0800 (PST) In-Reply-To: <20191112155012.GE4506@aptenodytes> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Paul Kocialkowski Cc: Thomas Petazzoni , David Airlie , linux-kernel , dri-devel , James Hilliard List-Id: dri-devel@lists.freedesktop.org T24gVHVlLCBOb3YgMTIsIDIwMTkgYXQgNDo1MCBQTSBQYXVsIEtvY2lhbGtvd3NraQo8cGF1bC5r b2NpYWxrb3dza2lAYm9vdGxpbi5jb20+IHdyb3RlOgo+Cj4gSGksCj4KPiBPbiBUdWUgMTIgTm92 IDE5LCAxNjoxMSwgUGF1bCBLb2NpYWxrb3dza2kgd3JvdGU6Cj4gPiBIaSwKPiA+Cj4gPiBPbiBU dWUgMTIgTm92IDE5LCAxMToyMCwgUGF0cmlrIEpha29ic3NvbiB3cm90ZToKPiA+ID4gT24gVGh1 LCBOb3YgNywgMjAxOSBhdCA0OjMwIFBNIFBhdWwgS29jaWFsa293c2tpCj4gPiA+IDxwYXVsLmtv Y2lhbGtvd3NraUBib290bGluLmNvbT4gd3JvdGU6Cj4gPiA+ID4KPiA+ID4gPiBwc2JmYl9wcm9i ZSBwZXJmb3JtcyBhbiBldmFsdWF0aW9uIG9mIHRoZSByZXF1aXJlZCBzaXplIGZyb20gdGhlIHN0 b2xlbgo+ID4gPiA+IEdUVCBtZW1vcnksIGJ1dCBnZXRzIGl0IHdyb25nIGluIHR3byBkaXN0aW5j dCB3YXlzOgo+ID4gPiA+IC0gVGhlIHJlc3VsdGluZyBzaXplIG11c3QgYmUgcGFnZS1zaXplLWFs aWduZWQ7Cj4gPiA+ID4gLSBUaGUgc2l6ZSB0byBhbGxvY2F0ZSBpcyBkZXJpdmVkIGZyb20gdGhl IHN1cmZhY2UgZGltZW5zaW9ucywgbm90IHRoZSBmYgo+ID4gPiA+ICAgZGltZW5zaW9ucy4KPiA+ ID4gPgo+ID4gPiA+IFdoZW4gdHdvIGNvbm5lY3RvcnMgYXJlIGNvbm5lY3RlZCB3aXRoIGRpZmZl cmVudCBtb2RlcywgdGhlIHNtYWxsZXN0IHdpbGwKPiA+ID4gPiBiZSBzdG9yZWQgaW4gdGhlIGZi IGRpbWVuc2lvbnMsIGJ1dCB0aGUgc2l6ZSB0aGF0IG5lZWRzIHRvIGJlIGFsbG9jYXRlZCBtdXN0 Cj4gPiA+ID4gbWF0Y2ggdGhlIGxhcmdlc3QgKHN1cmZhY2UpIGRpbWVuc2lvbnMuIFRoaXMgaXMg d2hhdCBpcyB1c2VkIGluIHRoZSBhY3R1YWwKPiA+ID4gPiBhbGxvY2F0aW9uIGNvZGUuCj4gPiA+ ID4KPiA+ID4gPiBGaXggdGhpcyBieSBjb3JyZWN0aW5nIHRoZSBldmFsdWF0aW9uIHRvIGNvbmZv cm0gdG8gdGhlIHR3byBwb2ludHMgYWJvdmUuCj4gPiA+ID4gSXQgYWxsb3dzIGNvcnJlY3RseSBz d2l0Y2hpbmcgdG8gMTZicHAgd2hlbiBvbmUgY29ubmVjdG9yIGlzIGUuZy4gMTkyMHgxMDgwCj4g PiA+ID4gYW5kIHRoZSBvdGhlciBpcyAxMDI0eDc2OC4KPiA+ID4gPgo+ID4gPiA+IFNpZ25lZC1v ZmYtYnk6IFBhdWwgS29jaWFsa293c2tpIDxwYXVsLmtvY2lhbGtvd3NraUBib290bGluLmNvbT4K PiA+ID4gPiAtLS0KPiA+ID4gPiAgZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9mcmFtZWJ1ZmZlci5j IHwgOCArKysrKystLQo+ID4gPiA+ICAxIGZpbGUgY2hhbmdlZCwgNiBpbnNlcnRpb25zKCspLCAy IGRlbGV0aW9ucygtKQo+ID4gPiA+Cj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9nbWE1MDAvZnJhbWVidWZmZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvZnJhbWVidWZm ZXIuYwo+ID4gPiA+IGluZGV4IDIxOGYzYmIxNTI3Ni4uOTAyMzdhYmVlMDg4IDEwMDY0NAo+ID4g PiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvZnJhbWVidWZmZXIuYwo+ID4gPiA+ICsr KyBiL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvZnJhbWVidWZmZXIuYwo+ID4gPiA+IEBAIC00NjIs NiArNDYyLDcgQEAgc3RhdGljIGludCBwc2JmYl9wcm9iZShzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAq aGVscGVyLAo+ID4gPiA+ICAgICAgICAgICAgICAgICBjb250YWluZXJfb2YoaGVscGVyLCBzdHJ1 Y3QgcHNiX2ZiZGV2LCBwc2JfZmJfaGVscGVyKTsKPiA+ID4gPiAgICAgICAgIHN0cnVjdCBkcm1f ZGV2aWNlICpkZXYgPSBwc2JfZmJkZXYtPnBzYl9mYl9oZWxwZXIuZGV2Owo+ID4gPiA+ICAgICAg ICAgc3RydWN0IGRybV9wc2JfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwo+ ID4gPiA+ICsgICAgICAgdW5zaWduZWQgaW50IGZiX3NpemU7Cj4gPiA+ID4gICAgICAgICBpbnQg Ynl0ZXNwcDsKPiA+ID4gPgo+ID4gPiA+ICAgICAgICAgYnl0ZXNwcCA9IHNpemVzLT5zdXJmYWNl X2JwcCAvIDg7Cj4gPiA+ID4gQEAgLTQ3MSw4ICs0NzIsMTEgQEAgc3RhdGljIGludCBwc2JmYl9w cm9iZShzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyLAo+ID4gPiA+ICAgICAgICAgLyogSWYg dGhlIG1vZGUgd2lsbCBub3QgZml0IGluIDMyYml0IHRoZW4gc3dpdGNoIHRvIDE2Yml0IHRvIGdl dAo+ID4gPiA+ICAgICAgICAgICAgYSBjb25zb2xlIG9uIGZ1bGwgcmVzb2x1dGlvbi4gVGhlIFgg bW9kZSBzZXR0aW5nIHNlcnZlciB3aWxsCj4gPiA+ID4gICAgICAgICAgICBhbGxvY2F0ZSBpdHMg b3duIDMyYml0IEdFTSBmcmFtZWJ1ZmZlciAqLwo+ID4gPiA+IC0gICAgICAgaWYgKEFMSUdOKHNp emVzLT5mYl93aWR0aCAqIGJ5dGVzcHAsIDY0KSAqIHNpemVzLT5mYl9oZWlnaHQgPgo+ID4gPiA+ IC0gICAgICAgICAgICAgICAgICAgICAgIGRldl9wcml2LT52cmFtX3N0b2xlbl9zaXplKSB7Cj4g PiA+ID4gKyAgICAgICBmYl9zaXplID0gQUxJR04oc2l6ZXMtPnN1cmZhY2Vfd2lkdGggKiBieXRl c3BwLCA2NCkgKgo+ID4gPiA+ICsgICAgICAgICAgICAgICAgIHNpemVzLT5zdXJmYWNlX2hlaWdo dDsKPiA+ID4gPiArICAgICAgIGZiX3NpemUgPSBBTElHTihmYl9zaXplLCBQQUdFX1NJWkUpOwo+ ID4gPiA+ICsKPiA+ID4gPiArICAgICAgIGlmIChmYl9zaXplID4gZGV2X3ByaXYtPnZyYW1fc3Rv bGVuX3NpemUpIHsKPiA+ID4KPiA+ID4gcHNiX2d0dF9hbGxvY19yYW5nZSgpIGFscmVhZHkgYWxp Z25zIGJ5IFBBR0VfU0laRSBmb3IgdXMuIExvb2tzIGxpa2UKPiA+ID4gd2UgYWxpZ24gYSBjb3Vw bGUgb2YgdGltZXMgZXh0cmEgZm9yIGx1Y2suIFRoaXMgbmVlZHMgY2xlYW5pbmcgdXAKPiA+ID4g aW5zdGVhZCBvZiBhZGRpbmcgZXZlbiBtb3JlIGFsaWducy4KPiA+Cj4gPiBJJ20gbm90IHN1cmUg dGhpcyBpcyByZWFsbHkgZm9yIGx1Y2suIEFzIGZhciBhcyBJIGNhbiBzZWUsIHdlIG5lZWQgdG8g ZG8gaXQKPiA+IHByb3Blcmx5IGZvciB0aGlzIHNpemUgZXN0aW1hdGlvbiBzaW5jZSBpdCdzIHRo ZSBmaW5hbCBzaXplIHRoYXQgd2lsbCBiZQo+ID4gYWxsb2NhdGVkIChhbmQgdGh1cyBuZWVkcyB0 byBiZSBhdmFpbGFibGUgaW4gd2hvbGUpLgoKT2sgbm93IEkgdW5kZXJzdGFuZCB3aGF0IHlvdSBt ZWFudC4gQWN0dWFsbHkgdnJhbV9zdG9sZW5fc2l6ZSBpcwphbHdheXMgcGFnZSBhbGlnbmVkIHNv IGZiX3NpemUgZG9lc24ndCBuZWVkIGFueSBwYWdlIGFsaWdubWVudCBoZXJlLgpUaGVyZSBpcyBh bHNvIG5vIG5lZWQgdG8gYWxpZ24gZm9yIHBzYmZiX2NyZWF0ZSgpIHNpbmNlIGl0IGFsc28gdGFr ZXMKY2FyZSBvZiB0aGlzLgoKPiA+Cj4gPiBGb3IgdGhlIG90aGVyIHRpbWVzIHRoZXJlIGlzIGV4 cGxpY2l0IGFsaWdubWVudCwgdGhleSBzZWVtIGp1c3RpZmllZCB0b286Cj4gPiAtIGluIHBzYl9n ZW1fY3JlYXRlOiBpdCBpcyBjb21tb24gdG8gcGFzcyB0aGUgYWxpZ25lZCBzaXplIHdoZW4gY3Jl YXRpbmcgdGhlCj4gPiAgIGFzc29jaWF0ZWQgR0VNIG9iamVjdCB3aXRoIGRybV9nZW1fb2JqZWN0 X2luaXQsIGV2ZW4gdGhvdWdoIGl0J3MgcHJvYmFibHkgbm90Cj4gPiAgIGNydWNpYWwgZ2l2ZW4g dGhhdCB0aGlzIGlzIG5vdCB3aGVyZSBhbGxvY2F0aW9uIGFjdHVhbGx5IGhhcHBlbnM7Cj4gPiAt IGluIHBzYmZiX2NyZWF0ZTogdGhlIGZ1bGwgc2l6ZSBpcyBhcHBhcmVudGx5IG9ubHkgcmVhbGx5 IHVzZWQgdG8gbWVtc2V0IDAKPiA+ICAgdGhlIGFsbG9jYXRlZCBidWZmZXIuIEkgdGhpbmsgdGhp cyBtYWtlcyBzZW5zZSBmb3Igc2VjdXJpdHkgcmVhc29ucyAoYW5kIG5vdAo+ID4gICBsZWFrIHBy ZXZpb3VzIGNvbnRlbnRzIGluIHRoZSBhZGRpdGlvbmFsIHNwYWNlIHJlcXVpcmVkIGZvciBhbGln bm1lbnQpLgoKV2hhdCBJIHdvdWxkIHByZWZlciBpcyB0byBoYXZlIGEgc2luZ2xlIHBsYWNlIHdo ZXJlIHRoZSBhbGlnbm1lbnQgaXMKbWFkZSBzbyBhbnkgaGFyZHdhcmUgcmVxdWlyZW1lbnRzIHdv dWxkIGJlIHRyYW5zcGFyZW50IHRvIHRoZSByZXN0IG9mCnRoZSBjb2RlLgoKQmVzdCB3b3VsZCBi ZSBpZiBhbGlnbm1lbnQgaXMgb25seSBtYWRlIGluIHBzYl9ndHRfYWxsb2NfcmFuZ2UoKSBhbmQK dGhlbiBzdG9yZSB0aGUgYWN0dWFsIHNpemUgaW4gc3RydWN0IGd0dF9yYW5nZS4gVGhhdCB3YXkg d2UgY2FuIGp1c3QKcGFzcyBhbG9uZyB0aGF0IHZhbHVlIHRvIG1lbXNldCgpIGFuZCBkcm1fZ2Vt X29iamVjdF9pbml0KCkgd2l0aG91dApjYXJpbmcgYWJvdXQgaG93IGl0IGlzIGFkanVzdGVkLgoK PiA+Cj4gPiBXaGF0IHN0cmlrZXMgbWUgaG93ZXZlciBpcyB0aGF0IGVhY2ggY2FsbCB0byBwc2Jf Z3R0X2FsbG9jX3JhbmdlIHRha2VzIHRoZQo+ID4gYWxpZ25tZW50IGFzIGEgcGFyYW1ldGVyIHdo ZW4gaXQncyByZWFsbHkgYWx3YXlzIFBBR0VfU0laRSwgc28gaXQgc2hvdWxkCj4gPiBwcm9iYWJs eSBqdXN0IGJlIGhhcmRjb2RlZCBpbiB0aGUgY2FsbCB0byBhbGxvY2F0ZV9yZXNvdXJjZS4KClRo aXMgaXMgYSByZW1uYW50IGZyb20gdHJ5aW5nIHRvIGFkZCBzdXBwb3J0IGZvciAyRCBhbmQvb3Ig b3ZlcmxheQpwbGFuZXMgKGRvbid0IHJlYWxseSByZW1lbWJlcikuIERvZXNuJ3QgbWF0dGVyIGlm IGl0IHN0YXlzIG9yIGdvZXMKYXdheS4KCj4gPgo+ID4gV2hhdCBkbyB5b3UgdGhpbms/CgpJIHN1 cHBvc2UgbW9zdCBvZiB0aGlzIGlzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHdoYXQgeW91J3JlIHRy eWluZyB0bwpkbyBzbyB3ZSBjYW4ganVzdCBsZWF2ZSBpdCBhcyBpcyBhbmQgSSBjYW4gY2xlYW4g aXQgdXAgbGF0ZXIuCgo+ID4KPiA+ID4gWW91ciBzaXplIGNhbGN1bGF0aW9uIGxvb2tzIGNvcnJl Y3QgYW5kIGluZGVlZCBtYWtlcyBteSAxMDI0eDYwMCArCj4gPiA+IDE5MjB4MTA4MCBzZXR1cCBh Y3R1YWxseSBkaXNwbGF5IHNvbWV0aGluZywgYnV0IGZvciBzb21lIHJlYXNvbiBJIGdldAo+ID4g PiBhbiBpbmNvcnJlY3QgcGFubmluZyBvbiB0aGUgc21hbGxlciBzY3JlZW4gYW5kIHN0YWxlIGRh dGEgb24gdGhlCj4gPiA+IHN1cmZhY2Ugb25seSB2aXNpYmxlIGJ5IHRoZSBsYXJnZXIgQ1JUQy4g QW55IGlkZWEgd2hhdCdzIGdvaW5nIG9uPwo+ID4KPiA+IEknbSBub3Qgc2VlaW5nIHRoaXMgaW1t ZWRpYXRlbHksIGJ1dCBJIGRlZmluaXRlbHkgaGF2ZSBzb21ldGhpbmcgc3RyYW5nZQo+ID4gYWZ0 ZXIgaGF2aW5nIHByaW50ZWQgbW9yZSBsaW5lcyB0aGFuIHRoZSBzbWFsbGVzdCBkaXNwbGF5IGNh biBoYW5kbGUgb3IKPiA+IHNjcm9sbGluZywgd2hlcmUgbW9yZSB0aGFuIHRoZSBhY3R1YWwgc2l6 ZSBvZiB0aGUgZmIgaXMgdXNlZC4KPiA+Cj4gPiBNYXliZSB0aGlzIGlzIHJlbGF0ZWQgdG8gdXNp bmcgdGhlIFBvd2VyVlItYWNjZWxlcmF0ZWQgZmIgb3BzLCB0aGF0IGFyZW4ndAo+ID4gcXVpdGUg cmVhZHkgZm9yIHRoaXMgdXNlIGNhc2U/Cj4gPgo+ID4gSSdsbCBnaXZlIGl0IGEgdHJ5IHdpdGgg cHNiZmJfcm9sbF9vcHMgYW5kIHBzYmZiX3VuYWNjZWxfb3BzIGluc3RlYWQgdG8gc2VlCj4gPiBp ZiBpdCBjaGFuZ2VzIHNvbWV0aGluZyBmb3IgbWUuIE1heWJlIGl0IHdvdWxkIGhlbHAgZm9yIHlv dSB0b28/Cj4KPiBTb21lIHF1aWNrIGZlZWRiYWNrIGFib3V0IHRoYXQ6Cj4gLSBwc2JmYl91bmFj Y2VsX29wcyBnaXZlcyBhIGNvcnJlY3QgcmVzdWx0IHdoZXJlIHRoZSBzY3JvbGxpbmcgYXJlYSBp cyBib3VuZAo+ICAgdG8gdGhlIHNtYWxsZXN0IGRpc3BsYXk7CgpZZXMsIHRoaXMgYWxzbyB3b3Jr cyBjb3JyZWN0bHkgZm9yIG1lLgoKPiAtIHBzYmZiX3JvbGxfb3BzIGdpdmVzIGEgd29ya2luZyBz Y3JvbGxpbmcgYnV0IGJvdW5kIHRvIHRoZSBsYXJnZXN0IGRpc3BsYXkKPiAgIChzbyB0aGUgY3Vy cmVudCBzaGVsbCBsaW5lIGJlY29tZXMgaW52aXNpYmxlIG9uIHRoZSBzbWFsbGVzdCBvbmUgZXZl bnR1YWxseSk7CgpJdCdzIG5vdCBwYW5uaW5nIGF0IGFsbCBmb3IgbWUuIEkgbmV2ZXIgcmVhbGx5 IGZvdW5kIGd0dCByb2xsaW5nIHRvIGJlCnVzZWZ1bC4gSXQncyBhIG5lYXQgdHJpY2sgYnV0IEkg ZGlkbid0IGhhdmUgYSBwcm9ibGVtIHdpdGggY29uc29sZQpzY3JvbGxpbmcgc3BlZWQgdG8gYmVn aW4gd2l0aC4gSSBtaWdodCBqdXN0IHJlbW92ZSBpdC4KCj4gLSBwc2JmYl9vcHMgZ2l2ZXMgdGhl IHNhbWUgaXNzdWUgYXMgYWJvdmUgYW5kIHNlZW1zIHRvIGFkZCBhcnRpZmFjdHMgb24gdG9wLgoK RGlkIHlvdSB0cnkgdGhpcyBvbiBDRFY/IFRoZXJlJ3Mgb25seSAyRCBhY2NlbGVyYXRpb24gb24g UG91bHNibyBhbmQgT2FrdHJhaWwuCgo+Cj4gVGhlcmUncyBwcm9iYWJseSBsaW1pdGVkIGludGVy ZXN0IGluIHdvcmtpbmcgb24gdGhhdCBhc3BlY3Qgb24gb3VyIHNpZGUgdGhvdWdoLgo+IEknZCBi ZSBpbnRlcmVzdGVkIHRvIGtub3cgaWYgaXQgYWZmZWN0cyB0aGUgaXNzdWUgeW91J3JlIHNlZWlu ZyB0aG91Z2guCgpGb2N1cyBvbiB5b3VyIHJlcXVpcmVtZW50cyBhbmQgSSdsbCBsb29rIGF0IHRo ZSByZXN0LgoKLVBhdHJpawoKPgo+IENoZWVycywKPgo+IFBhdWwKPgo+ID4gSSBzdXNwZWN0IHRo YXQgdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gaXMgYWxyZWFkeSBidWxsZXQtcHJvb2YgZm9y IHRoZXNlCj4gPiBraW5kcyBvZiB1c2UgY2FzZS4KPiA+Cj4gPiBDaGVlcnMgYW5kIHRoYW5rcyBm b3IgdGhlIGZlZWRiYWNrLAo+ID4KPiA+IFBhdWwKPiA+Cj4gPiA+Cj4gPiA+ID4gICAgICAgICAg ICAgICAgICBzaXplcy0+c3VyZmFjZV9icHAgPSAxNjsKPiA+ID4gPiAgICAgICAgICAgICAgICAg IHNpemVzLT5zdXJmYWNlX2RlcHRoID0gMTY7Cj4gPiA+ID4gICAgICAgICAgfQo+ID4gPiA+IC0t Cj4gPiA+ID4gMi4yMy4wCj4gPiA+ID4KPiA+Cj4gPiAtLQo+ID4gUGF1bCBLb2NpYWxrb3dza2ks IEJvb3RsaW4KPiA+IEVtYmVkZGVkIExpbnV4IGFuZCBrZXJuZWwgZW5naW5lZXJpbmcKPiA+IGh0 dHBzOi8vYm9vdGxpbi5jb20KPgo+Cj4KPiAtLQo+IFBhdWwgS29jaWFsa293c2tpLCBCb290bGlu Cj4gRW1iZWRkZWQgTGludXggYW5kIGtlcm5lbCBlbmdpbmVlcmluZwo+IGh0dHBzOi8vYm9vdGxp bi5jb20KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJp LWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBz Oi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs