From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on archive.lwn.net X-Spam-Level: X-Spam-Status: No, score=-5.9 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, T_MIXED_ES autolearn=unavailable autolearn_force=no version=3.4.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by archive.lwn.net (Postfix) with ESMTP id 355307D089 for ; Fri, 14 Dec 2018 13:45:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729837AbeLNNpV (ORCPT ); Fri, 14 Dec 2018 08:45:21 -0500 Received: from mail-eopbgr150075.outbound.protection.outlook.com ([40.107.15.75]:52232 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1729465AbeLNNpV (ORCPT ); Fri, 14 Dec 2018 08:45:21 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector1-arm-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=FgQZ9WLn1T9xRAEuQSdos1B8PzcPRYCan8OUJcnTP9A=; b=catV+vGL0O10+kl9iFSXFqwtXbuP11a7tei6A9hBcaLcM4aHLr6wM5NcS+W4eQp610AljiEM9OpPc3fDA6W6YZYtPVbLMVKuh/xzrQcyD80QWBU5gM0o5EVEdVuo/KZGDMYBMwDIq3HqSuqspCvqpO34NiUXif/iRrbxPAxwexk= Received: from AM0PR08MB3891.eurprd08.prod.outlook.com (20.178.82.147) by AM0PR08MB3618.eurprd08.prod.outlook.com (20.177.111.27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1425.20; Fri, 14 Dec 2018 13:45:14 +0000 Received: from AM0PR08MB3891.eurprd08.prod.outlook.com ([fe80::f1f9:6693:ed35:d489]) by AM0PR08MB3891.eurprd08.prod.outlook.com ([fe80::f1f9:6693:ed35:d489%4]) with mapi id 15.20.1425.021; Fri, 14 Dec 2018 13:45:14 +0000 From: Ayan Halder To: Liviu Dudau CC: "linux-doc@vger.kernel.org" , "arnd@arndb.de" , "corbet@lwn.net" , "airlied@linux.ie" , "gregkh@linuxfoundation.org" , "nicolas.ferre@microchip.com" , "linux-kernel@vger.kernel.org" , "dri-devel@lists.freedesktop.org" , "davem@davemloft.net" , "maxime.ripard@bootlin.com" , "malidp@foss.arm.com" , "mchehab+samsung@kernel.org" , "akpm@linux-foundation.org" , nd , "sean@poorly.run" Subject: Re: [RFC v3 AFBC 04/12] drm/arm/malidp: Set the AFBC register bits if the framebuffer has AFBC modifier Thread-Topic: [RFC v3 AFBC 04/12] drm/arm/malidp: Set the AFBC register bits if the framebuffer has AFBC modifier Thread-Index: AQHUivvNe+KfFyADaUyOk+ZKPgY96qVuzRGAgA+DbwA= Date: Fri, 14 Dec 2018 13:45:13 +0000 Message-ID: <20181214134512.GA19564@arm.com> References: <1543836703-8491-1-git-send-email-ayan.halder@arm.com> <1543836703-8491-5-git-send-email-ayan.halder@arm.com> <20181204165051.GL988@e110455-lin.cambridge.arm.com> In-Reply-To: <20181204165051.GL988@e110455-lin.cambridge.arm.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: CWLP265CA0263.GBRP265.PROD.OUTLOOK.COM (2603:10a6:401:25::35) To AM0PR08MB3891.eurprd08.prod.outlook.com (2603:10a6:208:109::19) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Ayan.Halder@arm.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [217.140.106.50] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1;AM0PR08MB3618;6:1lM7XMfuadoTWUCNKSELm6PuPdrDHhU+LUfRr3j0y77cCHytpXfNO6Elv57x1vv+vEevF8quCSkOgslGbh80sB4nUPZmLHbe9wIpU4RW/y4AogScpB+qxs9ylZJfYjcO1utT6r6CRRKqcHF+Iiyv2cxzT/bBIGS/nk0s9a8CG92W1XiLgCs8oooUAVdsKbWSdsr2ZnWclPLGmx2bkaRxprC+KW2Ir1MDDxxd5uUftVaYog+cZlYFwTd/2s7nsqV2y+aHKcgnJkXGBFqxPioZ7wlFWCn3XNd/WM0gLc+ONPLAyPNp4Kqwj1gKpJWpI4fG040/Ghmp3X6w0j8vBl/fCvEHd3olfjAd9QH4iI+qiJ1MHUHQ3/npyfnRPmgoxzBQZ5UHhIYR1PDO2iDa4QslrlDaiGpWAiFO8RJypDEv0Ua/3Kne3HT2Lfdtp5yYhyggPcS1i0IPHZIfdF1KacQDLA==;5:qEJtUyb7mQEIs1x++lcTJMS62WlN1duTBJitpj1HAKpIo1Zv+OEuqMwLIbUJ8h7KYqd3kjrHG0qzen7hLk6NE8hj8EPNZFSwcLjMh6GjIQ3Yliw1ppTXgFI4ypU9GsShptTS4uvEeTmLRjolqubr8SbZvyb2qoJRa1h3ssrTb+Q=;7:B6+gZoI2tPPC7MyLVBUa+ObjQ1LOdnhXEB0MOu/3DiL4vR4CJkRxDomk7MtIfxX+YJV0BUIOAuKw2prZ1Gu1UW2aAmI6IoVajL5KReOTYLROfJqev3FwMUpy+rkmsUnN2KMEnXc4NgEqWDbYJxLLEw== x-ms-office365-filtering-correlation-id: 90f7e340-9f68-4675-d121-08d661ca5f7b x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(5600074)(711020)(4618075)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020);SRVR:AM0PR08MB3618; x-ms-traffictypediagnostic: AM0PR08MB3618: nodisclaimer: True x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(8211001083)(3230021)(999002)(6040522)(2401047)(5005006)(8121501046)(93006095)(93001095)(3231475)(944501520)(52105112)(10201501046)(3002001)(6055026)(148016)(149066)(150057)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123562045)(20161123560045)(20161123564045)(201708071742011)(7699051)(76991095);SRVR:AM0PR08MB3618;BCL:0;PCL:0;RULEID:;SRVR:AM0PR08MB3618; x-forefront-prvs: 08864C38AC x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(396003)(366004)(136003)(376002)(346002)(39860400002)(189003)(199004)(43544003)(4744004)(52116002)(386003)(71200400001)(575784001)(1076002)(6246003)(14454004)(86362001)(71190400001)(33656002)(102836004)(99286004)(8936002)(6506007)(11346002)(6636002)(2616005)(186003)(446003)(476003)(229853002)(76176011)(68736007)(81156014)(6486002)(6436002)(26005)(8676002)(3846002)(486006)(2906002)(6116002)(44832011)(256004)(14444005)(81166006)(7736002)(105586002)(305945005)(106356001)(316002)(97736004)(54906003)(45080400002)(6512007)(6306002)(7416002)(4326008)(36756003)(72206003)(25786009)(478600001)(966005)(66066001)(5660300001)(37006003)(53936002)(6862004);DIR:OUT;SFP:1101;SCL:1;SRVR:AM0PR08MB3618;H:AM0PR08MB3891.eurprd08.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: jjsrJS4/TFl9RrUL36xQQnlbUgsQlRstxsxnia82GOPOWN97kRSwyA/Jld/H73tqyXfRF0Q83D4vFz7+Ik5uQXYWbnGN/xmQAKiOdLLbAcXyBUKI5/G6r63xI7t+QAZq2uhC3Qk3XhS2iozA1ZRrmSqx09A6S7k5M91raFBOcd9ExFRehIqGu2DMKcXQrL2QEZeICiDuiT9wUtNAKlgrpxj2HdCz4632GhHClQ9DP2Mpw/+qhuHc7qdliSBmTG7g5gLFVtk1dHq9rIJ4Gjjseetez+4JOGDKXTNb0Qy3/j+VO2y6Xe2YFrikMjscqANx spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="us-ascii" Content-ID: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-Network-Message-Id: 90f7e340-9f68-4675-d121-08d661ca5f7b X-MS-Exchange-CrossTenant-originalarrivaltime: 14 Dec 2018 13:45:13.9617 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR08MB3618 Sender: linux-doc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-doc@vger.kernel.org On Tue, Dec 04, 2018 at 04:50:51PM +0000, Liviu Dudau wrote: Hi Liviu, Please let me know if you agree with my comments. Then I will send a v4 patch for this. > On Mon, Dec 03, 2018 at 11:31:58AM +0000, Ayan Halder wrote: > > Added the AFBC decoder registers for DP500 , DP550 and DP650. > > These registers control the processing of AFBC buffers. It controls var= ious > > features like AFBC decoder enable, lossless transformation and block sp= lit > > as well as setting of the left, right, top and bottom cropping of AFBC = buffers > > (in number of pixels). > > All the layers (except DE_SMART) support framebuffers with AFBC modifie= rs. > > One needs to set the pixel values of the top, left, bottom and right cr= opping > > for the AFBC framebuffer. > > Cropping an AFBC framebuffer is controlled by the AFBC crop registers. > > In that case, the layer input size registers should be configured with > > framebuffer's dimensions and not with drm_plane_state source width/heig= ht > > values (which is used for non AFBC framebuffer to denote cropping). > >=20 > > Changes from v1: > > - Removed the "if (fb->modifier)" check from malidp_de_plane_update() > > and added it in malidp_de_set_plane_afbc(). This will consolidate all t= he > > AFBC specific register configurations in a single function ie > > malidp_de_set_plane_afbc(). > >=20 > > Changes from v2: > > - For AFBC framebuffer, layer input size register should be set to fra= mebuffer's > > width and height > >=20 > > Signed-off-by: Ayan Kumar Halder > > --- > > drivers/gpu/drm/arm/malidp_hw.c | 25 +++++---- > > drivers/gpu/drm/arm/malidp_hw.h | 2 + > > drivers/gpu/drm/arm/malidp_planes.c | 109 ++++++++++++++++++++++++++++= +++----- > > drivers/gpu/drm/arm/malidp_regs.h | 20 +++++++ > > 4 files changed, 130 insertions(+), 26 deletions(-) > >=20 > > diff --git a/drivers/gpu/drm/arm/malidp_hw.c b/drivers/gpu/drm/arm/mali= dp_hw.c > > index b9bed11..87b7b12 100644 > > --- a/drivers/gpu/drm/arm/malidp_hw.c > > +++ b/drivers/gpu/drm/arm/malidp_hw.c > > @@ -94,11 +94,12 @@ static const struct malidp_layer malidp500_layers[]= =3D { > > * yuv2rgb matrix offset, mmu control register offset, rotation_featu= res > > */ > > { DE_VIDEO1, MALIDP500_DE_LV_BASE, MALIDP500_DE_LV_PTR_BASE, > > - MALIDP_DE_LV_STRIDE0, MALIDP500_LV_YUV2RGB, 0, ROTATE_ANY }, > > + MALIDP_DE_LV_STRIDE0, MALIDP500_LV_YUV2RGB, 0, ROTATE_ANY, > > + MALIDP500_DE_LV_AD_CTRL }, > > { DE_GRAPHICS1, MALIDP500_DE_LG1_BASE, MALIDP500_DE_LG1_PTR_BASE, > > - MALIDP_DE_LG_STRIDE, 0, 0, ROTATE_ANY }, > > + MALIDP_DE_LG_STRIDE, 0, 0, ROTATE_ANY, MALIDP500_DE_LG1_AD_CTRL }, > > { DE_GRAPHICS2, MALIDP500_DE_LG2_BASE, MALIDP500_DE_LG2_PTR_BASE, > > - MALIDP_DE_LG_STRIDE, 0, 0, ROTATE_ANY }, > > + MALIDP_DE_LG_STRIDE, 0, 0, ROTATE_ANY, MALIDP500_DE_LG2_AD_CTRL }, > > }; > > =20 > > static const struct malidp_layer malidp550_layers[] =3D { > > @@ -106,13 +107,15 @@ static const struct malidp_layer malidp550_layers= [] =3D { > > * yuv2rgb matrix offset, mmu control register offset, rotation_featu= res > > */ > > { DE_VIDEO1, MALIDP550_DE_LV1_BASE, MALIDP550_DE_LV1_PTR_BASE, > > - MALIDP_DE_LV_STRIDE0, MALIDP550_LV_YUV2RGB, 0, ROTATE_ANY }, > > + MALIDP_DE_LV_STRIDE0, MALIDP550_LV_YUV2RGB, 0, ROTATE_ANY, > > + MALIDP550_DE_LV1_AD_CTRL }, > > { DE_GRAPHICS1, MALIDP550_DE_LG_BASE, MALIDP550_DE_LG_PTR_BASE, > > - MALIDP_DE_LG_STRIDE, 0, 0, ROTATE_ANY }, > > + MALIDP_DE_LG_STRIDE, 0, 0, ROTATE_ANY, MALIDP550_DE_LG_AD_CTRL }, > > { DE_VIDEO2, MALIDP550_DE_LV2_BASE, MALIDP550_DE_LV2_PTR_BASE, > > - MALIDP_DE_LV_STRIDE0, MALIDP550_LV_YUV2RGB, 0, ROTATE_ANY }, > > + MALIDP_DE_LV_STRIDE0, MALIDP550_LV_YUV2RGB, 0, ROTATE_ANY, > > + MALIDP550_DE_LV2_AD_CTRL }, > > { DE_SMART, MALIDP550_DE_LS_BASE, MALIDP550_DE_LS_PTR_BASE, > > - MALIDP550_DE_LS_R1_STRIDE, 0, 0, ROTATE_NONE }, > > + MALIDP550_DE_LS_R1_STRIDE, 0, 0, ROTATE_NONE, 0 }, > > }; > > =20 > > static const struct malidp_layer malidp650_layers[] =3D { > > @@ -122,16 +125,16 @@ static const struct malidp_layer malidp650_layers= [] =3D { > > */ > > { DE_VIDEO1, MALIDP550_DE_LV1_BASE, MALIDP550_DE_LV1_PTR_BASE, > > MALIDP_DE_LV_STRIDE0, MALIDP550_LV_YUV2RGB, > > - MALIDP650_DE_LV_MMU_CTRL, ROTATE_ANY }, > > + MALIDP650_DE_LV_MMU_CTRL, ROTATE_ANY, MALIDP550_DE_LV1_AD_CTRL }, > > { DE_GRAPHICS1, MALIDP550_DE_LG_BASE, MALIDP550_DE_LG_PTR_BASE, > > MALIDP_DE_LG_STRIDE, 0, MALIDP650_DE_LG_MMU_CTRL, > > - ROTATE_COMPRESSED }, > > + ROTATE_COMPRESSED, MALIDP550_DE_LG_AD_CTRL }, > > { DE_VIDEO2, MALIDP550_DE_LV2_BASE, MALIDP550_DE_LV2_PTR_BASE, > > MALIDP_DE_LV_STRIDE0, MALIDP550_LV_YUV2RGB, > > - MALIDP650_DE_LV_MMU_CTRL, ROTATE_ANY }, > > + MALIDP650_DE_LV_MMU_CTRL, ROTATE_ANY, MALIDP550_DE_LV2_AD_CTRL }, > > { DE_SMART, MALIDP550_DE_LS_BASE, MALIDP550_DE_LS_PTR_BASE, > > MALIDP550_DE_LS_R1_STRIDE, 0, MALIDP650_DE_LS_MMU_CTRL, > > - ROTATE_NONE }, > > + ROTATE_NONE, 0 }, > > }; > > =20 > > #define SE_N_SCALING_COEFFS 96 > > diff --git a/drivers/gpu/drm/arm/malidp_hw.h b/drivers/gpu/drm/arm/mali= dp_hw.h > > index 40155e2..651558f 100644 > > --- a/drivers/gpu/drm/arm/malidp_hw.h > > +++ b/drivers/gpu/drm/arm/malidp_hw.h > > @@ -70,6 +70,8 @@ struct malidp_layer { > > s16 yuv2rgb_offset; /* offset to the YUV->RGB matrix entries */ > > u16 mmu_ctrl_offset; /* offset to the MMU control register */ > > enum rotation_features rot; /* type of rotation supported */ > > + /* address offset for the AFBC decoder registers */ > > + u16 afbc_decoder_offset; > > }; > > =20 > > enum malidp_scaling_coeff_set { > > diff --git a/drivers/gpu/drm/arm/malidp_planes.c b/drivers/gpu/drm/arm/= malidp_planes.c > > index c9a6d3e..cd60f73 100644 > > --- a/drivers/gpu/drm/arm/malidp_planes.c > > +++ b/drivers/gpu/drm/arm/malidp_planes.c > > @@ -592,6 +592,80 @@ static void malidp_de_set_mmu_control(struct malid= p_plane *mp, > > mp->layer->base + mp->layer->mmu_ctrl_offset); > > } > > =20 > > +static void malidp_set_plane_base_addr(struct drm_framebuffer *fb, > > + struct malidp_plane *mp, > > + int plane_index) > > +{ > > + dma_addr_t paddr; > > + u16 ptr; > > + struct drm_plane *plane =3D &mp->base; > > + bool afbc =3D fb->modifier ? true : false; > > + > > + ptr =3D mp->layer->ptr + (plane_index << 4); > > + > > + /* > > + * For AFBC buffers, cropping is handled by AFBC decoder rather than > > + * pointer manipulation. > > + */ >=20 > I think this comment needs to go in malidp_de_plane_update, not in this f= unction. > This function only updates the plane's base address. > I will reword the comment like this if it sounds sane :- drm_fb_cma_get_gem_addr() alters the physical base address of the framebuff= er as per the plane's src_x, src_y co-ordinates (ie to take care of source cro= pping). For AFBC, this is not needed as the cropping is handled by _AD_CROP_H and _AD_CROP_V registers. > > + if (!afbc) { > > + paddr =3D drm_fb_cma_get_gem_addr(fb, plane->state, > > + plane_index); > > + } else { > > + struct drm_gem_cma_object *obj; > > + > > + obj =3D drm_fb_cma_get_gem_obj(fb, plane_index); > > + > > + if (WARN_ON(!obj)) > > + return; > > + paddr =3D obj->paddr; > > + } > > + > > + malidp_hw_write(mp->hwdev, lower_32_bits(paddr), ptr); > > + malidp_hw_write(mp->hwdev, upper_32_bits(paddr), ptr + 4); > > +} > > + > > +static void malidp_de_set_plane_afbc(struct drm_plane *plane) > > +{ > > + struct malidp_plane *mp; > > + u32 src_w, src_h, val =3D 0, src_x, src_y; > > + struct drm_framebuffer *fb =3D plane->state->fb; > > + > > + mp =3D to_malidp_plane(plane); > > + > > + /* no afbc_decoder_offset means AFBC is not supported on this plane *= / > > + if (!mp->layer->afbc_decoder_offset) > > + return; > > + > > + if (!fb->modifier) { > > + malidp_hw_write(mp->hwdev, 0, mp->layer->afbc_decoder_offset); > > + return; > > + } > > + > > + /* convert src values from Q16 fixed point to integer */ > > + src_w =3D plane->state->src_w >> 16; > > + src_h =3D plane->state->src_h >> 16; > > + src_x =3D plane->state->src_x >> 16; > > + src_y =3D plane->state->src_y >> 16; > > + > > + val =3D ((fb->width - (src_x + src_w)) << MALIDP_AD_CROP_RIGHT_OFFSET= ) | > > + src_x; > > + malidp_hw_write(mp->hwdev, val, > > + mp->layer->afbc_decoder_offset + MALIDP_AD_CROP_H); > > + > > + val =3D ((fb->height - (src_y + src_h)) << MALIDP_AD_CROP_BOTTOM_OFFS= ET) | > > + src_y; > > + malidp_hw_write(mp->hwdev, val, > > + mp->layer->afbc_decoder_offset + MALIDP_AD_CROP_V); > > + > > + val =3D MALIDP_AD_EN; > > + if (fb->modifier & AFBC_FORMAT_MOD_SPLIT) > > + val |=3D MALIDP_AD_BS; > > + if (fb->modifier & AFBC_FORMAT_MOD_YTR) > > + val |=3D MALIDP_AD_YTR; > > + > > + malidp_hw_write(mp->hwdev, val, mp->layer->afbc_decoder_offset); > > +} > > + > > static void malidp_de_plane_update(struct drm_plane *plane, > > struct drm_plane_state *old_state) > > { > > @@ -600,30 +674,33 @@ static void malidp_de_plane_update(struct drm_pla= ne *plane, > > struct drm_plane_state *state =3D plane->state; > > u16 pixel_alpha =3D state->pixel_blend_mode; > > u8 plane_alpha =3D state->alpha >> 8; > > + bool format_has_alpha =3D state->fb->format->has_alpha; > > u32 src_w, src_h, dest_w, dest_h, val; > > int i; > > + struct drm_framebuffer *fb =3D plane->state->fb; > > =20 > > mp =3D to_malidp_plane(plane); > > =20 > > - /* convert src values from Q16 fixed point to integer */ > > - src_w =3D state->src_w >> 16; > > - src_h =3D state->src_h >> 16; > > - dest_w =3D state->crtc_w; > > - dest_h =3D state->crtc_h; > > + /* For AFBC framebuffer, use the framebuffer width and height for con= figuring > > + * layer input size register. > > + */ > > + if (fb->modifier) { > > + src_w =3D fb->width; > > + src_h =3D fb->height; > > + } else { > > + /* convert src values from Q16 fixed point to integer */ > > + src_w =3D ms->base.src_w >> 16; > > + src_h =3D ms->base.src_h >> 16; > > + } > > + dest_w =3D ms->base.crtc_w; > > + dest_h =3D ms->base.crtc_h; >=20 > These two lines above are equivalent to the last two lines you deleted. W= hy you need this change? >=20 Agreed, I will remove this change. > > =20 > > val =3D malidp_hw_read(mp->hwdev, mp->layer->base); > > val =3D (val & ~LAYER_FORMAT_MASK) | ms->format; > > malidp_hw_write(mp->hwdev, val, mp->layer->base); > > =20 > > - for (i =3D 0; i < ms->n_planes; i++) { > > - /* calculate the offset for the layer's plane registers */ > > - u16 ptr =3D mp->layer->ptr + (i << 4); > > - dma_addr_t fb_addr =3D drm_fb_cma_get_gem_addr(state->fb, > > - state, i); > > - > > - malidp_hw_write(mp->hwdev, lower_32_bits(fb_addr), ptr); > > - malidp_hw_write(mp->hwdev, upper_32_bits(fb_addr), ptr + 4); > > - } > > + for (i =3D 0; i < ms->n_planes; i++) > > + malidp_set_plane_base_addr(fb, mp, i); > > =20 > > malidp_de_set_mmu_control(mp, ms); > > =20 > > @@ -657,6 +734,8 @@ static void malidp_de_plane_update(struct drm_plane= *plane, > > mp->layer->base + MALIDP550_LS_R1_IN_SIZE); > > } > > =20 > > + malidp_de_set_plane_afbc(plane); >=20 > I feel like this function call should be done only if (fb->modifier) is > true. We need to call this function even is fb->modifier =3D 0. Please refer to the following snippet in malidp_de_set_plane_afbc() if (!fb->modifier) { malidp_hw_write(mp->hwdev, 0, mp->layer->afbc_decoder_offset); return; } I will prefer to keep all the AFBC register configuration in a single function. Thanks, Ayan Kumar Halder >=20 > > + > > /* first clear the rotation bits */ > > val =3D malidp_hw_read(mp->hwdev, mp->layer->base + MALIDP_LAYER_CONT= ROL); > > val &=3D ~LAYER_ROT_MASK; > > @@ -674,7 +753,7 @@ static void malidp_de_plane_update(struct drm_plane= *plane, > > =20 > > if (state->alpha !=3D DRM_BLEND_ALPHA_OPAQUE) { > > val |=3D LAYER_COMP_PLANE; > > - } else if (state->fb->format->has_alpha) { > > + } else if (format_has_alpha) { >=20 > This change has nothing to do with AFBC, it should not be in this patch. >=20 > > /* We only care about blend mode if the format has alpha */ > > switch (pixel_alpha) { > > case DRM_MODE_BLEND_PREMULTI: > > diff --git a/drivers/gpu/drm/arm/malidp_regs.h b/drivers/gpu/drm/arm/ma= lidp_regs.h > > index 7ce3e14..a0dd6e1 100644 > > --- a/drivers/gpu/drm/arm/malidp_regs.h > > +++ b/drivers/gpu/drm/arm/malidp_regs.h > > @@ -198,10 +198,13 @@ > > #define MALIDP500_LV_YUV2RGB ((s16)(-0xB8)) > > #define MALIDP500_DE_LV_BASE 0x00100 > > #define MALIDP500_DE_LV_PTR_BASE 0x00124 > > +#define MALIDP500_DE_LV_AD_CTRL 0x00400 > > #define MALIDP500_DE_LG1_BASE 0x00200 > > #define MALIDP500_DE_LG1_PTR_BASE 0x0021c > > +#define MALIDP500_DE_LG1_AD_CTRL 0x0040c > > #define MALIDP500_DE_LG2_BASE 0x00300 > > #define MALIDP500_DE_LG2_PTR_BASE 0x0031c > > +#define MALIDP500_DE_LG2_AD_CTRL 0x00418 > > #define MALIDP500_SE_BASE 0x00c00 > > #define MALIDP500_SE_CONTROL 0x00c0c > > #define MALIDP500_SE_MEMWRITE_OUT_SIZE 0x00c2c > > @@ -228,10 +231,13 @@ > > #define MALIDP550_LV_YUV2RGB 0x00084 > > #define MALIDP550_DE_LV1_BASE 0x00100 > > #define MALIDP550_DE_LV1_PTR_BASE 0x00124 > > +#define MALIDP550_DE_LV1_AD_CTRL 0x001B8 > > #define MALIDP550_DE_LV2_BASE 0x00200 > > #define MALIDP550_DE_LV2_PTR_BASE 0x00224 > > +#define MALIDP550_DE_LV2_AD_CTRL 0x002B8 > > #define MALIDP550_DE_LG_BASE 0x00300 > > #define MALIDP550_DE_LG_PTR_BASE 0x0031c > > +#define MALIDP550_DE_LG_AD_CTRL 0x00330 > > #define MALIDP550_DE_LS_BASE 0x00400 > > #define MALIDP550_DE_LS_PTR_BASE 0x0042c > > #define MALIDP550_DE_PERF_BASE 0x00500 > > @@ -258,6 +264,20 @@ > > #define MALIDP_MMU_CTRL_PX_PS(x) (1 << (8 + (x))) > > #define MALIDP_MMU_CTRL_PP_NUM_REQ(x) (((x) & 0x7f) << 12) > > =20 > > +/* AFBC register offsets relative to MALIDPXXX_DE_LX_AD_CTRL */ > > +/* The following register offsets are common for DP500, DP550 and DP65= 0 */ > > +#define MALIDP_AD_CROP_H 0x4 > > +#define MALIDP_AD_CROP_V 0x8 > > +#define MALIDP_AD_END_PTR_LOW 0xc > > +#define MALIDP_AD_END_PTR_HIGH 0x10 > > + > > +/* AFBC decoder Registers */ > > +#define MALIDP_AD_EN BIT(0) > > +#define MALIDP_AD_YTR BIT(4) > > +#define MALIDP_AD_BS BIT(8) > > +#define MALIDP_AD_CROP_RIGHT_OFFSET 16 > > +#define MALIDP_AD_CROP_BOTTOM_OFFSET 16 > > + > > /* > > * Starting with DP550 the register map blocks has been standardised t= o the > > * following layout: > > --=20 > > 2.7.4 > >=20 >=20 > Best regards, > Liviu >=20 >=20 > --=20 > =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! / > --------------- > ??\_(???)_/?? > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ayan Halder Subject: Re: [RFC v3 AFBC 04/12] drm/arm/malidp: Set the AFBC register bits if the framebuffer has AFBC modifier Date: Fri, 14 Dec 2018 13:45:13 +0000 Message-ID: <20181214134512.GA19564@arm.com> References: <1543836703-8491-1-git-send-email-ayan.halder@arm.com> <1543836703-8491-5-git-send-email-ayan.halder@arm.com> <20181204165051.GL988@e110455-lin.cambridge.arm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from EUR03-DB5-obe.outbound.protection.outlook.com (mail-eopbgr40050.outbound.protection.outlook.com [40.107.4.50]) by gabe.freedesktop.org (Postfix) with ESMTPS id ED04C6F4DD for ; Fri, 14 Dec 2018 13:45:16 +0000 (UTC) In-Reply-To: <20181204165051.GL988@e110455-lin.cambridge.arm.com> Content-Language: en-US Content-ID: 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: "arnd@arndb.de" , "corbet@lwn.net" , "airlied@linux.ie" , "gregkh@linuxfoundation.org" , "linux-doc@vger.kernel.org" , "nicolas.ferre@microchip.com" , "dri-devel@lists.freedesktop.org" , "linux-kernel@vger.kernel.org" , "maxime.ripard@bootlin.com" , "malidp@foss.arm.com" , "mchehab+samsung@kernel.org" , "akpm@linux-foundation.org" , nd , "sean@poorly.run" , "davem@davemloft.net" List-Id: dri-devel@lists.freedesktop.org T24gVHVlLCBEZWMgMDQsIDIwMTggYXQgMDQ6NTA6NTFQTSArMDAwMCwgTGl2aXUgRHVkYXUgd3Jv dGU6CgpIaSBMaXZpdSwKClBsZWFzZSBsZXQgbWUga25vdyBpZiB5b3UgYWdyZWUgd2l0aCBteSBj b21tZW50cy4gVGhlbiBJIHdpbGwgc2VuZCBhCnY0IHBhdGNoIGZvciB0aGlzLgo+IE9uIE1vbiwg RGVjIDAzLCAyMDE4IGF0IDExOjMxOjU4QU0gKzAwMDAsIEF5YW4gSGFsZGVyIHdyb3RlOgo+ID4g QWRkZWQgdGhlIEFGQkMgZGVjb2RlciByZWdpc3RlcnMgZm9yIERQNTAwICwgRFA1NTAgYW5kIERQ NjUwLgo+ID4gVGhlc2UgcmVnaXN0ZXJzIGNvbnRyb2wgdGhlIHByb2Nlc3Npbmcgb2YgQUZCQyBi dWZmZXJzLiBJdCBjb250cm9scyB2YXJpb3VzCj4gPiBmZWF0dXJlcyBsaWtlIEFGQkMgZGVjb2Rl ciBlbmFibGUsIGxvc3NsZXNzIHRyYW5zZm9ybWF0aW9uIGFuZCBibG9jayBzcGxpdAo+ID4gYXMg d2VsbCBhcyBzZXR0aW5nIG9mIHRoZSBsZWZ0LCByaWdodCwgdG9wIGFuZCBib3R0b20gY3JvcHBp bmcgb2YgQUZCQyBidWZmZXJzCj4gPiAoaW4gbnVtYmVyIG9mIHBpeGVscykuCj4gPiBBbGwgdGhl IGxheWVycyAoZXhjZXB0IERFX1NNQVJUKSBzdXBwb3J0IGZyYW1lYnVmZmVycyB3aXRoIEFGQkMg bW9kaWZpZXJzLgo+ID4gT25lIG5lZWRzIHRvIHNldCB0aGUgcGl4ZWwgdmFsdWVzIG9mIHRoZSB0 b3AsIGxlZnQsIGJvdHRvbSBhbmQgcmlnaHQgY3JvcHBpbmcKPiA+IGZvciB0aGUgQUZCQyBmcmFt ZWJ1ZmZlci4KPiA+IENyb3BwaW5nIGFuIEFGQkMgZnJhbWVidWZmZXIgaXMgY29udHJvbGxlZCBi eSB0aGUgQUZCQyBjcm9wIHJlZ2lzdGVycy4KPiA+IEluIHRoYXQgY2FzZSwgdGhlIGxheWVyIGlu cHV0IHNpemUgcmVnaXN0ZXJzIHNob3VsZCBiZSBjb25maWd1cmVkIHdpdGgKPiA+IGZyYW1lYnVm ZmVyJ3MgZGltZW5zaW9ucyBhbmQgbm90IHdpdGggZHJtX3BsYW5lX3N0YXRlIHNvdXJjZSB3aWR0 aC9oZWlnaHQKPiA+IHZhbHVlcyAod2hpY2ggaXMgdXNlZCBmb3Igbm9uIEFGQkMgZnJhbWVidWZm ZXIgdG8gZGVub3RlIGNyb3BwaW5nKS4KPiA+IAo+ID4gQ2hhbmdlcyBmcm9tIHYxOgo+ID4gIC0g UmVtb3ZlZCB0aGUgImlmIChmYi0+bW9kaWZpZXIpIiBjaGVjayBmcm9tIG1hbGlkcF9kZV9wbGFu ZV91cGRhdGUoKQo+ID4gYW5kIGFkZGVkIGl0IGluIG1hbGlkcF9kZV9zZXRfcGxhbmVfYWZiYygp LiBUaGlzIHdpbGwgY29uc29saWRhdGUgYWxsIHRoZQo+ID4gQUZCQyBzcGVjaWZpYyByZWdpc3Rl ciBjb25maWd1cmF0aW9ucyBpbiBhIHNpbmdsZSBmdW5jdGlvbiBpZQo+ID4gbWFsaWRwX2RlX3Nl dF9wbGFuZV9hZmJjKCkuCj4gPiAKPiA+IENoYW5nZXMgZnJvbSB2MjoKPiA+ICAtIEZvciBBRkJD IGZyYW1lYnVmZmVyLCBsYXllciBpbnB1dCBzaXplIHJlZ2lzdGVyIHNob3VsZCBiZSBzZXQgdG8g ZnJhbWVidWZmZXIncwo+ID4gd2lkdGggYW5kIGhlaWdodAo+ID4gCj4gPiBTaWduZWQtb2ZmLWJ5 OiBBeWFuIEt1bWFyIEhhbGRlciA8YXlhbi5oYWxkZXJAYXJtLmNvbT4KPiA+IC0tLQo+ID4gIGRy aXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRwX2h3LmMgICAgIHwgIDI1ICsrKysrLS0tLQo+ID4gIGRy aXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRwX2h3LmggICAgIHwgICAyICsKPiA+ICBkcml2ZXJzL2dw dS9kcm0vYXJtL21hbGlkcF9wbGFuZXMuYyB8IDEwOSArKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrLS0tLS0KPiA+ICBkcml2ZXJzL2dwdS9kcm0vYXJtL21hbGlkcF9yZWdzLmggICB8ICAy MCArKysrKysrCj4gPiAgNCBmaWxlcyBjaGFuZ2VkLCAxMzAgaW5zZXJ0aW9ucygrKSwgMjYgZGVs ZXRpb25zKC0pCj4gPiAKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYXJtL21hbGlk cF9ody5jIGIvZHJpdmVycy9ncHUvZHJtL2FybS9tYWxpZHBfaHcuYwo+ID4gaW5kZXggYjliZWQx MS4uODdiN2IxMiAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRwX2h3 LmMKPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRwX2h3LmMKPiA+IEBAIC05NCwx MSArOTQsMTIgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBtYWxpZHBfbGF5ZXIgbWFsaWRwNTAwX2xh eWVyc1tdID0gewo+ID4gIAkgKgl5dXYycmdiIG1hdHJpeCBvZmZzZXQsIG1tdSBjb250cm9sIHJl Z2lzdGVyIG9mZnNldCwgcm90YXRpb25fZmVhdHVyZXMKPiA+ICAJICovCj4gPiAgCXsgREVfVklE RU8xLCBNQUxJRFA1MDBfREVfTFZfQkFTRSwgTUFMSURQNTAwX0RFX0xWX1BUUl9CQVNFLAo+ID4g LQkJTUFMSURQX0RFX0xWX1NUUklERTAsIE1BTElEUDUwMF9MVl9ZVVYyUkdCLCAwLCBST1RBVEVf QU5ZIH0sCj4gPiArCQlNQUxJRFBfREVfTFZfU1RSSURFMCwgTUFMSURQNTAwX0xWX1lVVjJSR0Is IDAsIFJPVEFURV9BTlksCj4gPiArCQlNQUxJRFA1MDBfREVfTFZfQURfQ1RSTCB9LAo+ID4gIAl7 IERFX0dSQVBISUNTMSwgTUFMSURQNTAwX0RFX0xHMV9CQVNFLCBNQUxJRFA1MDBfREVfTEcxX1BU Ul9CQVNFLAo+ID4gLQkJTUFMSURQX0RFX0xHX1NUUklERSwgMCwgMCwgUk9UQVRFX0FOWSB9LAo+ ID4gKwkJTUFMSURQX0RFX0xHX1NUUklERSwgMCwgMCwgUk9UQVRFX0FOWSwgTUFMSURQNTAwX0RF X0xHMV9BRF9DVFJMIH0sCj4gPiAgCXsgREVfR1JBUEhJQ1MyLCBNQUxJRFA1MDBfREVfTEcyX0JB U0UsIE1BTElEUDUwMF9ERV9MRzJfUFRSX0JBU0UsCj4gPiAtCQlNQUxJRFBfREVfTEdfU1RSSURF LCAwLCAwLCBST1RBVEVfQU5ZIH0sCj4gPiArCQlNQUxJRFBfREVfTEdfU1RSSURFLCAwLCAwLCBS T1RBVEVfQU5ZLCBNQUxJRFA1MDBfREVfTEcyX0FEX0NUUkwgfSwKPiA+ICB9Owo+ID4gIAo+ID4g IHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWFsaWRwX2xheWVyIG1hbGlkcDU1MF9sYXllcnNbXSA9IHsK PiA+IEBAIC0xMDYsMTMgKzEwNywxNSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IG1hbGlkcF9sYXll ciBtYWxpZHA1NTBfbGF5ZXJzW10gPSB7Cj4gPiAgCSAqCXl1djJyZ2IgbWF0cml4IG9mZnNldCwg bW11IGNvbnRyb2wgcmVnaXN0ZXIgb2Zmc2V0LCByb3RhdGlvbl9mZWF0dXJlcwo+ID4gIAkgKi8K PiA+ICAJeyBERV9WSURFTzEsIE1BTElEUDU1MF9ERV9MVjFfQkFTRSwgTUFMSURQNTUwX0RFX0xW MV9QVFJfQkFTRSwKPiA+IC0JCU1BTElEUF9ERV9MVl9TVFJJREUwLCBNQUxJRFA1NTBfTFZfWVVW MlJHQiwgMCwgUk9UQVRFX0FOWSB9LAo+ID4gKwkJTUFMSURQX0RFX0xWX1NUUklERTAsIE1BTElE UDU1MF9MVl9ZVVYyUkdCLCAwLCBST1RBVEVfQU5ZLAo+ID4gKwkJTUFMSURQNTUwX0RFX0xWMV9B RF9DVFJMIH0sCj4gPiAgCXsgREVfR1JBUEhJQ1MxLCBNQUxJRFA1NTBfREVfTEdfQkFTRSwgTUFM SURQNTUwX0RFX0xHX1BUUl9CQVNFLAo+ID4gLQkJTUFMSURQX0RFX0xHX1NUUklERSwgMCwgMCwg Uk9UQVRFX0FOWSB9LAo+ID4gKwkJTUFMSURQX0RFX0xHX1NUUklERSwgMCwgMCwgUk9UQVRFX0FO WSwgTUFMSURQNTUwX0RFX0xHX0FEX0NUUkwgfSwKPiA+ICAJeyBERV9WSURFTzIsIE1BTElEUDU1 MF9ERV9MVjJfQkFTRSwgTUFMSURQNTUwX0RFX0xWMl9QVFJfQkFTRSwKPiA+IC0JCU1BTElEUF9E RV9MVl9TVFJJREUwLCBNQUxJRFA1NTBfTFZfWVVWMlJHQiwgMCwgUk9UQVRFX0FOWSB9LAo+ID4g KwkJTUFMSURQX0RFX0xWX1NUUklERTAsIE1BTElEUDU1MF9MVl9ZVVYyUkdCLCAwLCBST1RBVEVf QU5ZLAo+ID4gKwkJTUFMSURQNTUwX0RFX0xWMl9BRF9DVFJMIH0sCj4gPiAgCXsgREVfU01BUlQs IE1BTElEUDU1MF9ERV9MU19CQVNFLCBNQUxJRFA1NTBfREVfTFNfUFRSX0JBU0UsCj4gPiAtCQlN QUxJRFA1NTBfREVfTFNfUjFfU1RSSURFLCAwLCAwLCBST1RBVEVfTk9ORSB9LAo+ID4gKwkJTUFM SURQNTUwX0RFX0xTX1IxX1NUUklERSwgMCwgMCwgUk9UQVRFX05PTkUsIDAgfSwKPiA+ICB9Owo+ ID4gIAo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWFsaWRwX2xheWVyIG1hbGlkcDY1MF9sYXll cnNbXSA9IHsKPiA+IEBAIC0xMjIsMTYgKzEyNSwxNiBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IG1h bGlkcF9sYXllciBtYWxpZHA2NTBfbGF5ZXJzW10gPSB7Cj4gPiAgCSAqLwo+ID4gIAl7IERFX1ZJ REVPMSwgTUFMSURQNTUwX0RFX0xWMV9CQVNFLCBNQUxJRFA1NTBfREVfTFYxX1BUUl9CQVNFLAo+ ID4gIAkJTUFMSURQX0RFX0xWX1NUUklERTAsIE1BTElEUDU1MF9MVl9ZVVYyUkdCLAo+ID4gLQkJ TUFMSURQNjUwX0RFX0xWX01NVV9DVFJMLCBST1RBVEVfQU5ZIH0sCj4gPiArCQlNQUxJRFA2NTBf REVfTFZfTU1VX0NUUkwsIFJPVEFURV9BTlksIE1BTElEUDU1MF9ERV9MVjFfQURfQ1RSTCB9LAo+ ID4gIAl7IERFX0dSQVBISUNTMSwgTUFMSURQNTUwX0RFX0xHX0JBU0UsIE1BTElEUDU1MF9ERV9M R19QVFJfQkFTRSwKPiA+ICAJCU1BTElEUF9ERV9MR19TVFJJREUsIDAsIE1BTElEUDY1MF9ERV9M R19NTVVfQ1RSTCwKPiA+IC0JCVJPVEFURV9DT01QUkVTU0VEIH0sCj4gPiArCQlST1RBVEVfQ09N UFJFU1NFRCwgTUFMSURQNTUwX0RFX0xHX0FEX0NUUkwgfSwKPiA+ICAJeyBERV9WSURFTzIsIE1B TElEUDU1MF9ERV9MVjJfQkFTRSwgTUFMSURQNTUwX0RFX0xWMl9QVFJfQkFTRSwKPiA+ICAJCU1B TElEUF9ERV9MVl9TVFJJREUwLCBNQUxJRFA1NTBfTFZfWVVWMlJHQiwKPiA+IC0JCU1BTElEUDY1 MF9ERV9MVl9NTVVfQ1RSTCwgUk9UQVRFX0FOWSB9LAo+ID4gKwkJTUFMSURQNjUwX0RFX0xWX01N VV9DVFJMLCBST1RBVEVfQU5ZLCBNQUxJRFA1NTBfREVfTFYyX0FEX0NUUkwgfSwKPiA+ICAJeyBE RV9TTUFSVCwgTUFMSURQNTUwX0RFX0xTX0JBU0UsIE1BTElEUDU1MF9ERV9MU19QVFJfQkFTRSwK PiA+ICAJCU1BTElEUDU1MF9ERV9MU19SMV9TVFJJREUsIDAsIE1BTElEUDY1MF9ERV9MU19NTVVf Q1RSTCwKPiA+IC0JCVJPVEFURV9OT05FIH0sCj4gPiArCQlST1RBVEVfTk9ORSwgMCB9LAo+ID4g IH07Cj4gPiAgCj4gPiAgI2RlZmluZSBTRV9OX1NDQUxJTkdfQ09FRkZTCTk2Cj4gPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2FybS9tYWxpZHBfaHcuaCBiL2RyaXZlcnMvZ3B1L2RybS9h cm0vbWFsaWRwX2h3LmgKPiA+IGluZGV4IDQwMTU1ZTIuLjY1MTU1OGYgMTAwNjQ0Cj4gPiAtLS0g YS9kcml2ZXJzL2dwdS9kcm0vYXJtL21hbGlkcF9ody5oCj4gPiArKysgYi9kcml2ZXJzL2dwdS9k cm0vYXJtL21hbGlkcF9ody5oCj4gPiBAQCAtNzAsNiArNzAsOCBAQCBzdHJ1Y3QgbWFsaWRwX2xh eWVyIHsKPiA+ICAJczE2IHl1djJyZ2Jfb2Zmc2V0OwkvKiBvZmZzZXQgdG8gdGhlIFlVVi0+UkdC IG1hdHJpeCBlbnRyaWVzICovCj4gPiAgCXUxNiBtbXVfY3RybF9vZmZzZXQ7ICAgIC8qIG9mZnNl dCB0byB0aGUgTU1VIGNvbnRyb2wgcmVnaXN0ZXIgKi8KPiA+ICAJZW51bSByb3RhdGlvbl9mZWF0 dXJlcyByb3Q7CS8qIHR5cGUgb2Ygcm90YXRpb24gc3VwcG9ydGVkICovCj4gPiArCS8qIGFkZHJl c3Mgb2Zmc2V0IGZvciB0aGUgQUZCQyBkZWNvZGVyIHJlZ2lzdGVycyAqLwo+ID4gKwl1MTYgYWZi Y19kZWNvZGVyX29mZnNldDsKPiA+ICB9Owo+ID4gIAo+ID4gIGVudW0gbWFsaWRwX3NjYWxpbmdf Y29lZmZfc2V0IHsKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYXJtL21hbGlkcF9w bGFuZXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRwX3BsYW5lcy5jCj4gPiBpbmRleCBj OWE2ZDNlLi5jZDYwZjczIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FybS9tYWxp ZHBfcGxhbmVzLmMKPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRwX3BsYW5lcy5j Cj4gPiBAQCAtNTkyLDYgKzU5Miw4MCBAQCBzdGF0aWMgdm9pZCBtYWxpZHBfZGVfc2V0X21tdV9j b250cm9sKHN0cnVjdCBtYWxpZHBfcGxhbmUgKm1wLAo+ID4gIAkJCW1wLT5sYXllci0+YmFzZSAr IG1wLT5sYXllci0+bW11X2N0cmxfb2Zmc2V0KTsKPiA+ICB9Cj4gPiAgCj4gPiArc3RhdGljIHZv aWQgbWFsaWRwX3NldF9wbGFuZV9iYXNlX2FkZHIoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIs Cj4gPiArCQkJCSAgICAgICBzdHJ1Y3QgbWFsaWRwX3BsYW5lICptcCwKPiA+ICsJCQkJICAgICAg IGludCBwbGFuZV9pbmRleCkKPiA+ICt7Cj4gPiArCWRtYV9hZGRyX3QgcGFkZHI7Cj4gPiArCXUx NiBwdHI7Cj4gPiArCXN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lID0gJm1wLT5iYXNlOwo+ID4gKwli b29sIGFmYmMgPSBmYi0+bW9kaWZpZXIgPyB0cnVlIDogZmFsc2U7Cj4gPiArCj4gPiArCXB0ciA9 IG1wLT5sYXllci0+cHRyICsgKHBsYW5lX2luZGV4IDw8IDQpOwo+ID4gKwo+ID4gKwkvKgo+ID4g KwkgKiBGb3IgQUZCQyBidWZmZXJzLCBjcm9wcGluZyBpcyBoYW5kbGVkIGJ5IEFGQkMgZGVjb2Rl ciByYXRoZXIgdGhhbgo+ID4gKwkgKiBwb2ludGVyIG1hbmlwdWxhdGlvbi4KPiA+ICsJICovCj4g Cj4gSSB0aGluayB0aGlzIGNvbW1lbnQgbmVlZHMgdG8gZ28gaW4gbWFsaWRwX2RlX3BsYW5lX3Vw ZGF0ZSwgbm90IGluIHRoaXMgZnVuY3Rpb24uCj4gVGhpcyBmdW5jdGlvbiBvbmx5IHVwZGF0ZXMg dGhlIHBsYW5lJ3MgYmFzZSBhZGRyZXNzLgo+Ckkgd2lsbCByZXdvcmQgdGhlIGNvbW1lbnQgbGlr ZSB0aGlzIGlmIGl0IHNvdW5kcyBzYW5lIDotCgpkcm1fZmJfY21hX2dldF9nZW1fYWRkcigpIGFs dGVycyB0aGUgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBmcmFtZWJ1ZmZlcgphcyBwZXIg dGhlIHBsYW5lJ3Mgc3JjX3gsIHNyY195IGNvLW9yZGluYXRlcyAoaWUgdG8gdGFrZSBjYXJlIG9m IHNvdXJjZSBjcm9wcGluZykuCkZvciBBRkJDLCB0aGlzIGlzIG5vdCBuZWVkZWQgYXMgdGhlIGNy b3BwaW5nIGlzIGhhbmRsZWQgYnkgX0FEX0NST1BfSAphbmQgX0FEX0NST1BfViByZWdpc3RlcnMu Cgo+ID4gKwlpZiAoIWFmYmMpIHsKPiA+ICsJCXBhZGRyID0gZHJtX2ZiX2NtYV9nZXRfZ2VtX2Fk ZHIoZmIsIHBsYW5lLT5zdGF0ZSwKPiA+ICsJCQkJCQlwbGFuZV9pbmRleCk7Cj4gPiArCX0gZWxz ZSB7Cj4gPiArCQlzdHJ1Y3QgZHJtX2dlbV9jbWFfb2JqZWN0ICpvYmo7Cj4gPiArCj4gPiArCQlv YmogPSBkcm1fZmJfY21hX2dldF9nZW1fb2JqKGZiLCBwbGFuZV9pbmRleCk7Cj4gPiArCj4gPiAr CQlpZiAoV0FSTl9PTighb2JqKSkKPiA+ICsJCQlyZXR1cm47Cj4gPiArCQlwYWRkciA9IG9iai0+ cGFkZHI7Cj4gPiArCX0KPiA+ICsKPiA+ICsJbWFsaWRwX2h3X3dyaXRlKG1wLT5od2RldiwgbG93 ZXJfMzJfYml0cyhwYWRkciksIHB0cik7Cj4gPiArCW1hbGlkcF9od193cml0ZShtcC0+aHdkZXYs IHVwcGVyXzMyX2JpdHMocGFkZHIpLCBwdHIgKyA0KTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGlj IHZvaWQgbWFsaWRwX2RlX3NldF9wbGFuZV9hZmJjKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lKQo+ ID4gK3sKPiA+ICsJc3RydWN0IG1hbGlkcF9wbGFuZSAqbXA7Cj4gPiArCXUzMiBzcmNfdywgc3Jj X2gsIHZhbCA9IDAsIHNyY194LCBzcmNfeTsKPiA+ICsJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAq ZmIgPSBwbGFuZS0+c3RhdGUtPmZiOwo+ID4gKwo+ID4gKwltcCA9IHRvX21hbGlkcF9wbGFuZShw bGFuZSk7Cj4gPiArCj4gPiArCS8qIG5vIGFmYmNfZGVjb2Rlcl9vZmZzZXQgbWVhbnMgQUZCQyBp cyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhbmUgKi8KPiA+ICsJaWYgKCFtcC0+bGF5ZXItPmFm YmNfZGVjb2Rlcl9vZmZzZXQpCj4gPiArCQlyZXR1cm47Cj4gPiArCj4gPiArCWlmICghZmItPm1v ZGlmaWVyKSB7Cj4gPiArCQltYWxpZHBfaHdfd3JpdGUobXAtPmh3ZGV2LCAwLCBtcC0+bGF5ZXIt PmFmYmNfZGVjb2Rlcl9vZmZzZXQpOwo+ID4gKwkJcmV0dXJuOwo+ID4gKwl9Cj4gPiArCj4gPiAr CS8qIGNvbnZlcnQgc3JjIHZhbHVlcyBmcm9tIFExNiBmaXhlZCBwb2ludCB0byBpbnRlZ2VyICov Cj4gPiArCXNyY193ID0gcGxhbmUtPnN0YXRlLT5zcmNfdyA+PiAxNjsKPiA+ICsJc3JjX2ggPSBw bGFuZS0+c3RhdGUtPnNyY19oID4+IDE2Owo+ID4gKwlzcmNfeCA9IHBsYW5lLT5zdGF0ZS0+c3Jj X3ggPj4gMTY7Cj4gPiArCXNyY195ID0gcGxhbmUtPnN0YXRlLT5zcmNfeSA+PiAxNjsKPiA+ICsK PiA+ICsJdmFsID0gKChmYi0+d2lkdGggLSAoc3JjX3ggKyBzcmNfdykpIDw8IE1BTElEUF9BRF9D Uk9QX1JJR0hUX09GRlNFVCkgfAo+ID4gKwkJICAgc3JjX3g7Cj4gPiArCW1hbGlkcF9od193cml0 ZShtcC0+aHdkZXYsIHZhbCwKPiA+ICsJCQltcC0+bGF5ZXItPmFmYmNfZGVjb2Rlcl9vZmZzZXQg KyBNQUxJRFBfQURfQ1JPUF9IKTsKPiA+ICsKPiA+ICsJdmFsID0gKChmYi0+aGVpZ2h0IC0gKHNy Y195ICsgc3JjX2gpKSA8PCBNQUxJRFBfQURfQ1JPUF9CT1RUT01fT0ZGU0VUKSB8Cj4gPiArCQkg ICBzcmNfeTsKPiA+ICsJbWFsaWRwX2h3X3dyaXRlKG1wLT5od2RldiwgdmFsLAo+ID4gKwkJCW1w LT5sYXllci0+YWZiY19kZWNvZGVyX29mZnNldCArIE1BTElEUF9BRF9DUk9QX1YpOwo+ID4gKwo+ ID4gKwl2YWwgPSBNQUxJRFBfQURfRU47Cj4gPiArCWlmIChmYi0+bW9kaWZpZXIgJiBBRkJDX0ZP Uk1BVF9NT0RfU1BMSVQpCj4gPiArCQl2YWwgfD0gTUFMSURQX0FEX0JTOwo+ID4gKwlpZiAoZmIt Pm1vZGlmaWVyICYgQUZCQ19GT1JNQVRfTU9EX1lUUikKPiA+ICsJCXZhbCB8PSBNQUxJRFBfQURf WVRSOwo+ID4gKwo+ID4gKwltYWxpZHBfaHdfd3JpdGUobXAtPmh3ZGV2LCB2YWwsIG1wLT5sYXll ci0+YWZiY19kZWNvZGVyX29mZnNldCk7Cj4gPiArfQo+ID4gKwo+ID4gIHN0YXRpYyB2b2lkIG1h bGlkcF9kZV9wbGFuZV91cGRhdGUoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCj4gPiAgCQkJCSAg IHN0cnVjdCBkcm1fcGxhbmVfc3RhdGUgKm9sZF9zdGF0ZSkKPiA+ICB7Cj4gPiBAQCAtNjAwLDMw ICs2NzQsMzMgQEAgc3RhdGljIHZvaWQgbWFsaWRwX2RlX3BsYW5lX3VwZGF0ZShzdHJ1Y3QgZHJt X3BsYW5lICpwbGFuZSwKPiA+ICAJc3RydWN0IGRybV9wbGFuZV9zdGF0ZSAqc3RhdGUgPSBwbGFu ZS0+c3RhdGU7Cj4gPiAgCXUxNiBwaXhlbF9hbHBoYSA9IHN0YXRlLT5waXhlbF9ibGVuZF9tb2Rl Owo+ID4gIAl1OCBwbGFuZV9hbHBoYSA9IHN0YXRlLT5hbHBoYSA+PiA4Owo+ID4gKwlib29sIGZv cm1hdF9oYXNfYWxwaGEgPSBzdGF0ZS0+ZmItPmZvcm1hdC0+aGFzX2FscGhhOwo+ID4gIAl1MzIg c3JjX3csIHNyY19oLCBkZXN0X3csIGRlc3RfaCwgdmFsOwo+ID4gIAlpbnQgaTsKPiA+ICsJc3Ry dWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIgPSBwbGFuZS0+c3RhdGUtPmZiOwo+ID4gIAo+ID4gIAlt cCA9IHRvX21hbGlkcF9wbGFuZShwbGFuZSk7Cj4gPiAgCj4gPiAtCS8qIGNvbnZlcnQgc3JjIHZh bHVlcyBmcm9tIFExNiBmaXhlZCBwb2ludCB0byBpbnRlZ2VyICovCj4gPiAtCXNyY193ID0gc3Rh dGUtPnNyY193ID4+IDE2Owo+ID4gLQlzcmNfaCA9IHN0YXRlLT5zcmNfaCA+PiAxNjsKPiA+IC0J ZGVzdF93ID0gc3RhdGUtPmNydGNfdzsKPiA+IC0JZGVzdF9oID0gc3RhdGUtPmNydGNfaDsKPiA+ ICsJLyogRm9yIEFGQkMgZnJhbWVidWZmZXIsIHVzZSB0aGUgZnJhbWVidWZmZXIgd2lkdGggYW5k IGhlaWdodCBmb3IgY29uZmlndXJpbmcKPiA+ICsJICogbGF5ZXIgaW5wdXQgc2l6ZSByZWdpc3Rl ci4KPiA+ICsJICovCj4gPiArCWlmIChmYi0+bW9kaWZpZXIpIHsKPiA+ICsJCXNyY193ID0gZmIt PndpZHRoOwo+ID4gKwkJc3JjX2ggPSBmYi0+aGVpZ2h0Owo+ID4gKwl9IGVsc2Ugewo+ID4gKwkJ LyogY29udmVydCBzcmMgdmFsdWVzIGZyb20gUTE2IGZpeGVkIHBvaW50IHRvIGludGVnZXIgKi8K PiA+ICsJCXNyY193ID0gbXMtPmJhc2Uuc3JjX3cgPj4gMTY7Cj4gPiArCQlzcmNfaCA9IG1zLT5i YXNlLnNyY19oID4+IDE2Owo+ID4gKwl9Cj4gPiArCWRlc3RfdyA9IG1zLT5iYXNlLmNydGNfdzsK PiA+ICsJZGVzdF9oID0gbXMtPmJhc2UuY3J0Y19oOwo+IAo+IFRoZXNlIHR3byBsaW5lcyBhYm92 ZSBhcmUgZXF1aXZhbGVudCB0byB0aGUgbGFzdCB0d28gbGluZXMgeW91IGRlbGV0ZWQuIFdoeSB5 b3UgbmVlZCB0aGlzIGNoYW5nZT8KPiAKQWdyZWVkLCBJIHdpbGwgcmVtb3ZlIHRoaXMgY2hhbmdl Lgo+ID4gIAo+ID4gIAl2YWwgPSBtYWxpZHBfaHdfcmVhZChtcC0+aHdkZXYsIG1wLT5sYXllci0+ YmFzZSk7Cj4gPiAgCXZhbCA9ICh2YWwgJiB+TEFZRVJfRk9STUFUX01BU0spIHwgbXMtPmZvcm1h dDsKPiA+ICAJbWFsaWRwX2h3X3dyaXRlKG1wLT5od2RldiwgdmFsLCBtcC0+bGF5ZXItPmJhc2Up Owo+ID4gIAo+ID4gLQlmb3IgKGkgPSAwOyBpIDwgbXMtPm5fcGxhbmVzOyBpKyspIHsKPiA+IC0J CS8qIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZvciB0aGUgbGF5ZXIncyBwbGFuZSByZWdpc3RlcnMg Ki8KPiA+IC0JCXUxNiBwdHIgPSBtcC0+bGF5ZXItPnB0ciArIChpIDw8IDQpOwo+ID4gLQkJZG1h X2FkZHJfdCBmYl9hZGRyID0gZHJtX2ZiX2NtYV9nZXRfZ2VtX2FkZHIoc3RhdGUtPmZiLAo+ID4g LQkJCQkJCQkgICAgIHN0YXRlLCBpKTsKPiA+IC0KPiA+IC0JCW1hbGlkcF9od193cml0ZShtcC0+ aHdkZXYsIGxvd2VyXzMyX2JpdHMoZmJfYWRkciksIHB0cik7Cj4gPiAtCQltYWxpZHBfaHdfd3Jp dGUobXAtPmh3ZGV2LCB1cHBlcl8zMl9iaXRzKGZiX2FkZHIpLCBwdHIgKyA0KTsKPiA+IC0JfQo+ ID4gKwlmb3IgKGkgPSAwOyBpIDwgbXMtPm5fcGxhbmVzOyBpKyspCj4gPiArCQltYWxpZHBfc2V0 X3BsYW5lX2Jhc2VfYWRkcihmYiwgbXAsIGkpOwo+ID4gIAo+ID4gIAltYWxpZHBfZGVfc2V0X21t dV9jb250cm9sKG1wLCBtcyk7Cj4gPiAgCj4gPiBAQCAtNjU3LDYgKzczNCw4IEBAIHN0YXRpYyB2 b2lkIG1hbGlkcF9kZV9wbGFuZV91cGRhdGUoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCj4gPiAg CQkJCW1wLT5sYXllci0+YmFzZSArIE1BTElEUDU1MF9MU19SMV9JTl9TSVpFKTsKPiA+ICAJfQo+ ID4gIAo+ID4gKwltYWxpZHBfZGVfc2V0X3BsYW5lX2FmYmMocGxhbmUpOwo+IAo+IEkgZmVlbCBs aWtlIHRoaXMgZnVuY3Rpb24gY2FsbCBzaG91bGQgYmUgZG9uZSBvbmx5IGlmIChmYi0+bW9kaWZp ZXIpIGlzCj4gdHJ1ZS4KV2UgbmVlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZXZlbiBpcyBmYi0+ bW9kaWZpZXIgPSAwLiBQbGVhc2UgcmVmZXIKdG8gdGhlIGZvbGxvd2luZyBzbmlwcGV0IGluIG1h bGlkcF9kZV9zZXRfcGxhbmVfYWZiYygpCgppZiAoIWZiLT5tb2RpZmllcikgewogICAgICBtYWxp ZHBfaHdfd3JpdGUobXAtPmh3ZGV2LCAwLCBtcC0+bGF5ZXItPmFmYmNfZGVjb2Rlcl9vZmZzZXQp OwogICAgICByZXR1cm47Cn0KSSB3aWxsIHByZWZlciB0byBrZWVwIGFsbCB0aGUgQUZCQyByZWdp c3RlciBjb25maWd1cmF0aW9uIGluIGEgc2luZ2xlCmZ1bmN0aW9uLgoKVGhhbmtzLApBeWFuIEt1 bWFyIEhhbGRlcgo+IAo+ID4gKwo+ID4gIAkvKiBmaXJzdCBjbGVhciB0aGUgcm90YXRpb24gYml0 cyAqLwo+ID4gIAl2YWwgPSBtYWxpZHBfaHdfcmVhZChtcC0+aHdkZXYsIG1wLT5sYXllci0+YmFz ZSArIE1BTElEUF9MQVlFUl9DT05UUk9MKTsKPiA+ICAJdmFsICY9IH5MQVlFUl9ST1RfTUFTSzsK PiA+IEBAIC02NzQsNyArNzUzLDcgQEAgc3RhdGljIHZvaWQgbWFsaWRwX2RlX3BsYW5lX3VwZGF0 ZShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKPiA+ICAKPiA+ICAJaWYgKHN0YXRlLT5hbHBoYSAh PSBEUk1fQkxFTkRfQUxQSEFfT1BBUVVFKSB7Cj4gPiAgCQl2YWwgfD0gTEFZRVJfQ09NUF9QTEFO RTsKPiA+IC0JfSBlbHNlIGlmIChzdGF0ZS0+ZmItPmZvcm1hdC0+aGFzX2FscGhhKSB7Cj4gPiAr CX0gZWxzZSBpZiAoZm9ybWF0X2hhc19hbHBoYSkgewo+IAo+IFRoaXMgY2hhbmdlIGhhcyBub3Ro aW5nIHRvIGRvIHdpdGggQUZCQywgaXQgc2hvdWxkIG5vdCBiZSBpbiB0aGlzIHBhdGNoLgo+IAo+ ID4gIAkJLyogV2Ugb25seSBjYXJlIGFib3V0IGJsZW5kIG1vZGUgaWYgdGhlIGZvcm1hdCBoYXMg YWxwaGEgKi8KPiA+ICAJCXN3aXRjaCAocGl4ZWxfYWxwaGEpIHsKPiA+ICAJCWNhc2UgRFJNX01P REVfQkxFTkRfUFJFTVVMVEk6Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FybS9t YWxpZHBfcmVncy5oIGIvZHJpdmVycy9ncHUvZHJtL2FybS9tYWxpZHBfcmVncy5oCj4gPiBpbmRl eCA3Y2UzZTE0Li5hMGRkNmUxIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FybS9t YWxpZHBfcmVncy5oCj4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYXJtL21hbGlkcF9yZWdzLmgK PiA+IEBAIC0xOTgsMTAgKzE5OCwxMyBAQAo+ID4gICNkZWZpbmUgTUFMSURQNTAwX0xWX1lVVjJS R0IJCSgoczE2KSgtMHhCOCkpCj4gPiAgI2RlZmluZSBNQUxJRFA1MDBfREVfTFZfQkFTRQkJMHgw MDEwMAo+ID4gICNkZWZpbmUgTUFMSURQNTAwX0RFX0xWX1BUUl9CQVNFCTB4MDAxMjQKPiA+ICsj ZGVmaW5lIE1BTElEUDUwMF9ERV9MVl9BRF9DVFJMCQkweDAwNDAwCj4gPiAgI2RlZmluZSBNQUxJ RFA1MDBfREVfTEcxX0JBU0UJCTB4MDAyMDAKPiA+ICAjZGVmaW5lIE1BTElEUDUwMF9ERV9MRzFf UFRSX0JBU0UJMHgwMDIxYwo+ID4gKyNkZWZpbmUgTUFMSURQNTAwX0RFX0xHMV9BRF9DVFJMCTB4 MDA0MGMKPiA+ICAjZGVmaW5lIE1BTElEUDUwMF9ERV9MRzJfQkFTRQkJMHgwMDMwMAo+ID4gICNk ZWZpbmUgTUFMSURQNTAwX0RFX0xHMl9QVFJfQkFTRQkweDAwMzFjCj4gPiArI2RlZmluZSBNQUxJ RFA1MDBfREVfTEcyX0FEX0NUUkwJMHgwMDQxOAo+ID4gICNkZWZpbmUgTUFMSURQNTAwX1NFX0JB U0UJCTB4MDBjMDAKPiA+ICAjZGVmaW5lIE1BTElEUDUwMF9TRV9DT05UUk9MCQkweDAwYzBjCj4g PiAgI2RlZmluZSBNQUxJRFA1MDBfU0VfTUVNV1JJVEVfT1VUX1NJWkUJMHgwMGMyYwo+ID4gQEAg LTIyOCwxMCArMjMxLDEzIEBACj4gPiAgI2RlZmluZSBNQUxJRFA1NTBfTFZfWVVWMlJHQgkJMHgw MDA4NAo+ID4gICNkZWZpbmUgTUFMSURQNTUwX0RFX0xWMV9CQVNFCQkweDAwMTAwCj4gPiAgI2Rl ZmluZSBNQUxJRFA1NTBfREVfTFYxX1BUUl9CQVNFCTB4MDAxMjQKPiA+ICsjZGVmaW5lIE1BTElE UDU1MF9ERV9MVjFfQURfQ1RSTAkweDAwMUI4Cj4gPiAgI2RlZmluZSBNQUxJRFA1NTBfREVfTFYy X0JBU0UJCTB4MDAyMDAKPiA+ICAjZGVmaW5lIE1BTElEUDU1MF9ERV9MVjJfUFRSX0JBU0UJMHgw MDIyNAo+ID4gKyNkZWZpbmUgTUFMSURQNTUwX0RFX0xWMl9BRF9DVFJMCTB4MDAyQjgKPiA+ICAj ZGVmaW5lIE1BTElEUDU1MF9ERV9MR19CQVNFCQkweDAwMzAwCj4gPiAgI2RlZmluZSBNQUxJRFA1 NTBfREVfTEdfUFRSX0JBU0UJMHgwMDMxYwo+ID4gKyNkZWZpbmUgTUFMSURQNTUwX0RFX0xHX0FE X0NUUkwJCTB4MDAzMzAKPiA+ICAjZGVmaW5lIE1BTElEUDU1MF9ERV9MU19CQVNFCQkweDAwNDAw Cj4gPiAgI2RlZmluZSBNQUxJRFA1NTBfREVfTFNfUFRSX0JBU0UJMHgwMDQyYwo+ID4gICNkZWZp bmUgTUFMSURQNTUwX0RFX1BFUkZfQkFTRQkJMHgwMDUwMAo+ID4gQEAgLTI1OCw2ICsyNjQsMjAg QEAKPiA+ICAjZGVmaW5lIE1BTElEUF9NTVVfQ1RSTF9QWF9QUyh4KQkoMSA8PCAoOCArICh4KSkp Cj4gPiAgI2RlZmluZSBNQUxJRFBfTU1VX0NUUkxfUFBfTlVNX1JFUSh4KQkoKCh4KSAmIDB4N2Yp IDw8IDEyKQo+ID4gIAo+ID4gKy8qIEFGQkMgcmVnaXN0ZXIgb2Zmc2V0cyByZWxhdGl2ZSB0byBN QUxJRFBYWFhfREVfTFhfQURfQ1RSTCAqLwo+ID4gKy8qIFRoZSBmb2xsb3dpbmcgcmVnaXN0ZXIg b2Zmc2V0cyBhcmUgY29tbW9uIGZvciBEUDUwMCwgRFA1NTAgYW5kIERQNjUwICovCj4gPiArI2Rl ZmluZSBNQUxJRFBfQURfQ1JPUF9IICAgICAgICAgICAgICAgIDB4NAo+ID4gKyNkZWZpbmUgTUFM SURQX0FEX0NST1BfViAgICAgICAgICAgICAgICAweDgKPiA+ICsjZGVmaW5lIE1BTElEUF9BRF9F TkRfUFRSX0xPVyAgICAgICAgICAgMHhjCj4gPiArI2RlZmluZSBNQUxJRFBfQURfRU5EX1BUUl9I SUdIICAgICAgICAgIDB4MTAKPiA+ICsKPiA+ICsvKiBBRkJDIGRlY29kZXIgUmVnaXN0ZXJzICov Cj4gPiArI2RlZmluZSBNQUxJRFBfQURfRU4gICAgICAgICAgICAgICAgICAgIEJJVCgwKQo+ID4g KyNkZWZpbmUgTUFMSURQX0FEX1lUUiAgICAgICAgICAgICAgICAgICBCSVQoNCkKPiA+ICsjZGVm aW5lIE1BTElEUF9BRF9CUyAgICAgICAgICAgICAgICAgICAgQklUKDgpCj4gPiArI2RlZmluZSBN QUxJRFBfQURfQ1JPUF9SSUdIVF9PRkZTRVQgICAgIDE2Cj4gPiArI2RlZmluZSBNQUxJRFBfQURf Q1JPUF9CT1RUT01fT0ZGU0VUICAgIDE2Cj4gPiArCj4gPiAgLyoKPiA+ICAgKiBTdGFydGluZyB3 aXRoIERQNTUwIHRoZSByZWdpc3RlciBtYXAgYmxvY2tzIGhhcyBiZWVuIHN0YW5kYXJkaXNlZCB0 byB0aGUKPiA+ICAgKiBmb2xsb3dpbmcgbGF5b3V0Ogo+ID4gLS0gCj4gPiAyLjcuNAo+ID4gCj4g Cj4gQmVzdCByZWdhcmRzLAo+IExpdml1Cj4gCj4gCj4gLS0gCj4gPT09PT09PT09PT09PT09PT09 PT0KPiB8IEkgd291bGQgbGlrZSB0byB8Cj4gfCBmaXggdGhlIHdvcmxkLCAgfAo+IHwgYnV0IHRo ZXkncmUgbm90IHwKPiB8IGdpdmluZyBtZSB0aGUgICB8Cj4gIFwgc291cmNlIGNvZGUhICAvCj4g ICAtLS0tLS0tLS0tLS0tLS0KPiAgICAgPz9cXyg/Pz8pXy8/Pwo+IF9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4gZHJpLWRldmVsIG1haWxpbmcgbGlzdAo+ IGRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKPiBodHRwczovL2xpc3RzLmZyZWVkZXNr dG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbApfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZl bEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9kcmktZGV2ZWwK