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=-8.0 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_PASS,URIBL_BLOCKED,USER_AGENT_NEOMUTT 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 C7C3AC43381 for ; Thu, 21 Feb 2019 12:19:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7AA262084D for ; Thu, 21 Feb 2019 12:19:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=armh.onmicrosoft.com header.i=@armh.onmicrosoft.com header.b="hq9GJY4l" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727113AbfBUMTT (ORCPT ); Thu, 21 Feb 2019 07:19:19 -0500 Received: from mail-eopbgr10049.outbound.protection.outlook.com ([40.107.1.49]:29328 "EHLO EUR02-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725385AbfBUMTT (ORCPT ); Thu, 21 Feb 2019 07:19:19 -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=0bVYXM/e3Fdj5N+dmVCh1lTofObp731ZzWAQiwcdXSM=; b=hq9GJY4lJSEvs9jkBRcWW6iWppGheyDiaYkSGpLua+lzztek3fcSFuK5Ynt5BZZy0R+PmQ4WRBSSBD9OuiC2E3NDB2wWnivhIwvpHz6ta8SShw6IJ36li7TjujasvnGL14fG7dx+e9g4hyjf8RoaBMdISzYskd98IBJh0VY4S78= Received: from AM0PR08MB3025.eurprd08.prod.outlook.com (52.134.93.10) by AM0PR08MB3188.eurprd08.prod.outlook.com (52.134.94.18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1643.15; Thu, 21 Feb 2019 12:19:13 +0000 Received: from AM0PR08MB3025.eurprd08.prod.outlook.com ([fe80::7e:6dfb:116b:befd]) by AM0PR08MB3025.eurprd08.prod.outlook.com ([fe80::7e:6dfb:116b:befd%2]) with mapi id 15.20.1643.016; Thu, 21 Feb 2019 12:19:13 +0000 From: Brian Starkey To: Laurent Pinchart CC: Laurent Pinchart , Liviu Dudau , nd , Kieran Bingham , "dri-devel@lists.freedesktop.org" , "linux-media@vger.kernel.org" Subject: Re: [PATCH v4 0/7] VSP1: Display writeback support Thread-Topic: [PATCH v4 0/7] VSP1: Display writeback support Thread-Index: AQHUx4SuF0wk/rt+2UuytgV1PyNhIaXp7lqAgAAYUYCAAAOIgIAAJhOA Date: Thu, 21 Feb 2019 12:19:13 +0000 Message-ID: <20190221121913.l7e5zlitcfpvkupi@DESKTOP-E1NTVVP.localdomain> References: <20190217024852.23328-1-laurent.pinchart+renesas@ideasonboard.com> <20190218122257.o5blxfs7jo5xu7ge@DESKTOP-E1NTVVP.localdomain> <20190221082317.GB3451@pendragon.ideasonboard.com> <20190221095019.rht64aylk52jqe5r@DESKTOP-E1NTVVP.localdomain> <20190221100257.GD3451@pendragon.ideasonboard.com> In-Reply-To: <20190221100257.GD3451@pendragon.ideasonboard.com> Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: NeoMutt/20180716-849-147d51-dirty x-originating-ip: [217.140.106.51] x-clientproxiedby: LO2P265CA0264.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:8a::36) To AM0PR08MB3025.eurprd08.prod.outlook.com (2603:10a6:208:5c::10) x-ms-exchange-messagesentrepresentingtype: 1 x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 001bbe95-a64d-411e-d3b2-08d697f6ca20 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(5600110)(711020)(4605104)(4618075)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020);SRVR:AM0PR08MB3188; x-ms-traffictypediagnostic: AM0PR08MB3188: x-ms-exchange-purlcount: 2 nodisclaimer: True x-microsoft-exchange-diagnostics: 1;AM0PR08MB3188;20:B3H/1nxlPDhYrMN1UfRZSHfcRKAyw3pFg8Ik5XpduRyESO3n7yzPThlDdd1hL+tHcsgAqH2Ld/igVZb6/HyALy10ZYB//YJZsA8COe5SnB8upX1fEdGk7i6H3k4o9ztHrJNQIMH5+P9yq5qNMxNvvT0npJAX3wtWDIxWxC/EdY8= x-microsoft-antispam-prvs: x-forefront-prvs: 09555FB1AD x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(136003)(346002)(39860400002)(366004)(376002)(396003)(55674003)(199004)(189003)(66066001)(476003)(186003)(7736002)(26005)(14454004)(305945005)(11346002)(446003)(81156014)(8676002)(81166006)(2906002)(256004)(14444005)(486006)(44832011)(6916009)(86362001)(105586002)(106356001)(6306002)(9686003)(229853002)(6486002)(6512007)(6436002)(8936002)(102836004)(71190400001)(53936002)(1076003)(68736007)(54906003)(71200400001)(4326008)(6246003)(6116002)(33896004)(3846002)(5660300002)(6346003)(25786009)(58126008)(76176011)(72206003)(52116002)(6506007)(386003)(478600001)(966005)(99286004)(316002)(97736004)(93886005);DIR:OUT;SFP:1101;SCL:1;SRVR:AM0PR08MB3188;H:AM0PR08MB3025.eurprd08.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;A:1;MX:1; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Brian.Starkey@arm.com; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: GPHmTIyUqpdb/qnXWRwvyk1xnwUaZDgiZ/hjh3A2UnZToMMfiy8B5oS4ObBmUP4JNv0ZbUxvJgaeKUqVpE22fvf0qpcodwacS7GUxHzn94bGiRwOIvJrtWlXTrCnZu7TsBT6gHJcIf8SJ63y3ITdRHYS6ooW7BcepRKhkCEUl3G8c6VT5RlJHnco7xy4/4D3/hcMvAqwCghwdo7ppE9n1os9cjmFKf0n/Nr0kuPFzIgGKRNTur61B3mXeqPQX5n7rV10nqkYVcPEE8B7WFYMHhi39kExGnlwwAvwBGdXHBCHVfrSB/H2GVUUb1dqLUnFx17vXopv0rJeV/kL0eSiFzZcd6IqWdoWTtWo+JwaQNv/HjSLr9CIIzdb/z8tp2QkOs3k5HgDf+a31nI+z0jlvBuaRoMuOBTAFUytlD3RYjw= Content-Type: text/plain; charset="us-ascii" Content-ID: <673D4A59BBC8364FA22CF6EDEC36FCCC@eurprd08.prod.outlook.com> Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-Network-Message-Id: 001bbe95-a64d-411e-d3b2-08d697f6ca20 X-MS-Exchange-CrossTenant-originalarrivaltime: 21 Feb 2019 12:19:12.6860 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR08MB3188 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org Hi Laurent, On Thu, Feb 21, 2019 at 12:02:57PM +0200, Laurent Pinchart wrote: > Hi Brian, >=20 > On Thu, Feb 21, 2019 at 09:50:19AM +0000, Brian Starkey wrote: > > On Thu, Feb 21, 2019 at 10:23:17AM +0200, Laurent Pinchart wrote: > > > On Mon, Feb 18, 2019 at 12:22:58PM +0000, Brian Starkey wrote: > > >> On Sun, Feb 17, 2019 at 04:48:45AM +0200, Laurent Pinchart wrote: > > >>> Hello, > > >>>=20 > > >>> This patch series implements display writeback support for the R-Ca= r > > >>> Gen3 platforms in the VSP1 driver. > > >>>=20 > > >>> DRM/KMS provides a writeback API through a special type of writebac= k > > >>> connectors. This series takes a different approach by exposing writ= eback > > >>> as a V4L2 device. While there is nothing fundamentally wrong with > > >>> writeback connectors, display for R-Car Gen3 platforms relies on th= e > > >>> VSP1 driver behind the scene, which already implements V4L2 support= . > > >>> Enabling writeback through V4L2 is thus significantly easier in thi= s > > >>> case. > > >>=20 > > >> How does this look to an application? (I'm entirely ignorant about > > >> R-Car). They are interacting with the DRM device, and then need to > > >> open and configure a v4l2 device to get the writeback? Can the proce= ss > > >> which isn't controlling the DRM device independently capture the > > >> screen output? > > >>=20 > > >> I didn't see any major complication to implementing this as a > > >> writeback connector. If you want/need to use the vb2_queue, couldn't > > >> you just do that entirely from within the kernel? > > >>=20 > > >> Honestly (predictably?), to me it seems like a bad idea to introduce= a > > >> second, non-compatible interface for display writeback. Any > > >> application interested in display writeback (e.g. compositors) will > > >> need to implement both in order to support all HW. drm_hwcomposer > > >> already supports writeback via DRM writeback connectors. > > >>=20 > > >> While I can see the advantages of having writeback exposed via v4l2 > > >> for streaming use-cases, I think it would be better to have it done = in > > >> such a way that it works for all writeback connectors, rather than > > >> being VSP1-specific. That would allow any application to choose > > >> whichever method is most appropriate for their use-case, without > > >> limiting themselves to a subset of hardware. > > >=20 > > > So I gave writeback connectors a go, and it wasn't very pretty. > >=20 > > Sorry you didn't have a good time :-( >=20 > No worries. That was to be expected with such young code :-) >=20 > > > There writeback support in the DRM core leaks jobs, > >=20 > > Is this the cleanup on check fail, or something else? >=20 > Yes, that's the problem. I have patches for it that I will post soon. >=20 > > One possible pitfall is that you must set the job in the connector > > state to NULL after you call drm_writeback_queue_job(). The API there > > could easily be changed to pass in the connector_state and clear it in > > drm_writeback_queue_job() instead of relying on drivers to do it. >=20 > I also have a patch for that :-) >=20 > > > and is missing support for > > > the equivalent of .prepare_fb()/.cleanup_fb(), which requires per-job > > > driver-specific data. I'm working on these issues and will submit > > > patches. > >=20 > > Hm, yes that didn't occur to me; we don't have a prepare_fb callback. > >=20 > > > In the meantime, I need to test my implementation, so I need a comman= d > > > line application that will let me exercise the API. I assume you've > > > tested your code, haven't you ? :-) Could you tell me how I can test > > > writeback ? > >=20 > > Indeed, there's igts on the list which I wrote and tested: > >=20 > > https://patchwork.kernel.org/patch/10764975/ >=20 > Will you get these merged ? Pushing everybody to use the writeback > connector API without any test is mainline isn't nice, it almost makes > me want to go back to V4L2. I wasn't trying to be pushy - I only shared my opinion that I didn't think it was a good idea to introduce a second display writeback API, when we already have one. You're entirely entitled to ignore my opinion. The tests have been available since the very early versions of the writeback series. I don't know what's blocking them from merging, I haven't been tracking it very closely. If you'd be happy to provide your review and test on them, that may help the process along? >=20 > igt test cases are nice to have, but what I need now is a tool to > execise the API manually, similar to modetest, with command line > parameters to configure the device, and the ability to capture frames to > disk using writeback. How did you perform such tests when you developed > writeback support ? >=20 I used a pre-existing internal tool which does exactly that. I appreciate that we don't have upstream tooling for writeback. As you say, it's a young API (well, not by date, but certainly by usage). I also do appreciate you taking the time to consider it, identifying issues which we did not, and for fixing them. The only way it stops being a young API, with bugs and no tooling, is if people adopt it. Thanks, -Brian > > And there's support in drm_hwcomposer (though I must admit I haven't > > personally run the drm_hwc code): > >=20 > > https://gitlab.freedesktop.org/drm-hwcomposer/drm-hwcomposer/merge_requ= ests/3 >=20 > That won't help me much as I don't have an android port for the R-Car > boards. >=20 > > I'm afraid I haven't really touched any of the writeback code for a > > couple of years - Liviu picked that up. He's on holiday until Monday, > > but he should be able to help with the status of the igts. > >=20 > > Hope that helps, > >=20 > > >>> The writeback pixel format is restricted to RGB, due to the VSP1 > > >>> outputting RGB to the display and lacking a separate colour space > > >>> conversion unit for writeback. The resolution can be freely picked = by > > >>> will result in cropping or composing, not scaling. > > >>>=20 > > >>> Writeback requests are queued to the hardware on page flip (atomic > > >>> flush), and complete at the next vblank. This means that a queued > > >>> writeback buffer will not be processed until the next page flip, bu= t > > >>> once it starts being written to by the VSP, it will complete at the= next > > >>> vblank regardless of whether another page flip occurs at that time. > > >>=20 > > >> This sounds the same as mali-dp, and so fits directly with the > > >> semantics of writeback connectors. > > >>=20 > > >>> The code is based on a merge of the media master branch, the drm-ne= xt > > >>> branch and the R-Car DT next branch. For convenience patches can be > > >>> found at > > >>>=20 > > >>> git://linuxtv.org/pinchartl/media.git v4l2/vsp1/writeback > > >>>=20 > > >>> Kieran Bingham (2): > > >>> Revert "[media] v4l: vsp1: Supply frames to the DU continuously" > > >>> media: vsp1: Provide a writeback video device > > >>>=20 > > >>> Laurent Pinchart (5): > > >>> media: vsp1: wpf: Fix partition configuration for display pipelin= es > > >>> media: vsp1: Replace leftover occurrence of fragment with body > > >>> media: vsp1: Fix addresses of display-related registers for VSP-D= L > > >>> media: vsp1: Refactor vsp1_video_complete_buffer() for later reus= e > > >>> media: vsp1: Replace the display list internal flag with a flags = field > > >>>=20 > > >>> drivers/media/platform/vsp1/vsp1_dl.c | 118 ++++++++++++-- > > >>> drivers/media/platform/vsp1/vsp1_dl.h | 6 +- > > >>> drivers/media/platform/vsp1/vsp1_drm.c | 24 ++- > > >>> drivers/media/platform/vsp1/vsp1_drv.c | 17 +- > > >>> drivers/media/platform/vsp1/vsp1_pipe.c | 5 + > > >>> drivers/media/platform/vsp1/vsp1_pipe.h | 6 + > > >>> drivers/media/platform/vsp1/vsp1_regs.h | 6 +- > > >>> drivers/media/platform/vsp1/vsp1_rwpf.h | 2 + > > >>> drivers/media/platform/vsp1/vsp1_video.c | 198 +++++++++++++++++++= ---- > > >>> drivers/media/platform/vsp1/vsp1_video.h | 6 + > > >>> drivers/media/platform/vsp1/vsp1_wpf.c | 65 ++++++-- > > >>> 11 files changed, 378 insertions(+), 75 deletions(-) >=20 > --=20 > Regards, >=20 > Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Brian Starkey Subject: Re: [PATCH v4 0/7] VSP1: Display writeback support Date: Thu, 21 Feb 2019 12:19:13 +0000 Message-ID: <20190221121913.l7e5zlitcfpvkupi@DESKTOP-E1NTVVP.localdomain> References: <20190217024852.23328-1-laurent.pinchart+renesas@ideasonboard.com> <20190218122257.o5blxfs7jo5xu7ge@DESKTOP-E1NTVVP.localdomain> <20190221082317.GB3451@pendragon.ideasonboard.com> <20190221095019.rht64aylk52jqe5r@DESKTOP-E1NTVVP.localdomain> <20190221100257.GD3451@pendragon.ideasonboard.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from EUR02-HE1-obe.outbound.protection.outlook.com (mail-eopbgr10076.outbound.protection.outlook.com [40.107.1.76]) by gabe.freedesktop.org (Postfix) with ESMTPS id 81ADF89518 for ; Thu, 21 Feb 2019 12:19:16 +0000 (UTC) In-Reply-To: <20190221100257.GD3451@pendragon.ideasonboard.com> Content-Language: en-US Content-ID: <673D4A59BBC8364FA22CF6EDEC36FCCC@eurprd08.prod.outlook.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Laurent Pinchart Cc: Laurent Pinchart , Liviu Dudau , Kieran Bingham , "dri-devel@lists.freedesktop.org" , nd , "linux-media@vger.kernel.org" List-Id: dri-devel@lists.freedesktop.org SGkgTGF1cmVudCwKCk9uIFRodSwgRmViIDIxLCAyMDE5IGF0IDEyOjAyOjU3UE0gKzAyMDAsIExh dXJlbnQgUGluY2hhcnQgd3JvdGU6Cj4gSGkgQnJpYW4sCj4gCj4gT24gVGh1LCBGZWIgMjEsIDIw MTkgYXQgMDk6NTA6MTlBTSArMDAwMCwgQnJpYW4gU3RhcmtleSB3cm90ZToKPiA+IE9uIFRodSwg RmViIDIxLCAyMDE5IGF0IDEwOjIzOjE3QU0gKzAyMDAsIExhdXJlbnQgUGluY2hhcnQgd3JvdGU6 Cj4gPiA+IE9uIE1vbiwgRmViIDE4LCAyMDE5IGF0IDEyOjIyOjU4UE0gKzAwMDAsIEJyaWFuIFN0 YXJrZXkgd3JvdGU6Cj4gPiA+PiBPbiBTdW4sIEZlYiAxNywgMjAxOSBhdCAwNDo0ODo0NUFNICsw MjAwLCBMYXVyZW50IFBpbmNoYXJ0IHdyb3RlOgo+ID4gPj4+IEhlbGxvLAo+ID4gPj4+IAo+ID4g Pj4+IFRoaXMgcGF0Y2ggc2VyaWVzIGltcGxlbWVudHMgZGlzcGxheSB3cml0ZWJhY2sgc3VwcG9y dCBmb3IgdGhlIFItQ2FyCj4gPiA+Pj4gR2VuMyBwbGF0Zm9ybXMgaW4gdGhlIFZTUDEgZHJpdmVy Lgo+ID4gPj4+IAo+ID4gPj4+IERSTS9LTVMgcHJvdmlkZXMgYSB3cml0ZWJhY2sgQVBJIHRocm91 Z2ggYSBzcGVjaWFsIHR5cGUgb2Ygd3JpdGViYWNrCj4gPiA+Pj4gY29ubmVjdG9ycy4gVGhpcyBz ZXJpZXMgdGFrZXMgYSBkaWZmZXJlbnQgYXBwcm9hY2ggYnkgZXhwb3Npbmcgd3JpdGViYWNrCj4g PiA+Pj4gYXMgYSBWNEwyIGRldmljZS4gV2hpbGUgdGhlcmUgaXMgbm90aGluZyBmdW5kYW1lbnRh bGx5IHdyb25nIHdpdGgKPiA+ID4+PiB3cml0ZWJhY2sgY29ubmVjdG9ycywgZGlzcGxheSBmb3Ig Ui1DYXIgR2VuMyBwbGF0Zm9ybXMgcmVsaWVzIG9uIHRoZQo+ID4gPj4+IFZTUDEgZHJpdmVyIGJl aGluZCB0aGUgc2NlbmUsIHdoaWNoIGFscmVhZHkgaW1wbGVtZW50cyBWNEwyIHN1cHBvcnQuCj4g PiA+Pj4gRW5hYmxpbmcgd3JpdGViYWNrIHRocm91Z2ggVjRMMiBpcyB0aHVzIHNpZ25pZmljYW50 bHkgZWFzaWVyIGluIHRoaXMKPiA+ID4+PiBjYXNlLgo+ID4gPj4gCj4gPiA+PiBIb3cgZG9lcyB0 aGlzIGxvb2sgdG8gYW4gYXBwbGljYXRpb24/IChJJ20gZW50aXJlbHkgaWdub3JhbnQgYWJvdXQK PiA+ID4+IFItQ2FyKS4gVGhleSBhcmUgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgRFJNIGRldmljZSwg YW5kIHRoZW4gbmVlZCB0bwo+ID4gPj4gb3BlbiBhbmQgY29uZmlndXJlIGEgdjRsMiBkZXZpY2Ug dG8gZ2V0IHRoZSB3cml0ZWJhY2s/IENhbiB0aGUgcHJvY2Vzcwo+ID4gPj4gd2hpY2ggaXNuJ3Qg Y29udHJvbGxpbmcgdGhlIERSTSBkZXZpY2UgaW5kZXBlbmRlbnRseSBjYXB0dXJlIHRoZQo+ID4g Pj4gc2NyZWVuIG91dHB1dD8KPiA+ID4+IAo+ID4gPj4gSSBkaWRuJ3Qgc2VlIGFueSBtYWpvciBj b21wbGljYXRpb24gdG8gaW1wbGVtZW50aW5nIHRoaXMgYXMgYQo+ID4gPj4gd3JpdGViYWNrIGNv bm5lY3Rvci4gSWYgeW91IHdhbnQvbmVlZCB0byB1c2UgdGhlIHZiMl9xdWV1ZSwgY291bGRuJ3QK PiA+ID4+IHlvdSBqdXN0IGRvIHRoYXQgZW50aXJlbHkgZnJvbSB3aXRoaW4gdGhlIGtlcm5lbD8K PiA+ID4+IAo+ID4gPj4gSG9uZXN0bHkgKHByZWRpY3RhYmx5PyksIHRvIG1lIGl0IHNlZW1zIGxp a2UgYSBiYWQgaWRlYSB0byBpbnRyb2R1Y2UgYQo+ID4gPj4gc2Vjb25kLCBub24tY29tcGF0aWJs ZSBpbnRlcmZhY2UgZm9yIGRpc3BsYXkgd3JpdGViYWNrLiBBbnkKPiA+ID4+IGFwcGxpY2F0aW9u IGludGVyZXN0ZWQgaW4gZGlzcGxheSB3cml0ZWJhY2sgKGUuZy4gY29tcG9zaXRvcnMpIHdpbGwK PiA+ID4+IG5lZWQgdG8gaW1wbGVtZW50IGJvdGggaW4gb3JkZXIgdG8gc3VwcG9ydCBhbGwgSFcu IGRybV9od2NvbXBvc2VyCj4gPiA+PiBhbHJlYWR5IHN1cHBvcnRzIHdyaXRlYmFjayB2aWEgRFJN IHdyaXRlYmFjayBjb25uZWN0b3JzLgo+ID4gPj4gCj4gPiA+PiBXaGlsZSBJIGNhbiBzZWUgdGhl IGFkdmFudGFnZXMgb2YgaGF2aW5nIHdyaXRlYmFjayBleHBvc2VkIHZpYSB2NGwyCj4gPiA+PiBm b3Igc3RyZWFtaW5nIHVzZS1jYXNlcywgSSB0aGluayBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2 ZSBpdCBkb25lIGluCj4gPiA+PiBzdWNoIGEgd2F5IHRoYXQgaXQgd29ya3MgZm9yIGFsbCB3cml0 ZWJhY2sgY29ubmVjdG9ycywgcmF0aGVyIHRoYW4KPiA+ID4+IGJlaW5nIFZTUDEtc3BlY2lmaWMu IFRoYXQgd291bGQgYWxsb3cgYW55IGFwcGxpY2F0aW9uIHRvIGNob29zZQo+ID4gPj4gd2hpY2hl dmVyIG1ldGhvZCBpcyBtb3N0IGFwcHJvcHJpYXRlIGZvciB0aGVpciB1c2UtY2FzZSwgd2l0aG91 dAo+ID4gPj4gbGltaXRpbmcgdGhlbXNlbHZlcyB0byBhIHN1YnNldCBvZiBoYXJkd2FyZS4KPiA+ ID4gCj4gPiA+IFNvIEkgZ2F2ZSB3cml0ZWJhY2sgY29ubmVjdG9ycyBhIGdvLCBhbmQgaXQgd2Fz bid0IHZlcnkgcHJldHR5Lgo+ID4gCj4gPiBTb3JyeSB5b3UgZGlkbid0IGhhdmUgYSBnb29kIHRp bWUgOi0oCj4gCj4gTm8gd29ycmllcy4gVGhhdCB3YXMgdG8gYmUgZXhwZWN0ZWQgd2l0aCBzdWNo IHlvdW5nIGNvZGUgOi0pCj4gCj4gPiA+IFRoZXJlIHdyaXRlYmFjayBzdXBwb3J0IGluIHRoZSBE Uk0gY29yZSBsZWFrcyBqb2JzLAo+ID4gCj4gPiBJcyB0aGlzIHRoZSBjbGVhbnVwIG9uIGNoZWNr IGZhaWwsIG9yIHNvbWV0aGluZyBlbHNlPwo+IAo+IFllcywgdGhhdCdzIHRoZSBwcm9ibGVtLiBJ IGhhdmUgcGF0Y2hlcyBmb3IgaXQgdGhhdCBJIHdpbGwgcG9zdCBzb29uLgo+IAo+ID4gT25lIHBv c3NpYmxlIHBpdGZhbGwgaXMgdGhhdCB5b3UgbXVzdCBzZXQgdGhlIGpvYiBpbiB0aGUgY29ubmVj dG9yCj4gPiBzdGF0ZSB0byBOVUxMIGFmdGVyIHlvdSBjYWxsIGRybV93cml0ZWJhY2tfcXVldWVf am9iKCkuIFRoZSBBUEkgdGhlcmUKPiA+IGNvdWxkIGVhc2lseSBiZSBjaGFuZ2VkIHRvIHBhc3Mg aW4gdGhlIGNvbm5lY3Rvcl9zdGF0ZSBhbmQgY2xlYXIgaXQgaW4KPiA+IGRybV93cml0ZWJhY2tf cXVldWVfam9iKCkgaW5zdGVhZCBvZiByZWx5aW5nIG9uIGRyaXZlcnMgdG8gZG8gaXQuCj4gCj4g SSBhbHNvIGhhdmUgYSBwYXRjaCBmb3IgdGhhdCA6LSkKPiAKPiA+ID4gYW5kIGlzIG1pc3Npbmcg c3VwcG9ydCBmb3IKPiA+ID4gdGhlIGVxdWl2YWxlbnQgb2YgLnByZXBhcmVfZmIoKS8uY2xlYW51 cF9mYigpLCB3aGljaCByZXF1aXJlcyBwZXItam9iCj4gPiA+IGRyaXZlci1zcGVjaWZpYyBkYXRh LiBJJ20gd29ya2luZyBvbiB0aGVzZSBpc3N1ZXMgYW5kIHdpbGwgc3VibWl0Cj4gPiA+IHBhdGNo ZXMuCj4gPiAKPiA+IEhtLCB5ZXMgdGhhdCBkaWRuJ3Qgb2NjdXIgdG8gbWU7IHdlIGRvbid0IGhh dmUgYSBwcmVwYXJlX2ZiIGNhbGxiYWNrLgo+ID4gCj4gPiA+IEluIHRoZSBtZWFudGltZSwgSSBu ZWVkIHRvIHRlc3QgbXkgaW1wbGVtZW50YXRpb24sIHNvIEkgbmVlZCBhIGNvbW1hbmQKPiA+ID4g bGluZSBhcHBsaWNhdGlvbiB0aGF0IHdpbGwgbGV0IG1lIGV4ZXJjaXNlIHRoZSBBUEkuIEkgYXNz dW1lIHlvdSd2ZQo+ID4gPiB0ZXN0ZWQgeW91ciBjb2RlLCBoYXZlbid0IHlvdSA/IDotKSBDb3Vs ZCB5b3UgdGVsbCBtZSBob3cgSSBjYW4gdGVzdAo+ID4gPiB3cml0ZWJhY2sgPwo+ID4gCj4gPiBJ bmRlZWQsIHRoZXJlJ3MgaWd0cyBvbiB0aGUgbGlzdCB3aGljaCBJIHdyb3RlIGFuZCB0ZXN0ZWQ6 Cj4gPiAKPiA+IGh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5vcmcvcGF0Y2gvMTA3NjQ5NzUvCj4g Cj4gV2lsbCB5b3UgZ2V0IHRoZXNlIG1lcmdlZCA/IFB1c2hpbmcgZXZlcnlib2R5IHRvIHVzZSB0 aGUgd3JpdGViYWNrCj4gY29ubmVjdG9yIEFQSSB3aXRob3V0IGFueSB0ZXN0IGlzIG1haW5saW5l IGlzbid0IG5pY2UsIGl0IGFsbW9zdCBtYWtlcwo+IG1lIHdhbnQgdG8gZ28gYmFjayB0byBWNEwy LgoKSSB3YXNuJ3QgdHJ5aW5nIHRvIGJlIHB1c2h5IC0gSSBvbmx5IHNoYXJlZCBteSBvcGluaW9u IHRoYXQgSSBkaWRuJ3QKdGhpbmsgaXQgd2FzIGEgZ29vZCBpZGVhIHRvIGludHJvZHVjZSBhIHNl Y29uZCBkaXNwbGF5IHdyaXRlYmFjayBBUEksCndoZW4gd2UgYWxyZWFkeSBoYXZlIG9uZS4gWW91 J3JlIGVudGlyZWx5IGVudGl0bGVkIHRvIGlnbm9yZSBteQpvcGluaW9uLgoKVGhlIHRlc3RzIGhh dmUgYmVlbiBhdmFpbGFibGUgc2luY2UgdGhlIHZlcnkgZWFybHkgdmVyc2lvbnMgb2YgdGhlCndy aXRlYmFjayBzZXJpZXMuIEkgZG9uJ3Qga25vdyB3aGF0J3MgYmxvY2tpbmcgdGhlbSBmcm9tIG1l cmdpbmcsIEkKaGF2ZW4ndCBiZWVuIHRyYWNraW5nIGl0IHZlcnkgY2xvc2VseS4KCklmIHlvdSdk IGJlIGhhcHB5IHRvIHByb3ZpZGUgeW91ciByZXZpZXcgYW5kIHRlc3Qgb24gdGhlbSwgdGhhdCBt YXkKaGVscCB0aGUgcHJvY2VzcyBhbG9uZz8KCj4gCj4gaWd0IHRlc3QgY2FzZXMgYXJlIG5pY2Ug dG8gaGF2ZSwgYnV0IHdoYXQgSSBuZWVkIG5vdyBpcyBhIHRvb2wgdG8KPiBleGVjaXNlIHRoZSBB UEkgbWFudWFsbHksIHNpbWlsYXIgdG8gbW9kZXRlc3QsIHdpdGggY29tbWFuZCBsaW5lCj4gcGFy YW1ldGVycyB0byBjb25maWd1cmUgdGhlIGRldmljZSwgYW5kIHRoZSBhYmlsaXR5IHRvIGNhcHR1 cmUgZnJhbWVzIHRvCj4gZGlzayB1c2luZyB3cml0ZWJhY2suIEhvdyBkaWQgeW91IHBlcmZvcm0g c3VjaCB0ZXN0cyB3aGVuIHlvdSBkZXZlbG9wZWQKPiB3cml0ZWJhY2sgc3VwcG9ydCA/Cj4gCgpJ IHVzZWQgYSBwcmUtZXhpc3RpbmcgaW50ZXJuYWwgdG9vbCB3aGljaCBkb2VzIGV4YWN0bHkgdGhh dC4KCkkgYXBwcmVjaWF0ZSB0aGF0IHdlIGRvbid0IGhhdmUgdXBzdHJlYW0gdG9vbGluZyBmb3Ig d3JpdGViYWNrLiBBcyB5b3UKc2F5LCBpdCdzIGEgeW91bmcgQVBJICh3ZWxsLCBub3QgYnkgZGF0 ZSwgYnV0IGNlcnRhaW5seSBieSB1c2FnZSkuCgpJIGFsc28gZG8gYXBwcmVjaWF0ZSB5b3UgdGFr aW5nIHRoZSB0aW1lIHRvIGNvbnNpZGVyIGl0LCBpZGVudGlmeWluZwppc3N1ZXMgd2hpY2ggd2Ug ZGlkIG5vdCwgYW5kIGZvciBmaXhpbmcgdGhlbS4gVGhlIG9ubHkgd2F5IGl0IHN0b3BzCmJlaW5n IGEgeW91bmcgQVBJLCB3aXRoIGJ1Z3MgYW5kIG5vIHRvb2xpbmcsIGlzIGlmIHBlb3BsZSBhZG9w dCBpdC4KClRoYW5rcywKLUJyaWFuCgo+ID4gQW5kIHRoZXJlJ3Mgc3VwcG9ydCBpbiBkcm1faHdj b21wb3NlciAodGhvdWdoIEkgbXVzdCBhZG1pdCBJIGhhdmVuJ3QKPiA+IHBlcnNvbmFsbHkgcnVu IHRoZSBkcm1faHdjIGNvZGUpOgo+ID4gCj4gPiBodHRwczovL2dpdGxhYi5mcmVlZGVza3RvcC5v cmcvZHJtLWh3Y29tcG9zZXIvZHJtLWh3Y29tcG9zZXIvbWVyZ2VfcmVxdWVzdHMvMwo+IAo+IFRo YXQgd29uJ3QgaGVscCBtZSBtdWNoIGFzIEkgZG9uJ3QgaGF2ZSBhbiBhbmRyb2lkIHBvcnQgZm9y IHRoZSBSLUNhcgo+IGJvYXJkcy4KPiAKPiA+IEknbSBhZnJhaWQgSSBoYXZlbid0IHJlYWxseSB0 b3VjaGVkIGFueSBvZiB0aGUgd3JpdGViYWNrIGNvZGUgZm9yIGEKPiA+IGNvdXBsZSBvZiB5ZWFy cyAtIExpdml1IHBpY2tlZCB0aGF0IHVwLiBIZSdzIG9uIGhvbGlkYXkgdW50aWwgTW9uZGF5LAo+ ID4gYnV0IGhlIHNob3VsZCBiZSBhYmxlIHRvIGhlbHAgd2l0aCB0aGUgc3RhdHVzIG9mIHRoZSBp Z3RzLgo+ID4gCj4gPiBIb3BlIHRoYXQgaGVscHMsCj4gPiAKPiA+ID4+PiBUaGUgd3JpdGViYWNr IHBpeGVsIGZvcm1hdCBpcyByZXN0cmljdGVkIHRvIFJHQiwgZHVlIHRvIHRoZSBWU1AxCj4gPiA+ Pj4gb3V0cHV0dGluZyBSR0IgdG8gdGhlIGRpc3BsYXkgYW5kIGxhY2tpbmcgYSBzZXBhcmF0ZSBj b2xvdXIgc3BhY2UKPiA+ID4+PiBjb252ZXJzaW9uIHVuaXQgZm9yIHdyaXRlYmFjay4gVGhlIHJl c29sdXRpb24gY2FuIGJlIGZyZWVseSBwaWNrZWQgYnkKPiA+ID4+PiB3aWxsIHJlc3VsdCBpbiBj cm9wcGluZyBvciBjb21wb3NpbmcsIG5vdCBzY2FsaW5nLgo+ID4gPj4+IAo+ID4gPj4+IFdyaXRl YmFjayByZXF1ZXN0cyBhcmUgcXVldWVkIHRvIHRoZSBoYXJkd2FyZSBvbiBwYWdlIGZsaXAgKGF0 b21pYwo+ID4gPj4+IGZsdXNoKSwgYW5kIGNvbXBsZXRlIGF0IHRoZSBuZXh0IHZibGFuay4gVGhp cyBtZWFucyB0aGF0IGEgcXVldWVkCj4gPiA+Pj4gd3JpdGViYWNrIGJ1ZmZlciB3aWxsIG5vdCBi ZSBwcm9jZXNzZWQgdW50aWwgdGhlIG5leHQgcGFnZSBmbGlwLCBidXQKPiA+ID4+PiBvbmNlIGl0 IHN0YXJ0cyBiZWluZyB3cml0dGVuIHRvIGJ5IHRoZSBWU1AsIGl0IHdpbGwgY29tcGxldGUgYXQg dGhlIG5leHQKPiA+ID4+PiB2YmxhbmsgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFub3RoZXIgcGFn ZSBmbGlwIG9jY3VycyBhdCB0aGF0IHRpbWUuCj4gPiA+PiAKPiA+ID4+IFRoaXMgc291bmRzIHRo ZSBzYW1lIGFzIG1hbGktZHAsIGFuZCBzbyBmaXRzIGRpcmVjdGx5IHdpdGggdGhlCj4gPiA+PiBz ZW1hbnRpY3Mgb2Ygd3JpdGViYWNrIGNvbm5lY3RvcnMuCj4gPiA+PiAKPiA+ID4+PiBUaGUgY29k ZSBpcyBiYXNlZCBvbiBhIG1lcmdlIG9mIHRoZSBtZWRpYSBtYXN0ZXIgYnJhbmNoLCB0aGUgZHJt LW5leHQKPiA+ID4+PiBicmFuY2ggYW5kIHRoZSBSLUNhciBEVCBuZXh0IGJyYW5jaC4gRm9yIGNv bnZlbmllbmNlIHBhdGNoZXMgY2FuIGJlCj4gPiA+Pj4gZm91bmQgYXQKPiA+ID4+PiAKPiA+ID4+ PiAJZ2l0Oi8vbGludXh0di5vcmcvcGluY2hhcnRsL21lZGlhLmdpdCB2NGwyL3ZzcDEvd3JpdGVi YWNrCj4gPiA+Pj4gCj4gPiA+Pj4gS2llcmFuIEJpbmdoYW0gKDIpOgo+ID4gPj4+ICAgUmV2ZXJ0 ICJbbWVkaWFdIHY0bDogdnNwMTogU3VwcGx5IGZyYW1lcyB0byB0aGUgRFUgY29udGludW91c2x5 Igo+ID4gPj4+ICAgbWVkaWE6IHZzcDE6IFByb3ZpZGUgYSB3cml0ZWJhY2sgdmlkZW8gZGV2aWNl Cj4gPiA+Pj4gCj4gPiA+Pj4gTGF1cmVudCBQaW5jaGFydCAoNSk6Cj4gPiA+Pj4gICBtZWRpYTog dnNwMTogd3BmOiBGaXggcGFydGl0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIGRpc3BsYXkgcGlwZWxp bmVzCj4gPiA+Pj4gICBtZWRpYTogdnNwMTogUmVwbGFjZSBsZWZ0b3ZlciBvY2N1cnJlbmNlIG9m IGZyYWdtZW50IHdpdGggYm9keQo+ID4gPj4+ICAgbWVkaWE6IHZzcDE6IEZpeCBhZGRyZXNzZXMg b2YgZGlzcGxheS1yZWxhdGVkIHJlZ2lzdGVycyBmb3IgVlNQLURMCj4gPiA+Pj4gICBtZWRpYTog dnNwMTogUmVmYWN0b3IgdnNwMV92aWRlb19jb21wbGV0ZV9idWZmZXIoKSBmb3IgbGF0ZXIgcmV1 c2UKPiA+ID4+PiAgIG1lZGlhOiB2c3AxOiBSZXBsYWNlIHRoZSBkaXNwbGF5IGxpc3QgaW50ZXJu YWwgZmxhZyB3aXRoIGEgZmxhZ3MgZmllbGQKPiA+ID4+PiAKPiA+ID4+PiAgZHJpdmVycy9tZWRp YS9wbGF0Zm9ybS92c3AxL3ZzcDFfZGwuYyAgICB8IDExOCArKysrKysrKysrKystLQo+ID4gPj4+ ICBkcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9kbC5oICAgIHwgICA2ICstCj4gPiA+ Pj4gIGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2RybS5jICAgfCAgMjQgKystCj4g PiA+Pj4gIGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2Rydi5jICAgfCAgMTcgKy0K PiA+ID4+PiAgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfcGlwZS5jICB8ICAgNSAr Cj4gPiA+Pj4gIGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3BpcGUuaCAgfCAgIDYg Kwo+ID4gPj4+ICBkcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9yZWdzLmggIHwgICA2 ICstCj4gPiA+Pj4gIGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3J3cGYuaCAgfCAg IDIgKwo+ID4gPj4+ICBkcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV92aWRlby5jIHwg MTk4ICsrKysrKysrKysrKysrKysrKystLS0tCj4gPiA+Pj4gIGRyaXZlcnMvbWVkaWEvcGxhdGZv cm0vdnNwMS92c3AxX3ZpZGVvLmggfCAgIDYgKwo+ID4gPj4+ICBkcml2ZXJzL21lZGlhL3BsYXRm b3JtL3ZzcDEvdnNwMV93cGYuYyAgIHwgIDY1ICsrKysrKy0tCj4gPiA+Pj4gIDExIGZpbGVzIGNo YW5nZWQsIDM3OCBpbnNlcnRpb25zKCspLCA3NSBkZWxldGlvbnMoLSkKPiAKPiAtLSAKPiBSZWdh cmRzLAo+IAo+IExhdXJlbnQgUGluY2hhcnQKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMu ZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlz dGluZm8vZHJpLWRldmVs