From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-lj1-f196.google.com ([209.85.208.196]:35012 "EHLO mail-lj1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726148AbeIJKwS (ORCPT ); Mon, 10 Sep 2018 06:52:18 -0400 Received: by mail-lj1-f196.google.com with SMTP id p10-v6so16820395ljg.2 for ; Sun, 09 Sep 2018 22:59:56 -0700 (PDT) Subject: Re: [Xen-devel][PATCH 1/1] cameraif: add ABI for para-virtual camera To: Hans Verkuil , Juergen Gross , xen-devel@lists.xenproject.org, konrad.wilk@oracle.com, boris.ostrovsky@oracle.com, mchehab@kernel.org, linux-media@vger.kernel.org, sakari.ailus@linux.intel.com, koji.matsuoka.xm@renesas.com Cc: Oleksandr Andrushchenko , Artem Mygaiev References: <20180731093142.3828-1-andr2000@gmail.com> <20180731093142.3828-2-andr2000@gmail.com> <99cd131d-85ae-bbfb-61ef-fdc0401727f6@suse.com> <5505e5af-5b64-b317-a0d8-09c11317926f@gmail.com> <345d7ec3-3ca3-e8fe-28a0-ba299196b5e4@gmail.com> <53189190-ffe0-9795-b01c-01de8db83acb@gmail.com> <641cd785-c5e7-7552-dc4b-35249f1f1985@xs4all.nl> From: Oleksandr Andrushchenko Message-ID: Date: Mon, 10 Sep 2018 08:59:53 +0300 MIME-Version: 1.0 In-Reply-To: <641cd785-c5e7-7552-dc4b-35249f1f1985@xs4all.nl> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US Sender: linux-media-owner@vger.kernel.org List-ID: Hi, Hans! On 09/09/2018 01:42 PM, Hans Verkuil wrote: > On 09/04/2018 08:56 AM, Oleksandr Andrushchenko wrote: >> On 09/03/2018 06:25 PM, Hans Verkuil wrote: >>> Hi Oleksandr, >>> >>> On 09/03/2018 12:16 PM, Oleksandr Andrushchenko wrote: >>>> On 08/21/2018 08:54 AM, Oleksandr Andrushchenko wrote: >>>>> On 08/14/2018 11:30 AM, Juergen Gross wrote: >>>>>> On 31/07/18 11:31, Oleksandr Andrushchenko wrote: >>>>>>> From: Oleksandr Andrushchenko >>>>>>> >>>>>>> This is the ABI for the two halves of a para-virtualized >>>>>>> camera driver which extends Xen's reach multimedia capabilities even >>>>>>> farther enabling it for video conferencing, In-Vehicle Infotainment, >>>>>>> high definition maps etc. >>>>>>> >>>>>>> The initial goal is to support most needed functionality with the >>>>>>> final idea to make it possible to extend the protocol if need be: >>>>>>> >>>>>>> 1. Provide means for base virtual device configuration: >>>>>>> - pixel formats >>>>>>> - resolutions >>>>>>> - frame rates >>>>>>> 2. Support basic camera controls: >>>>>>> - contrast >>>>>>> - brightness >>>>>>> - hue >>>>>>> - saturation >>>>>>> 3. Support streaming control >>>>>>> 4. Support zero-copying use-cases >>>>>>> >>>>>>> Signed-off-by: Oleksandr Andrushchenko >>>>>>> >>>>>> Some style issues below... >>>>> Will fix all the below, thank you! >>>>> >>>>> I would like to draw some attention of the Linux/V4L community to this >>>>> protocol as the plan is that once it is accepted for Xen we plan to >>>>> upstream a Linux camera front-end kernel driver which will be based >>>>> on this work and will be a V4L2 device driver (this is why I have sent >>>>> this patch not only to Xen, but to the corresponding Linux mailing list >>>>> as well) >>>> ping >>> Sorry, this got buried in my mailbox, I only came across it today. I'll try >>> to review this this week, if not, just ping me again. >> Thank you for your time >>> I had one high-level question, though: >>> >>> What types of hardware do you intend to target? This initial version targets >>> (very) simple webcams, but what about HDMI or SDTV receivers? Or hardware >>> codecs? Or complex embedded video pipelines? >>> >>> In other words, where are you planning to draw the line? >>> >>> Even with just simple cameras there is a difference between regular UVC >>> webcams and cameras used with embedded systems: for the latter you often >>> need to provide more control w.r.t. white-balancing etc., things that a >>> UVC webcam will generally do for you in the webcam's firmware. >> The use-cases we want to implement are mostly in automotive/embedded domain, >> so there are many performance restrictions apply. >> We are not targeting virtualizing very complex hardware and have no >> intention >> to make a 1:1 mapping of the real hardware: for that one can pass-through >> a real HW device to a virtual machine (VM). The goal is to share a single >> camera device to multiple virtual machines, no codecs, receivers etc. >> >> Controlling the same HW device from different VMs doesn't look feasible: >> what if the same control is set to different values from different VMs? > You can do this, actually: in V4L2 you can get an event when another process > changes a control, and update your own GUI/internal state accordingly. > > So in this case if one VM changes a control, an event is sent to all others > that the control has changed value. Well, technically this can be done by introducing one more event for such a notification. But, from system partitioning POV, I am still not convinced this should be done: I would prefer that a single VM owns such a control and even which control and which VM is decided while configuring the whole system. So, I would like to keep it as is. > >> Of course, this can be achieved if the corresponding backend can >> post-process >> original camera image with GPU, for example, thus applying different filters >> for different VMs effectively emulating camera controls. >> But this requires additional CPU/GPU power which we try to avoid. >> >> System partitioning (camera and controls assignment) is done at >> configuration >> time (remember we are in automotive/embedded world, so most of the time >> the set >> of VMs requiring cameras is known at this stage and the configuration >> remains >> static at run-time). So, when para-virtualized (PV) approach is used then we >> only implement very basic controls (those found in the protocol), so one can >> assign set of controls (all or some) to one of the VMs (main or mission >> critical >> VM or whatever) allowing that VM to adjusts those for all VMs at once. >> For other >> VMs think of it as firmware implemented adjustment. And the backend still >> controls the rest of the controls of the real HW camera you mention. >> >> Just an example of automotive use-case (we can imagine many more): >> 1. Driver Domain - owns real camera HW and runs the camera backend. >> Uses camera output for mission critical tasks, e.g. parking assistance. >> 2. In-Vehicle Infotainment domain - uses PV camera for infotainment >> purposes, >> e.g. taking pictures while in motion. >> 3. Navigation domain - uses PV camera for high definition maps >> >> Hope, this helps understanding the possible uses of the proposed >> protocol, its >> intention and restrictions. > Right, so in this scenario you probably do not want hotpluggable > sources in the Driver Domain. So support for fixed camera's only. Well, some sort of hotplug can already be implemented, please see [1], [2] as it is done for virtual display: this is achieved as a response to the backend's state change, e.g. whenever backend decides to unplug the virtual device it changes its state accordingly. > > If this is indeed the case, then this should be made very clear in > the API specification. As I described above this is already assumed by the state machine of a xenbus_driver > One additional thing to consider: cameras can break. So what should be > done if that happens? We as media developers have ideas about that, but > nothing has been implemented (yet). > > If the HW is simple (one camera is driven by a single driver instance), > then if it breaks, there simply won't be a video device. But if you have > multiple cameras all controlled through the same driver instance, then today > if a single camera breaks, all are gone. Please see above > We have ideas on how to address that, but as I said, nothing is implemented > yet. Basically we need to allow for partial bring-up and inform userspace > what is and what is not running. > > But this is likely something you also need to consider in this API, given > the use-case you are looking at. > > Regards, > > Hans Thank you for your valuable comments, Oleksandr [1] https://elixir.bootlin.com/linux/v4.19-rc3/source/drivers/gpu/drm/xen/xen_drm_front.c#L721 [2] https://elixir.bootlin.com/linux/v4.19-rc3/source/drivers/gpu/drm/xen/xen_drm_front.c#L582 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: Re: [PATCH 1/1] cameraif: add ABI for para-virtual camera Date: Mon, 10 Sep 2018 08:59:53 +0300 Message-ID: References: <20180731093142.3828-1-andr2000@gmail.com> <20180731093142.3828-2-andr2000@gmail.com> <99cd131d-85ae-bbfb-61ef-fdc0401727f6@suse.com> <5505e5af-5b64-b317-a0d8-09c11317926f@gmail.com> <345d7ec3-3ca3-e8fe-28a0-ba299196b5e4@gmail.com> <53189190-ffe0-9795-b01c-01de8db83acb@gmail.com> <641cd785-c5e7-7552-dc4b-35249f1f1985@xs4all.nl> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1fzFEt-0006U9-9N for xen-devel@lists.xenproject.org; Mon, 10 Sep 2018 05:59:59 +0000 Received: by mail-lj1-x241.google.com with SMTP id f1-v6so16783793ljc.9 for ; Sun, 09 Sep 2018 22:59:57 -0700 (PDT) In-Reply-To: <641cd785-c5e7-7552-dc4b-35249f1f1985@xs4all.nl> Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: Hans Verkuil , Juergen Gross , xen-devel@lists.xenproject.org, konrad.wilk@oracle.com, boris.ostrovsky@oracle.com, mchehab@kernel.org, linux-media@vger.kernel.org, sakari.ailus@linux.intel.com, koji.matsuoka.xm@renesas.com Cc: Artem Mygaiev , Oleksandr Andrushchenko List-Id: xen-devel@lists.xenproject.org SGksIEhhbnMhCgpPbiAwOS8wOS8yMDE4IDAxOjQyIFBNLCBIYW5zIFZlcmt1aWwgd3JvdGU6Cj4g T24gMDkvMDQvMjAxOCAwODo1NiBBTSwgT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gd3JvdGU6Cj4+ IE9uIDA5LzAzLzIwMTggMDY6MjUgUE0sIEhhbnMgVmVya3VpbCB3cm90ZToKPj4+IEhpIE9sZWtz YW5kciwKPj4+Cj4+PiBPbiAwOS8wMy8yMDE4IDEyOjE2IFBNLCBPbGVrc2FuZHIgQW5kcnVzaGNo ZW5rbyB3cm90ZToKPj4+PiBPbiAwOC8yMS8yMDE4IDA4OjU0IEFNLCBPbGVrc2FuZHIgQW5kcnVz aGNoZW5rbyB3cm90ZToKPj4+Pj4gT24gMDgvMTQvMjAxOCAxMTozMCBBTSwgSnVlcmdlbiBHcm9z cyB3cm90ZToKPj4+Pj4+IE9uIDMxLzA3LzE4IDExOjMxLCBPbGVrc2FuZHIgQW5kcnVzaGNoZW5r byB3cm90ZToKPj4+Pj4+PiBGcm9tOiBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyA8b2xla3NhbmRy X2FuZHJ1c2hjaGVua29AZXBhbS5jb20+Cj4+Pj4+Pj4KPj4+Pj4+PiBUaGlzIGlzIHRoZSBBQkkg Zm9yIHRoZSB0d28gaGFsdmVzIG9mIGEgcGFyYS12aXJ0dWFsaXplZAo+Pj4+Pj4+IGNhbWVyYSBk cml2ZXIgd2hpY2ggZXh0ZW5kcyBYZW4ncyByZWFjaCBtdWx0aW1lZGlhIGNhcGFiaWxpdGllcyBl dmVuCj4+Pj4+Pj4gZmFydGhlciBlbmFibGluZyBpdCBmb3IgdmlkZW8gY29uZmVyZW5jaW5nLCBJ bi1WZWhpY2xlIEluZm90YWlubWVudCwKPj4+Pj4+PiBoaWdoIGRlZmluaXRpb24gbWFwcyBldGMu Cj4+Pj4+Pj4KPj4+Pj4+PiBUaGUgaW5pdGlhbCBnb2FsIGlzIHRvIHN1cHBvcnQgbW9zdCBuZWVk ZWQgZnVuY3Rpb25hbGl0eSB3aXRoIHRoZQo+Pj4+Pj4+IGZpbmFsIGlkZWEgdG8gbWFrZSBpdCBw b3NzaWJsZSB0byBleHRlbmQgdGhlIHByb3RvY29sIGlmIG5lZWQgYmU6Cj4+Pj4+Pj4KPj4+Pj4+ PiAxLiBQcm92aWRlIG1lYW5zIGZvciBiYXNlIHZpcnR1YWwgZGV2aWNlIGNvbmZpZ3VyYXRpb246 Cj4+Pj4+Pj4gICAgIC0gcGl4ZWwgZm9ybWF0cwo+Pj4+Pj4+ICAgICAtIHJlc29sdXRpb25zCj4+ Pj4+Pj4gICAgIC0gZnJhbWUgcmF0ZXMKPj4+Pj4+PiAyLiBTdXBwb3J0IGJhc2ljIGNhbWVyYSBj b250cm9sczoKPj4+Pj4+PiAgICAgLSBjb250cmFzdAo+Pj4+Pj4+ICAgICAtIGJyaWdodG5lc3MK Pj4+Pj4+PiAgICAgLSBodWUKPj4+Pj4+PiAgICAgLSBzYXR1cmF0aW9uCj4+Pj4+Pj4gMy4gU3Vw cG9ydCBzdHJlYW1pbmcgY29udHJvbAo+Pj4+Pj4+IDQuIFN1cHBvcnQgemVyby1jb3B5aW5nIHVz ZS1jYXNlcwo+Pj4+Pj4+Cj4+Pj4+Pj4gU2lnbmVkLW9mZi1ieTogT2xla3NhbmRyIEFuZHJ1c2hj aGVua28KPj4+Pj4+PiA8b2xla3NhbmRyX2FuZHJ1c2hjaGVua29AZXBhbS5jb20+Cj4+Pj4+PiBT b21lIHN0eWxlIGlzc3VlcyBiZWxvdy4uLgo+Pj4+PiBXaWxsIGZpeCBhbGwgdGhlIGJlbG93LCB0 aGFuayB5b3UhCj4+Pj4+Cj4+Pj4+IEkgd291bGQgbGlrZSB0byBkcmF3IHNvbWUgYXR0ZW50aW9u IG9mIHRoZSBMaW51eC9WNEwgY29tbXVuaXR5IHRvIHRoaXMKPj4+Pj4gcHJvdG9jb2wgYXMgdGhl IHBsYW4gaXMgdGhhdCBvbmNlIGl0IGlzIGFjY2VwdGVkIGZvciBYZW4gd2UgcGxhbiB0bwo+Pj4+ PiB1cHN0cmVhbSBhIExpbnV4IGNhbWVyYSBmcm9udC1lbmQga2VybmVsIGRyaXZlciB3aGljaCB3 aWxsIGJlIGJhc2VkCj4+Pj4+IG9uIHRoaXMgd29yayBhbmQgd2lsbCBiZSBhIFY0TDIgZGV2aWNl IGRyaXZlciAodGhpcyBpcyB3aHkgSSBoYXZlIHNlbnQKPj4+Pj4gdGhpcyBwYXRjaCBub3Qgb25s eSB0byBYZW4sIGJ1dCB0byB0aGUgY29ycmVzcG9uZGluZyBMaW51eCBtYWlsaW5nIGxpc3QKPj4+ Pj4gYXMgd2VsbCkKPj4+PiBwaW5nCj4+PiBTb3JyeSwgdGhpcyBnb3QgYnVyaWVkIGluIG15IG1h aWxib3gsIEkgb25seSBjYW1lIGFjcm9zcyBpdCB0b2RheS4gSSdsbCB0cnkKPj4+IHRvIHJldmll dyB0aGlzIHRoaXMgd2VlaywgaWYgbm90LCBqdXN0IHBpbmcgbWUgYWdhaW4uCj4+IFRoYW5rIHlv dSBmb3IgeW91ciB0aW1lCj4+PiBJIGhhZCBvbmUgaGlnaC1sZXZlbCBxdWVzdGlvbiwgdGhvdWdo Ogo+Pj4KPj4+IFdoYXQgdHlwZXMgb2YgaGFyZHdhcmUgZG8geW91IGludGVuZCB0byB0YXJnZXQ/ IFRoaXMgaW5pdGlhbCB2ZXJzaW9uIHRhcmdldHMKPj4+ICh2ZXJ5KSBzaW1wbGUgd2ViY2Ftcywg YnV0IHdoYXQgYWJvdXQgSERNSSBvciBTRFRWIHJlY2VpdmVycz8gT3IgaGFyZHdhcmUKPj4+IGNv ZGVjcz8gT3IgY29tcGxleCBlbWJlZGRlZCB2aWRlbyBwaXBlbGluZXM/Cj4+Pgo+Pj4gSW4gb3Ro ZXIgd29yZHMsIHdoZXJlIGFyZSB5b3UgcGxhbm5pbmcgdG8gZHJhdyB0aGUgbGluZT8KPj4+Cj4+ PiBFdmVuIHdpdGgganVzdCBzaW1wbGUgY2FtZXJhcyB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgYmV0 d2VlbiByZWd1bGFyIFVWQwo+Pj4gd2ViY2FtcyBhbmQgY2FtZXJhcyB1c2VkIHdpdGggZW1iZWRk ZWQgc3lzdGVtczogZm9yIHRoZSBsYXR0ZXIgeW91IG9mdGVuCj4+PiBuZWVkIHRvIHByb3ZpZGUg bW9yZSBjb250cm9sIHcuci50LiB3aGl0ZS1iYWxhbmNpbmcgZXRjLiwgdGhpbmdzIHRoYXQgYQo+ Pj4gVVZDIHdlYmNhbSB3aWxsIGdlbmVyYWxseSBkbyBmb3IgeW91IGluIHRoZSB3ZWJjYW0ncyBm aXJtd2FyZS4KPj4gVGhlIHVzZS1jYXNlcyB3ZSB3YW50IHRvIGltcGxlbWVudCBhcmUgbW9zdGx5 IGluIGF1dG9tb3RpdmUvZW1iZWRkZWQgZG9tYWluLAo+PiBzbyB0aGVyZSBhcmUgbWFueSBwZXJm b3JtYW5jZSByZXN0cmljdGlvbnMgYXBwbHkuCj4+IFdlIGFyZSBub3QgdGFyZ2V0aW5nIHZpcnR1 YWxpemluZyB2ZXJ5IGNvbXBsZXggaGFyZHdhcmUgYW5kIGhhdmUgbm8KPj4gaW50ZW50aW9uCj4+ IHRvIG1ha2UgYSAxOjEgbWFwcGluZyBvZiB0aGUgcmVhbCBoYXJkd2FyZTogZm9yIHRoYXQgb25l IGNhbiBwYXNzLXRocm91Z2gKPj4gYSByZWFsIEhXIGRldmljZSB0byBhIHZpcnR1YWwgbWFjaGlu ZSAoVk0pLiBUaGUgZ29hbCBpcyB0byBzaGFyZSBhIHNpbmdsZQo+PiBjYW1lcmEgZGV2aWNlIHRv IG11bHRpcGxlIHZpcnR1YWwgbWFjaGluZXMsIG5vIGNvZGVjcywgcmVjZWl2ZXJzIGV0Yy4KPj4K Pj4gQ29udHJvbGxpbmcgdGhlIHNhbWUgSFcgZGV2aWNlIGZyb20gZGlmZmVyZW50IFZNcyBkb2Vz bid0IGxvb2sgZmVhc2libGU6Cj4+IHdoYXQgaWYgdGhlIHNhbWUgY29udHJvbCBpcyBzZXQgdG8g ZGlmZmVyZW50IHZhbHVlcyBmcm9tIGRpZmZlcmVudCBWTXM/Cj4gWW91IGNhbiBkbyB0aGlzLCBh Y3R1YWxseTogaW4gVjRMMiB5b3UgY2FuIGdldCBhbiBldmVudCB3aGVuIGFub3RoZXIgcHJvY2Vz cwo+IGNoYW5nZXMgYSBjb250cm9sLCBhbmQgdXBkYXRlIHlvdXIgb3duIEdVSS9pbnRlcm5hbCBz dGF0ZSBhY2NvcmRpbmdseS4KPgo+IFNvIGluIHRoaXMgY2FzZSBpZiBvbmUgVk0gY2hhbmdlcyBh IGNvbnRyb2wsIGFuIGV2ZW50IGlzIHNlbnQgdG8gYWxsIG90aGVycwo+IHRoYXQgdGhlIGNvbnRy b2wgaGFzIGNoYW5nZWQgdmFsdWUuCldlbGwsIHRlY2huaWNhbGx5IHRoaXMgY2FuIGJlIGRvbmUg YnkgaW50cm9kdWNpbmcgb25lIG1vcmUKZXZlbnQgZm9yIHN1Y2ggYSBub3RpZmljYXRpb24uIEJ1 dCwgZnJvbSBzeXN0ZW0gcGFydGl0aW9uaW5nClBPViwgSSBhbSBzdGlsbCBub3QgY29udmluY2Vk IHRoaXMgc2hvdWxkIGJlIGRvbmU6IEkgd291bGQgcHJlZmVyCnRoYXQgYSBzaW5nbGUgVk0gb3du cyBzdWNoIGEgY29udHJvbCBhbmQgZXZlbiB3aGljaCBjb250cm9sIGFuZCB3aGljaApWTSBpcyBk ZWNpZGVkIHdoaWxlIGNvbmZpZ3VyaW5nIHRoZSB3aG9sZSBzeXN0ZW0uClNvLCBJIHdvdWxkIGxp a2UgdG8ga2VlcCBpdCBhcyBpcy4KPgo+PiBPZiBjb3Vyc2UsIHRoaXMgY2FuIGJlIGFjaGlldmVk IGlmIHRoZSBjb3JyZXNwb25kaW5nIGJhY2tlbmQgY2FuCj4+IHBvc3QtcHJvY2Vzcwo+PiBvcmln aW5hbCBjYW1lcmEgaW1hZ2Ugd2l0aCBHUFUsIGZvciBleGFtcGxlLCB0aHVzIGFwcGx5aW5nIGRp ZmZlcmVudCBmaWx0ZXJzCj4+IGZvciBkaWZmZXJlbnQgVk1zIGVmZmVjdGl2ZWx5IGVtdWxhdGlu ZyBjYW1lcmEgY29udHJvbHMuCj4+IEJ1dCB0aGlzIHJlcXVpcmVzIGFkZGl0aW9uYWwgQ1BVL0dQ VSBwb3dlciB3aGljaCB3ZSB0cnkgdG8gYXZvaWQuCj4+Cj4+IFN5c3RlbSBwYXJ0aXRpb25pbmcg KGNhbWVyYSBhbmQgY29udHJvbHMgYXNzaWdubWVudCkgaXMgZG9uZSBhdAo+PiBjb25maWd1cmF0 aW9uCj4+IHRpbWUgKHJlbWVtYmVyIHdlIGFyZSBpbiBhdXRvbW90aXZlL2VtYmVkZGVkIHdvcmxk LCBzbyBtb3N0IG9mIHRoZSB0aW1lCj4+IHRoZSBzZXQKPj4gb2YgVk1zIHJlcXVpcmluZyBjYW1l cmFzIGlzIGtub3duIGF0IHRoaXMgc3RhZ2UgYW5kIHRoZSBjb25maWd1cmF0aW9uCj4+IHJlbWFp bnMKPj4gc3RhdGljIGF0IHJ1bi10aW1lKS4gU28sIHdoZW4gcGFyYS12aXJ0dWFsaXplZCAoUFYp IGFwcHJvYWNoIGlzIHVzZWQgdGhlbiB3ZQo+PiBvbmx5IGltcGxlbWVudCB2ZXJ5IGJhc2ljIGNv bnRyb2xzICh0aG9zZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wpLCBzbyBvbmUgY2FuCj4+IGFzc2ln biBzZXQgb2YgY29udHJvbHMgKGFsbCBvciBzb21lKSB0byBvbmUgb2YgdGhlIFZNcyAobWFpbiBv ciBtaXNzaW9uCj4+IGNyaXRpY2FsCj4+IFZNIG9yIHdoYXRldmVyKSBhbGxvd2luZyB0aGF0IFZN IHRvIGFkanVzdHMgdGhvc2UgZm9yIGFsbCBWTXMgYXQgb25jZS4KPj4gRm9yIG90aGVyCj4+IFZN cyB0aGluayBvZiBpdCBhcyBmaXJtd2FyZSBpbXBsZW1lbnRlZCBhZGp1c3RtZW50LiBBbmQgdGhl IGJhY2tlbmQgc3RpbGwKPj4gY29udHJvbHMgdGhlIHJlc3Qgb2YgdGhlIGNvbnRyb2xzIG9mIHRo ZSByZWFsIEhXIGNhbWVyYSB5b3UgbWVudGlvbi4KPj4KPj4gSnVzdCBhbiBleGFtcGxlIG9mIGF1 dG9tb3RpdmUgdXNlLWNhc2UgKHdlIGNhbiBpbWFnaW5lIG1hbnkgbW9yZSk6Cj4+IDEuIERyaXZl ciBEb21haW4gLSBvd25zIHJlYWwgY2FtZXJhIEhXIGFuZCBydW5zIHRoZSBjYW1lcmEgYmFja2Vu ZC4KPj4gICAgICBVc2VzIGNhbWVyYSBvdXRwdXQgZm9yIG1pc3Npb24gY3JpdGljYWwgdGFza3Ms IGUuZy4gcGFya2luZyBhc3Npc3RhbmNlLgo+PiAyLiBJbi1WZWhpY2xlIEluZm90YWlubWVudCBk b21haW4gLSB1c2VzIFBWIGNhbWVyYSBmb3IgaW5mb3RhaW5tZW50Cj4+IHB1cnBvc2VzLAo+PiAg ICAgIGUuZy4gdGFraW5nIHBpY3R1cmVzIHdoaWxlIGluIG1vdGlvbi4KPj4gMy4gTmF2aWdhdGlv biBkb21haW4gLSB1c2VzIFBWIGNhbWVyYSBmb3IgaGlnaCBkZWZpbml0aW9uIG1hcHMKPj4KPj4g SG9wZSwgdGhpcyBoZWxwcyB1bmRlcnN0YW5kaW5nIHRoZSBwb3NzaWJsZSB1c2VzIG9mIHRoZSBw cm9wb3NlZAo+PiBwcm90b2NvbCwgaXRzCj4+IGludGVudGlvbiBhbmQgcmVzdHJpY3Rpb25zLgo+ IFJpZ2h0LCBzbyBpbiB0aGlzIHNjZW5hcmlvIHlvdSBwcm9iYWJseSBkbyBub3Qgd2FudCBob3Rw bHVnZ2FibGUKPiBzb3VyY2VzIGluIHRoZSBEcml2ZXIgRG9tYWluLiBTbyBzdXBwb3J0IGZvciBm aXhlZCBjYW1lcmEncyBvbmx5LgpXZWxsLCBzb21lIHNvcnQgb2YgaG90cGx1ZyBjYW4gYWxyZWFk eSBiZSBpbXBsZW1lbnRlZCwgcGxlYXNlCnNlZSBbMV0sIFsyXSBhcyBpdCBpcyBkb25lIGZvciB2 aXJ0dWFsIGRpc3BsYXk6IHRoaXMgaXMKYWNoaWV2ZWQgYXMgYSByZXNwb25zZSB0byB0aGUgYmFj a2VuZCdzIHN0YXRlIGNoYW5nZSwKZS5nLiB3aGVuZXZlciBiYWNrZW5kIGRlY2lkZXMgdG8gdW5w bHVnIHRoZSB2aXJ0dWFsIGRldmljZQppdCBjaGFuZ2VzIGl0cyBzdGF0ZSBhY2NvcmRpbmdseS4K Pgo+IElmIHRoaXMgaXMgaW5kZWVkIHRoZSBjYXNlLCB0aGVuIHRoaXMgc2hvdWxkIGJlIG1hZGUg dmVyeSBjbGVhciBpbgo+IHRoZSBBUEkgc3BlY2lmaWNhdGlvbi4KQXMgSSBkZXNjcmliZWQgYWJv dmUgdGhpcyBpcyBhbHJlYWR5IGFzc3VtZWQgYnkgdGhlIHN0YXRlCm1hY2hpbmUgb2YgYSB4ZW5i dXNfZHJpdmVyCj4gT25lIGFkZGl0aW9uYWwgdGhpbmcgdG8gY29uc2lkZXI6IGNhbWVyYXMgY2Fu IGJyZWFrLiBTbyB3aGF0IHNob3VsZCBiZQo+IGRvbmUgaWYgdGhhdCBoYXBwZW5zPyBXZSBhcyBt ZWRpYSBkZXZlbG9wZXJzIGhhdmUgaWRlYXMgYWJvdXQgdGhhdCwgYnV0Cj4gbm90aGluZyBoYXMg YmVlbiBpbXBsZW1lbnRlZCAoeWV0KS4KPgo+IElmIHRoZSBIVyBpcyBzaW1wbGUgKG9uZSBjYW1l cmEgaXMgZHJpdmVuIGJ5IGEgc2luZ2xlIGRyaXZlciBpbnN0YW5jZSksCj4gdGhlbiBpZiBpdCBi cmVha3MsIHRoZXJlIHNpbXBseSB3b24ndCBiZSBhIHZpZGVvIGRldmljZS4gQnV0IGlmIHlvdSBo YXZlCj4gbXVsdGlwbGUgY2FtZXJhcyBhbGwgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBzYW1lIGRy aXZlciBpbnN0YW5jZSwgdGhlbiB0b2RheQo+IGlmIGEgc2luZ2xlIGNhbWVyYSBicmVha3MsIGFs bCBhcmUgZ29uZS4KUGxlYXNlIHNlZSBhYm92ZQo+IFdlIGhhdmUgaWRlYXMgb24gaG93IHRvIGFk ZHJlc3MgdGhhdCwgYnV0IGFzIEkgc2FpZCwgbm90aGluZyBpcyBpbXBsZW1lbnRlZAo+IHlldC4g QmFzaWNhbGx5IHdlIG5lZWQgdG8gYWxsb3cgZm9yIHBhcnRpYWwgYnJpbmctdXAgYW5kIGluZm9y bSB1c2Vyc3BhY2UKPiB3aGF0IGlzIGFuZCB3aGF0IGlzIG5vdCBydW5uaW5nLgo+Cj4gQnV0IHRo aXMgaXMgbGlrZWx5IHNvbWV0aGluZyB5b3UgYWxzbyBuZWVkIHRvIGNvbnNpZGVyIGluIHRoaXMg QVBJLCBnaXZlbgo+IHRoZSB1c2UtY2FzZSB5b3UgYXJlIGxvb2tpbmcgYXQuCj4KPiBSZWdhcmRz LAo+Cj4gCUhhbnMKVGhhbmsgeW91IGZvciB5b3VyIHZhbHVhYmxlIGNvbW1lbnRzLApPbGVrc2Fu ZHIKClsxXSAKaHR0cHM6Ly9lbGl4aXIuYm9vdGxpbi5jb20vbGludXgvdjQuMTktcmMzL3NvdXJj ZS9kcml2ZXJzL2dwdS9kcm0veGVuL3hlbl9kcm1fZnJvbnQuYyNMNzIxClsyXSAKaHR0cHM6Ly9l bGl4aXIuYm9vdGxpbi5jb20vbGludXgvdjQuMTktcmMzL3NvdXJjZS9kcml2ZXJzL2dwdS9kcm0v eGVuL3hlbl9kcm1fZnJvbnQuYyNMNTgyCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54 ZW5wcm9qZWN0Lm9yZwpodHRwczovL2xpc3RzLnhlbnByb2plY3Qub3JnL21haWxtYW4vbGlzdGlu Zm8veGVuLWRldmVs