From mboxrd@z Thu Jan 1 00:00:00 1970 From: laurent.pinchart@ideasonboard.com (Laurent Pinchart) Date: Wed, 21 Feb 2018 22:39:02 +0200 Subject: [PATCH v3 1/8] drm/blend: Add a generic alpha property In-Reply-To: References: <1841868.3gpkeNesVL@avalon> Message-ID: <2609360.oaDrMcTLzt@avalon> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Daniel, On Monday, 19 February 2018 23:58:40 EET Daniel Vetter wrote: > On Mon, Feb 19, 2018 at 9:19 PM, Laurent Pinchart wrote: > > On Friday, 16 February 2018 20:20:41 EET Ville Syrj?l? wrote: > >> On Fri, Feb 16, 2018 at 06:39:29PM +0100, Maxime Ripard wrote: > >> Some drivers duplicate the logic to create a property to store a > >>> per-plane alpha. > >>> > >>> This is especially useful if we ever want to support extra protocols > >>> for Wayland like: > >>> https://lists.freedesktop.org/archives/wayland-devel/2017-August/034741 > >>> .html > >>> > >>> Let's create a helper in order to move that to the core. > >>> > >>> Cc: Laurent Pinchart > >>> Reviewed-by: Boris Brezillon > >>> Signed-off-by: Maxime Ripard > >>> --- > >>> > >>> Documentation/gpu/kms-properties.csv | 2 +- > >>> drivers/gpu/drm/drm_atomic.c | 4 ++++- > >>> drivers/gpu/drm/drm_atomic_helper.c | 4 ++++- > >>> drivers/gpu/drm/drm_blend.c | 32 ++++++++++++++++++++++++++++- > >>> include/drm/drm_blend.h | 1 +- > >>> include/drm/drm_plane.h | 6 +++++- > >>> 6 files changed, 48 insertions(+), 1 deletion(-) > >>> > >>> diff --git a/Documentation/gpu/kms-properties.csv > >>> b/Documentation/gpu/kms-properties.csv index 927b65e14219..25ad3503d663 > >>> 100644 > >>> --- a/Documentation/gpu/kms-properties.csv > >>> +++ b/Documentation/gpu/kms-properties.csv > >>> @@ -99,5 +99,5 @@ radeon,DVI-I,?coherent?,RANGE,"Min=0, > >>> Max=1",Connector,TBD> > >>> > >>> ,,"""underscan vborder""",RANGE,"Min=0, Max=128",Connector,TBD > >>> ,Audio,?audio?,ENUM,"{ ""off"", ""on"", ""auto"" }",Connector,TBD > >>> ,FMT Dithering,?dither?,ENUM,"{ ""off"", ""on"" }",Connector,TBD > >>> > >>> -rcar-du,Generic,"""alpha""",RANGE,"Min=0, Max=255",Plane,TBD > >>> +,,"""alpha""",RANGE,"Min=0, Max=Driver dependant",Plane,Opacity of the > >>> plane from transparent (0) to fully opaque (MAX). If this property is > >>> set to a value different than max, and that the pixel will define an > >>> alpha component, the property will have precendance and the pixel value > >>> will be ignored. > > Please don't document new properties in that csv file, it's an > unreadable mess. Instead follow how we document standardized > properties nowadays in full-blown sections. For plane blending we > have: > > https://dri.freedesktop.org/docs/drm/gpu/drm-kms.html#plane-composition-prop > erties > > >> Those semantics don't seem particularly good to me. I think we would want > >> the per-pixel alpha and global alpha both to be effecive at the same > >> time. You can always decide to ignore the per-pixel alpha by using a > >> pixel format without alpha. > > > > That makes sense to me. However, it also brings a new question: how should > > a driver that supports either global alpha or pixel alpha but not both > > signal that to userspace, and how should it reacts when userspace selects > > a format with an alpha channel and set a global alpha value other than > > fully opaque ? To make things more complex, note that some drivers > > support combining global alpha and pixel alpha only for a subset of the > > formats with an alpha channel (for instance for ARGB 1555 formats, but > > not for ARGB 8888 formats). > > atomic_check can reject unsupported configs. Userspace needs to fall > back somehow (either switch to xrgb or make alpha fully opaque or just > give up on that plane). We have a lot of such corner-cases we don't > tell userspace about explicitly at all. I'm OK with failing the commit in case in invalid configuration is requested. However, using a check-only commit to find out whether combining global alpha and pixel alpha is supported doesn't seem a good idea to me. First of all userspace would need to try that for all formats, making it cumbersome. Then, an atomic commit is a black box, we don't report the failure cause to userspace. It makes it hard to use it to test support for a feature as it could fail for an unrelated reason. Finally, we'd open the door to various kind of heuristics implemented differently in different userspace stacks, and that would increase the risk of breaking userspace. I'd rather have an explicitly documented way to perform such checks. > >> Also, where's the userspace that wants this feature? > >> > >> > >> > >>> diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h > >>> index 8185e3468a23..5a6f29524f12 100644 > >>> --- a/include/drm/drm_plane.h > >>> +++ b/include/drm/drm_plane.h > >>> @@ -42,6 +42,7 @@ struct drm_modeset_acquire_ctx; > >>> * plane (in 16.16) > >>> * @src_w: width of visible portion of plane (in 16.16) > >>> * @src_h: height of visible portion of plane (in 16.16) > >>> + * @alpha: opacity of the plane > >>> * @rotation: rotation of the plane > >>> * @zpos: priority of the given plane on crtc (optional) > >>> * Note that multiple active planes on the same crtc can have an > >>> identical > >>> @@ -105,6 +106,9 @@ struct drm_plane_state { > >>> uint32_t src_x, src_y; > >>> uint32_t src_h, src_w; > >>> > >>> + /* Plane opacity */ > >>> + u8 alpha; > >> > >> We may want to make that u16. The general we expect 16bpc for most color > >> related things, but since this is a range prop I suppose we should just > >> expose the actual hardware range. But making it u16 might avoid some head > >> scratching for the first person to have hardware with higher precision. > >> Either that or we should make the prop creation fail if the driver asks > >> for more bits than we have in the state. > > > > I'm tempted to go one step further and always make the alpha property > > 16-bits wide for new users (we can't do so for existing users as it could > > break userspace), and let drivers convert that internally to the range > > they need. There could however be drawbacks I don't foresee. > > I think scaling the range to match the hw is the most sensible (yes > I'm flip-flopping around here). So you mean keeping the proposed implementation, with a driver-specific maximum value ? > And once someone needs more than u8, we can extend the internal > representation easily. The external representation in the property is an > u64, that /should/ be enough for the next few years :-) The external representation is split in two parts. The value is stored in a 64-bits field, and that is safe. The second part of the representation is the minimum (hardcoded to 0) and maximum (currently variable) values reported by the property. What we need to decide now is whether to hardcode the maximum value to 0xffff for all new users of the alpha property, or to always expose the hardware range. > >> Oh, and you should plug this into the state dumper as well. > >> > >>> + > >>> > >>> /* Plane rotation */ > >>> unsigned int rotation; > >>> @@ -481,6 +485,7 @@ enum drm_plane_type { > >>> * @funcs: helper functions > >>> * @properties: property tracking for this plane > >>> * @type: type of plane (overlay, primary, cursor) > >>> + * @alpha_property: alpha property for this plane > >>> * @zpos_property: zpos property for this plane > >>> * @rotation_property: rotation property for this plane > >>> * @helper_private: mid-layer private data > >>> @@ -556,6 +561,7 @@ struct drm_plane { > >>> */ > >>> > >>> struct drm_plane_state *state; > >>> + struct drm_property *alpha_property; > >>> struct drm_property *zpos_property; > >>> struct drm_property *rotation_property; > >>> }; -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v3 1/8] drm/blend: Add a generic alpha property Date: Wed, 21 Feb 2018 22:39:02 +0200 Message-ID: <2609360.oaDrMcTLzt@avalon> References: <1841868.3gpkeNesVL@avalon> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from galahad.ideasonboard.com (galahad.ideasonboard.com [185.26.127.97]) by gabe.freedesktop.org (Postfix) with ESMTPS id D85C66E94D for ; Wed, 21 Feb 2018 20:38:20 +0000 (UTC) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Daniel Vetter Cc: Maxime Ripard , dri-devel , Boris Brezillon , Chen-Yu Tsai , Daniel Vetter , Linux ARM List-Id: dri-devel@lists.freedesktop.org SGkgRGFuaWVsLAoKT24gTW9uZGF5LCAxOSBGZWJydWFyeSAyMDE4IDIzOjU4OjQwIEVFVCBEYW5p ZWwgVmV0dGVyIHdyb3RlOgo+IE9uIE1vbiwgRmViIDE5LCAyMDE4IGF0IDk6MTkgUE0sIExhdXJl bnQgUGluY2hhcnQgd3JvdGU6Cj4gPiBPbiBGcmlkYXksIDE2IEZlYnJ1YXJ5IDIwMTggMjA6MjA6 NDEgRUVUIFZpbGxlIFN5cmrDpGzDpCB3cm90ZToKPiA+PiBPbiBGcmksIEZlYiAxNiwgMjAxOCBh dCAwNjozOToyOVBNICswMTAwLCBNYXhpbWUgUmlwYXJkIHdyb3RlOgo+ID4+IFNvbWUgZHJpdmVy cyBkdXBsaWNhdGUgdGhlIGxvZ2ljIHRvIGNyZWF0ZSBhIHByb3BlcnR5IHRvIHN0b3JlIGEKPiA+ Pj4gcGVyLXBsYW5lIGFscGhhLgo+ID4+PiAKPiA+Pj4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1 bCBpZiB3ZSBldmVyIHdhbnQgdG8gc3VwcG9ydCBleHRyYSBwcm90b2NvbHMKPiA+Pj4gZm9yIFdh eWxhbmQgbGlrZToKPiA+Pj4gaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMv d2F5bGFuZC1kZXZlbC8yMDE3LUF1Z3VzdC8wMzQ3NDEKPiA+Pj4gLmh0bWwKPiA+Pj4gCj4gPj4+ IExldCdzIGNyZWF0ZSBhIGhlbHBlciBpbiBvcmRlciB0byBtb3ZlIHRoYXQgdG8gdGhlIGNvcmUu Cj4gPj4+IAo+ID4+PiBDYzogTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBpZGVh c29uYm9hcmQuY29tPgo+ID4+PiBSZXZpZXdlZC1ieTogQm9yaXMgQnJlemlsbG9uIDxib3Jpcy5i cmV6aWxsb25AYm9vdGxpbi5jb20+Cj4gPj4+IFNpZ25lZC1vZmYtYnk6IE1heGltZSBSaXBhcmQg PG1heGltZS5yaXBhcmRAYm9vdGxpbi5jb20+Cj4gPj4+IC0tLQo+ID4+PiAKPiA+Pj4gIERvY3Vt ZW50YXRpb24vZ3B1L2ttcy1wcm9wZXJ0aWVzLmNzdiB8ICAyICstCj4gPj4+ICBkcml2ZXJzL2dw dS9kcm0vZHJtX2F0b21pYy5jICAgICAgICAgfCAgNCArKysrLQo+ID4+PiAgZHJpdmVycy9ncHUv ZHJtL2RybV9hdG9taWNfaGVscGVyLmMgIHwgIDQgKysrKy0KPiA+Pj4gIGRyaXZlcnMvZ3B1L2Ry bS9kcm1fYmxlbmQuYyAgICAgICAgICB8IDMyICsrKysrKysrKysrKysrKysrKysrKysrKysrKyst Cj4gPj4+ICBpbmNsdWRlL2RybS9kcm1fYmxlbmQuaCAgICAgICAgICAgICAgfCAgMSArLQo+ID4+ PiAgaW5jbHVkZS9kcm0vZHJtX3BsYW5lLmggICAgICAgICAgICAgIHwgIDYgKysrKystCj4gPj4+ ICA2IGZpbGVzIGNoYW5nZWQsIDQ4IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKPiA+Pj4g Cj4gPj4+IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dwdS9rbXMtcHJvcGVydGllcy5jc3YK PiA+Pj4gYi9Eb2N1bWVudGF0aW9uL2dwdS9rbXMtcHJvcGVydGllcy5jc3YgaW5kZXggOTI3YjY1 ZTE0MjE5Li4yNWFkMzUwM2Q2NjMKPiA+Pj4gMTAwNjQ0Cj4gPj4+IC0tLSBhL0RvY3VtZW50YXRp b24vZ3B1L2ttcy1wcm9wZXJ0aWVzLmNzdgo+ID4+PiArKysgYi9Eb2N1bWVudGF0aW9uL2dwdS9r bXMtcHJvcGVydGllcy5jc3YKPiA+Pj4gQEAgLTk5LDUgKzk5LDUgQEAgcmFkZW9uLERWSS1JLOKA nGNvaGVyZW504oCdLFJBTkdFLCJNaW49MCwKPiA+Pj4gTWF4PTEiLENvbm5lY3RvcixUQkQ+Cj4g Pj4+IAo+ID4+PiAgLCwiIiJ1bmRlcnNjYW4gdmJvcmRlciIiIixSQU5HRSwiTWluPTAsIE1heD0x MjgiLENvbm5lY3RvcixUQkQKPiA+Pj4gICxBdWRpbyzigJxhdWRpb+KAnSxFTlVNLCJ7ICIib2Zm IiIsICIib24iIiwgIiJhdXRvIiIgfSIsQ29ubmVjdG9yLFRCRAo+ID4+PiAgLEZNVCBEaXRoZXJp bmcs4oCcZGl0aGVy4oCdLEVOVU0sInsgIiJvZmYiIiwgIiJvbiIiIH0iLENvbm5lY3RvcixUQkQK PiA+Pj4gCj4gPj4+IC1yY2FyLWR1LEdlbmVyaWMsIiIiYWxwaGEiIiIsUkFOR0UsIk1pbj0wLCBN YXg9MjU1IixQbGFuZSxUQkQKPiA+Pj4gKywsIiIiYWxwaGEiIiIsUkFOR0UsIk1pbj0wLCBNYXg9 RHJpdmVyIGRlcGVuZGFudCIsUGxhbmUsT3BhY2l0eSBvZiB0aGUKPiA+Pj4gcGxhbmUgZnJvbSB0 cmFuc3BhcmVudCAoMCkgdG8gZnVsbHkgb3BhcXVlIChNQVgpLiBJZiB0aGlzIHByb3BlcnR5IGlz Cj4gPj4+IHNldCB0byBhIHZhbHVlIGRpZmZlcmVudCB0aGFuIG1heCwgYW5kIHRoYXQgdGhlIHBp eGVsIHdpbGwgZGVmaW5lIGFuCj4gPj4+IGFscGhhIGNvbXBvbmVudCwgdGhlIHByb3BlcnR5IHdp bGwgaGF2ZSBwcmVjZW5kYW5jZSBhbmQgdGhlIHBpeGVsIHZhbHVlCj4gPj4+IHdpbGwgYmUgaWdu b3JlZC4KPiAKPiBQbGVhc2UgZG9uJ3QgZG9jdW1lbnQgbmV3IHByb3BlcnRpZXMgaW4gdGhhdCBj c3YgZmlsZSwgaXQncyBhbgo+IHVucmVhZGFibGUgbWVzcy4gSW5zdGVhZCBmb2xsb3cgaG93IHdl IGRvY3VtZW50IHN0YW5kYXJkaXplZAo+IHByb3BlcnRpZXMgbm93YWRheXMgaW4gZnVsbC1ibG93 biBzZWN0aW9ucy4gRm9yIHBsYW5lIGJsZW5kaW5nIHdlCj4gaGF2ZToKPiAKPiBodHRwczovL2Ry aS5mcmVlZGVza3RvcC5vcmcvZG9jcy9kcm0vZ3B1L2RybS1rbXMuaHRtbCNwbGFuZS1jb21wb3Np dGlvbi1wcm9wCj4gZXJ0aWVzCj4gCj4gPj4gVGhvc2Ugc2VtYW50aWNzIGRvbid0IHNlZW0gcGFy dGljdWxhcmx5IGdvb2QgdG8gbWUuIEkgdGhpbmsgd2Ugd291bGQgd2FudAo+ID4+IHRoZSBwZXIt cGl4ZWwgYWxwaGEgYW5kIGdsb2JhbCBhbHBoYSBib3RoIHRvIGJlIGVmZmVjaXZlIGF0IHRoZSBz YW1lCj4gPj4gdGltZS4gWW91IGNhbiBhbHdheXMgZGVjaWRlIHRvIGlnbm9yZSB0aGUgcGVyLXBp eGVsIGFscGhhIGJ5IHVzaW5nIGEKPiA+PiBwaXhlbCBmb3JtYXQgd2l0aG91dCBhbHBoYS4KPiA+ IAo+ID4gVGhhdCBtYWtlcyBzZW5zZSB0byBtZS4gSG93ZXZlciwgaXQgYWxzbyBicmluZ3MgYSBu ZXcgcXVlc3Rpb246IGhvdyBzaG91bGQKPiA+IGEgZHJpdmVyIHRoYXQgc3VwcG9ydHMgZWl0aGVy IGdsb2JhbCBhbHBoYSBvciBwaXhlbCBhbHBoYSBidXQgbm90IGJvdGgKPiA+IHNpZ25hbCB0aGF0 IHRvIHVzZXJzcGFjZSwgYW5kIGhvdyBzaG91bGQgaXQgcmVhY3RzIHdoZW4gdXNlcnNwYWNlIHNl bGVjdHMKPiA+IGEgZm9ybWF0IHdpdGggYW4gYWxwaGEgY2hhbm5lbCBhbmQgc2V0IGEgZ2xvYmFs IGFscGhhIHZhbHVlIG90aGVyIHRoYW4KPiA+IGZ1bGx5IG9wYXF1ZSA/IFRvIG1ha2UgdGhpbmdz IG1vcmUgY29tcGxleCwgbm90ZSB0aGF0IHNvbWUgZHJpdmVycwo+ID4gc3VwcG9ydCBjb21iaW5p bmcgZ2xvYmFsIGFscGhhIGFuZCBwaXhlbCBhbHBoYSBvbmx5IGZvciBhIHN1YnNldCBvZiB0aGUK PiA+IGZvcm1hdHMgd2l0aCBhbiBhbHBoYSBjaGFubmVsIChmb3IgaW5zdGFuY2UgZm9yIEFSR0Ig MTU1NSBmb3JtYXRzLCBidXQKPiA+IG5vdCBmb3IgQVJHQiA4ODg4IGZvcm1hdHMpLgo+IAo+IGF0 b21pY19jaGVjayBjYW4gcmVqZWN0IHVuc3VwcG9ydGVkIGNvbmZpZ3MuIFVzZXJzcGFjZSBuZWVk cyB0byBmYWxsCj4gYmFjayBzb21laG93IChlaXRoZXIgc3dpdGNoIHRvIHhyZ2Igb3IgbWFrZSBh bHBoYSBmdWxseSBvcGFxdWUgb3IganVzdAo+IGdpdmUgdXAgb24gdGhhdCBwbGFuZSkuIFdlIGhh dmUgYSBsb3Qgb2Ygc3VjaCBjb3JuZXItY2FzZXMgd2UgZG9uJ3QKPiB0ZWxsIHVzZXJzcGFjZSBh Ym91dCBleHBsaWNpdGx5IGF0IGFsbC4KCkknbSBPSyB3aXRoIGZhaWxpbmcgdGhlIGNvbW1pdCBp biBjYXNlIGluIGludmFsaWQgY29uZmlndXJhdGlvbiBpcyByZXF1ZXN0ZWQuIApIb3dldmVyLCB1 c2luZyBhIGNoZWNrLW9ubHkgY29tbWl0IHRvIGZpbmQgb3V0IHdoZXRoZXIgY29tYmluaW5nIGds b2JhbCBhbHBoYSAKYW5kIHBpeGVsIGFscGhhIGlzIHN1cHBvcnRlZCBkb2Vzbid0IHNlZW0gYSBn b29kIGlkZWEgdG8gbWUuIEZpcnN0IG9mIGFsbCAKdXNlcnNwYWNlIHdvdWxkIG5lZWQgdG8gdHJ5 IHRoYXQgZm9yIGFsbCBmb3JtYXRzLCBtYWtpbmcgaXQgY3VtYmVyc29tZS4gVGhlbiwgCmFuIGF0 b21pYyBjb21taXQgaXMgYSBibGFjayBib3gsIHdlIGRvbid0IHJlcG9ydCB0aGUgZmFpbHVyZSBj YXVzZSB0byAKdXNlcnNwYWNlLiBJdCBtYWtlcyBpdCBoYXJkIHRvIHVzZSBpdCB0byB0ZXN0IHN1 cHBvcnQgZm9yIGEgZmVhdHVyZSBhcyBpdCAKY291bGQgZmFpbCBmb3IgYW4gdW5yZWxhdGVkIHJl YXNvbi4gRmluYWxseSwgd2UnZCBvcGVuIHRoZSBkb29yIHRvIHZhcmlvdXMgCmtpbmQgb2YgaGV1 cmlzdGljcyBpbXBsZW1lbnRlZCBkaWZmZXJlbnRseSBpbiBkaWZmZXJlbnQgdXNlcnNwYWNlIHN0 YWNrcywgYW5kIAp0aGF0IHdvdWxkIGluY3JlYXNlIHRoZSByaXNrIG9mIGJyZWFraW5nIHVzZXJz cGFjZS4gSSdkIHJhdGhlciBoYXZlIGFuIApleHBsaWNpdGx5IGRvY3VtZW50ZWQgd2F5IHRvIHBl cmZvcm0gc3VjaCBjaGVja3MuCgo+ID4+IEFsc28sIHdoZXJlJ3MgdGhlIHVzZXJzcGFjZSB0aGF0 IHdhbnRzIHRoaXMgZmVhdHVyZT8KPiA+PiAKPiA+PiA8c25pcD4KPiA+PiAKPiA+Pj4gZGlmZiAt LWdpdCBhL2luY2x1ZGUvZHJtL2RybV9wbGFuZS5oIGIvaW5jbHVkZS9kcm0vZHJtX3BsYW5lLmgK PiA+Pj4gaW5kZXggODE4NWUzNDY4YTIzLi41YTZmMjk1MjRmMTIgMTAwNjQ0Cj4gPj4+IC0tLSBh L2luY2x1ZGUvZHJtL2RybV9wbGFuZS5oCj4gPj4+ICsrKyBiL2luY2x1ZGUvZHJtL2RybV9wbGFu ZS5oCj4gPj4+IEBAIC00Miw2ICs0Miw3IEBAIHN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0 eDsKPiA+Pj4gICAqIHBsYW5lIChpbiAxNi4xNikKPiA+Pj4gICAqIEBzcmNfdzogd2lkdGggb2Yg dmlzaWJsZSBwb3J0aW9uIG9mIHBsYW5lIChpbiAxNi4xNikKPiA+Pj4gICAqIEBzcmNfaDogaGVp Z2h0IG9mIHZpc2libGUgcG9ydGlvbiBvZiBwbGFuZSAoaW4gMTYuMTYpCj4gPj4+ICsgKiBAYWxw aGE6IG9wYWNpdHkgb2YgdGhlIHBsYW5lCj4gPj4+ICAgKiBAcm90YXRpb246IHJvdGF0aW9uIG9m IHRoZSBwbGFuZQo+ID4+PiAgICogQHpwb3M6IHByaW9yaXR5IG9mIHRoZSBnaXZlbiBwbGFuZSBv biBjcnRjIChvcHRpb25hbCkKPiA+Pj4gICAqIE5vdGUgdGhhdCBtdWx0aXBsZSBhY3RpdmUgcGxh bmVzIG9uIHRoZSBzYW1lIGNydGMgY2FuIGhhdmUgYW4KPiA+Pj4gICBpZGVudGljYWwKPiA+Pj4g QEAgLTEwNSw2ICsxMDYsOSBAQCBzdHJ1Y3QgZHJtX3BsYW5lX3N0YXRlIHsKPiA+Pj4gICAgIHVp bnQzMl90IHNyY194LCBzcmNfeTsKPiA+Pj4gICAgIHVpbnQzMl90IHNyY19oLCBzcmNfdzsKPiA+ Pj4gCj4gPj4+ICsgICAvKiBQbGFuZSBvcGFjaXR5ICovCj4gPj4+ICsgICB1OCBhbHBoYTsKPiA+ PiAKPiA+PiBXZSBtYXkgd2FudCB0byBtYWtlIHRoYXQgdTE2LiBUaGUgZ2VuZXJhbCB3ZSBleHBl Y3QgMTZicGMgZm9yIG1vc3QgY29sb3IKPiA+PiByZWxhdGVkIHRoaW5ncywgYnV0IHNpbmNlIHRo aXMgaXMgYSByYW5nZSBwcm9wIEkgc3VwcG9zZSB3ZSBzaG91bGQganVzdAo+ID4+IGV4cG9zZSB0 aGUgYWN0dWFsIGhhcmR3YXJlIHJhbmdlLiBCdXQgbWFraW5nIGl0IHUxNiBtaWdodCBhdm9pZCBz b21lIGhlYWQKPiA+PiBzY3JhdGNoaW5nIGZvciB0aGUgZmlyc3QgcGVyc29uIHRvIGhhdmUgaGFy ZHdhcmUgd2l0aCBoaWdoZXIgcHJlY2lzaW9uLgo+ID4+IEVpdGhlciB0aGF0IG9yIHdlIHNob3Vs ZCBtYWtlIHRoZSBwcm9wIGNyZWF0aW9uIGZhaWwgaWYgdGhlIGRyaXZlciBhc2tzCj4gPj4gZm9y IG1vcmUgYml0cyB0aGFuIHdlIGhhdmUgaW4gdGhlIHN0YXRlLgo+ID4gCj4gPiBJJ20gdGVtcHRl ZCB0byBnbyBvbmUgc3RlcCBmdXJ0aGVyIGFuZCBhbHdheXMgbWFrZSB0aGUgYWxwaGEgcHJvcGVy dHkKPiA+IDE2LWJpdHMgd2lkZSBmb3IgbmV3IHVzZXJzICh3ZSBjYW4ndCBkbyBzbyBmb3IgZXhp c3RpbmcgdXNlcnMgYXMgaXQgY291bGQKPiA+IGJyZWFrIHVzZXJzcGFjZSksIGFuZCBsZXQgZHJp dmVycyBjb252ZXJ0IHRoYXQgaW50ZXJuYWxseSB0byB0aGUgcmFuZ2UKPiA+IHRoZXkgbmVlZC4g VGhlcmUgY291bGQgaG93ZXZlciBiZSBkcmF3YmFja3MgSSBkb24ndCBmb3Jlc2VlLgo+IAo+IEkg dGhpbmsgc2NhbGluZyB0aGUgcmFuZ2UgdG8gbWF0Y2ggdGhlIGh3IGlzIHRoZSBtb3N0IHNlbnNp YmxlICh5ZXMKPiBJJ20gZmxpcC1mbG9wcGluZyBhcm91bmQgaGVyZSkuCgpTbyB5b3UgbWVhbiBr ZWVwaW5nIHRoZSBwcm9wb3NlZCBpbXBsZW1lbnRhdGlvbiwgd2l0aCBhIGRyaXZlci1zcGVjaWZp YyAKbWF4aW11bSB2YWx1ZSA/Cgo+IEFuZCBvbmNlIHNvbWVvbmUgbmVlZHMgbW9yZSB0aGFuIHU4 LCB3ZSBjYW4gZXh0ZW5kIHRoZSBpbnRlcm5hbAo+IHJlcHJlc2VudGF0aW9uIGVhc2lseS4gVGhl IGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIGluIHRoZSBwcm9wZXJ0eSBpcyBhbgo+IHU2NCwgdGhh dCAvc2hvdWxkLyBiZSBlbm91Z2ggZm9yIHRoZSBuZXh0IGZldyB5ZWFycyA6LSkKClRoZSBleHRl cm5hbCByZXByZXNlbnRhdGlvbiBpcyBzcGxpdCBpbiB0d28gcGFydHMuIFRoZSB2YWx1ZSBpcyBz dG9yZWQgaW4gYSAKNjQtYml0cyBmaWVsZCwgYW5kIHRoYXQgaXMgc2FmZS4gVGhlIHNlY29uZCBw YXJ0IG9mIHRoZSByZXByZXNlbnRhdGlvbiBpcyB0aGUgCm1pbmltdW0gKGhhcmRjb2RlZCB0byAw KSBhbmQgbWF4aW11bSAoY3VycmVudGx5IHZhcmlhYmxlKSB2YWx1ZXMgcmVwb3J0ZWQgYnkgCnRo ZSBwcm9wZXJ0eS4gV2hhdCB3ZSBuZWVkIHRvIGRlY2lkZSBub3cgaXMgd2hldGhlciB0byBoYXJk Y29kZSB0aGUgbWF4aW11bSAKdmFsdWUgdG8gMHhmZmZmIGZvciBhbGwgbmV3IHVzZXJzIG9mIHRo ZSBhbHBoYSBwcm9wZXJ0eSwgb3IgdG8gYWx3YXlzIGV4cG9zZSAKdGhlIGhhcmR3YXJlIHJhbmdl LgoKPiA+PiBPaCwgYW5kIHlvdSBzaG91bGQgcGx1ZyB0aGlzIGludG8gdGhlIHN0YXRlIGR1bXBl ciBhcyB3ZWxsLgo+ID4+IAo+ID4+PiArCj4gPj4+IAo+ID4+PiAgICAgLyogUGxhbmUgcm90YXRp b24gKi8KPiA+Pj4gICAgIHVuc2lnbmVkIGludCByb3RhdGlvbjsKPiA+Pj4gQEAgLTQ4MSw2ICs0 ODUsNyBAQCBlbnVtIGRybV9wbGFuZV90eXBlIHsKPiA+Pj4gICAqIEBmdW5jczogaGVscGVyIGZ1 bmN0aW9ucwo+ID4+PiAgICogQHByb3BlcnRpZXM6IHByb3BlcnR5IHRyYWNraW5nIGZvciB0aGlz IHBsYW5lCj4gPj4+ICAgKiBAdHlwZTogdHlwZSBvZiBwbGFuZSAob3ZlcmxheSwgcHJpbWFyeSwg Y3Vyc29yKQo+ID4+PiArICogQGFscGhhX3Byb3BlcnR5OiBhbHBoYSBwcm9wZXJ0eSBmb3IgdGhp cyBwbGFuZQo+ID4+PiAgICogQHpwb3NfcHJvcGVydHk6IHpwb3MgcHJvcGVydHkgZm9yIHRoaXMg cGxhbmUKPiA+Pj4gICAqIEByb3RhdGlvbl9wcm9wZXJ0eTogcm90YXRpb24gcHJvcGVydHkgZm9y IHRoaXMgcGxhbmUKPiA+Pj4gICAqIEBoZWxwZXJfcHJpdmF0ZTogbWlkLWxheWVyIHByaXZhdGUg ZGF0YQo+ID4+PiBAQCAtNTU2LDYgKzU2MSw3IEBAIHN0cnVjdCBkcm1fcGxhbmUgewo+ID4+PiAg ICAgICovCj4gPj4+ICAgICAKPiA+Pj4gICAgIHN0cnVjdCBkcm1fcGxhbmVfc3RhdGUgKnN0YXRl Owo+ID4+PiArICAgc3RydWN0IGRybV9wcm9wZXJ0eSAqYWxwaGFfcHJvcGVydHk7Cj4gPj4+ICAg ICBzdHJ1Y3QgZHJtX3Byb3BlcnR5ICp6cG9zX3Byb3BlcnR5Owo+ID4+PiAgICAgc3RydWN0IGRy bV9wcm9wZXJ0eSAqcm90YXRpb25fcHJvcGVydHk7Cj4gPj4+ICB9OwoKLS0gClJlZ2FyZHMsCgpM YXVyZW50IFBpbmNoYXJ0CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3Rv cC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmkt ZGV2ZWwK