From mboxrd@z Thu Jan 1 00:00:00 1970 From: laurent.pinchart@ideasonboard.com (Laurent Pinchart) Date: Mon, 19 Feb 2018 22:13:33 +0200 Subject: [PATCH v3 1/8] drm/blend: Add a generic alpha property In-Reply-To: <9403570d73b6eb63ab87488d5e8eb767ba6f1ac7.1518802627.git-series.maxime.ripard@bootlin.com> References: <9403570d73b6eb63ab87488d5e8eb767ba6f1ac7.1518802627.git-series.maxime.ripard@bootlin.com> Message-ID: <2494939.fLDpe3p0Lt@avalon> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Maxime, Thank you for the patch. On Friday, 16 February 2018 19:39:29 EET 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. The alpha value is represented as straight alpha, ie the colors > haven't been pre-adjusted for their opacity by multiplication. Therefore, > the equation to get a color value for one pixel, assuming two planes A and > B, will be (color_a * alpha_a + color_b * alpha_b * (MAX - alpha_a) / MAX) > / (alpha_a + alpha_b * (MAX - alpha_a) / MAX) > ,,"""colorkey""",RANGE,"Min=0, Max=0x01ffffff",Plane,TBD > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c > index 7d9ad20040a1..3defc56a1ef2 100644 > --- a/drivers/gpu/drm/drm_atomic.c > +++ b/drivers/gpu/drm/drm_atomic.c > @@ -753,6 +753,8 @@ static int drm_atomic_plane_set_property(struct > drm_plane *plane, state->src_w = val; > } else if (property == config->prop_src_h) { > state->src_h = val; > + } else if (property == plane->alpha_property) { > + state->alpha = val; > } else if (property == plane->rotation_property) { > if (!is_power_of_2(val & DRM_MODE_ROTATE_MASK)) > return -EINVAL; > @@ -814,6 +816,8 @@ drm_atomic_plane_get_property(struct drm_plane *plane, > *val = state->src_w; > } else if (property == config->prop_src_h) { > *val = state->src_h; > + } else if (property == plane->alpha_property) { > + *val = state->alpha; > } else if (property == plane->rotation_property) { > *val = state->rotation; > } else if (property == plane->zpos_property) { > diff --git a/drivers/gpu/drm/drm_atomic_helper.c > b/drivers/gpu/drm/drm_atomic_helper.c index ae3cbfe9e01c..2b88f593aab4 > 100644 > --- a/drivers/gpu/drm/drm_atomic_helper.c > +++ b/drivers/gpu/drm/drm_atomic_helper.c > @@ -3482,6 +3482,10 @@ void drm_atomic_helper_plane_reset(struct drm_plane > *plane) if (plane->state) { > plane->state->plane = plane; > plane->state->rotation = DRM_MODE_ROTATE_0; > + > + /* Reset the alpha value to fully opaque if it matters */ > + if (plane->alpha_property) > + plane->state->alpha = plane->alpha_property->values[1]; > } > } > EXPORT_SYMBOL(drm_atomic_helper_plane_reset); > diff --git a/drivers/gpu/drm/drm_blend.c b/drivers/gpu/drm/drm_blend.c > index 4c62dff14893..a5dea7cbed2c 100644 > --- a/drivers/gpu/drm/drm_blend.c > +++ b/drivers/gpu/drm/drm_blend.c > @@ -104,6 +104,38 @@ > */ > > /** > + * drm_plane_create_alpha_property - create a new alpha property > + * @plane: drm plane > + * @max_alpha: maximum value of alpha > + * > + * This function initializes a generic, mutable, alpha property and > + * enables support for it in the DRM core. s/initializes/creates/ I would also mention that it attaches the property to the plane. > + * The alpha property will be allowed to be within the bounds of 0 > + * (transparent) to @max_alpha (opaque) s/$/./ > + * > + * Returns: > + * 0 on success, negative error code on failure. > + */ > +int drm_plane_create_alpha_property(struct drm_plane *plane, u16 max_alpha) > +{ > + struct drm_property *prop; > + > + prop = drm_property_create_range(plane->dev, 0, "alpha", 0, max_alpha); > + if (!prop) > + return -ENOMEM; > + > + drm_object_attach_property(&plane->base, prop, max_alpha); > + plane->alpha_property = prop; > + > + if (plane->state) > + plane->state->alpha = max_alpha; > + > + return 0; > +} > +EXPORT_SYMBOL(drm_plane_create_alpha_property); > + > +/** > * drm_plane_create_rotation_property - create a new rotation property > * @plane: drm plane > * @rotation: initial value of the rotation property > diff --git a/include/drm/drm_blend.h b/include/drm/drm_blend.h > index 17606026590b..e5affba6ebde 100644 > --- a/include/drm/drm_blend.h > +++ b/include/drm/drm_blend.h > @@ -36,6 +36,7 @@ static inline bool drm_rotation_90_or_270(unsigned int > rotation) return rotation & (DRM_MODE_ROTATE_90 | DRM_MODE_ROTATE_270); > } > > +int drm_plane_create_alpha_property(struct drm_plane *plane, u16 alpha); > int drm_plane_create_rotation_property(struct drm_plane *plane, > unsigned int rotation, > unsigned int supported_rotations); > 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; > + > /* 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: Mon, 19 Feb 2018 22:13:33 +0200 Message-ID: <2494939.fLDpe3p0Lt@avalon> References: <9403570d73b6eb63ab87488d5e8eb767ba6f1ac7.1518802627.git-series.maxime.ripard@bootlin.com> 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 EEBD46E320 for ; Mon, 19 Feb 2018 20:12:54 +0000 (UTC) In-Reply-To: <9403570d73b6eb63ab87488d5e8eb767ba6f1ac7.1518802627.git-series.maxime.ripard@bootlin.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: Maxime Ripard , Boris Brezillon , Chen-Yu Tsai , Daniel Vetter , linux-arm-kernel@lists.infradead.org List-Id: dri-devel@lists.freedesktop.org SGkgTWF4aW1lLAoKVGhhbmsgeW91IGZvciB0aGUgcGF0Y2guCgpPbiBGcmlkYXksIDE2IEZlYnJ1 YXJ5IDIwMTggMTk6Mzk6MjkgRUVUIE1heGltZSBSaXBhcmQgd3JvdGU6Cj4gU29tZSBkcml2ZXJz IGR1cGxpY2F0ZSB0aGUgbG9naWMgdG8gY3JlYXRlIGEgcHJvcGVydHkgdG8gc3RvcmUgYSBwZXIt cGxhbmUKPiBhbHBoYS4KPiAKPiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHdlIGV2ZXIg d2FudCB0byBzdXBwb3J0IGV4dHJhIHByb3RvY29scyBmb3IKPiBXYXlsYW5kIGxpa2U6Cj4gaHR0 cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvd2F5bGFuZC1kZXZlbC8yMDE3LUF1 Z3VzdC8wMzQ3NDEuaHRtbAo+IAo+IExldCdzIGNyZWF0ZSBhIGhlbHBlciBpbiBvcmRlciB0byBt b3ZlIHRoYXQgdG8gdGhlIGNvcmUuCj4gCj4gQ2M6IExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQu cGluY2hhcnRAaWRlYXNvbmJvYXJkLmNvbT4KPiBSZXZpZXdlZC1ieTogQm9yaXMgQnJlemlsbG9u IDxib3Jpcy5icmV6aWxsb25AYm9vdGxpbi5jb20+Cj4gU2lnbmVkLW9mZi1ieTogTWF4aW1lIFJp cGFyZCA8bWF4aW1lLnJpcGFyZEBib290bGluLmNvbT4KPiAtLS0KPiAgRG9jdW1lbnRhdGlvbi9n cHUva21zLXByb3BlcnRpZXMuY3N2IHwgIDIgKy0KPiAgZHJpdmVycy9ncHUvZHJtL2RybV9hdG9t aWMuYyAgICAgICAgIHwgIDQgKysrKy0KPiAgZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfaGVs cGVyLmMgIHwgIDQgKysrKy0KPiAgZHJpdmVycy9ncHUvZHJtL2RybV9ibGVuZC5jICAgICAgICAg IHwgMzIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKystCj4gIGluY2x1ZGUvZHJtL2RybV9i bGVuZC5oICAgICAgICAgICAgICB8ICAxICstCj4gIGluY2x1ZGUvZHJtL2RybV9wbGFuZS5oICAg ICAgICAgICAgICB8ICA2ICsrKysrLQo+ICA2IGZpbGVzIGNoYW5nZWQsIDQ4IGluc2VydGlvbnMo KyksIDEgZGVsZXRpb24oLSkKPiAKPiBkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ncHUva21z LXByb3BlcnRpZXMuY3N2Cj4gYi9Eb2N1bWVudGF0aW9uL2dwdS9rbXMtcHJvcGVydGllcy5jc3Yg aW5kZXggOTI3YjY1ZTE0MjE5Li4yNWFkMzUwM2Q2NjMKPiAxMDA2NDQKPiAtLS0gYS9Eb2N1bWVu dGF0aW9uL2dwdS9rbXMtcHJvcGVydGllcy5jc3YKPiArKysgYi9Eb2N1bWVudGF0aW9uL2dwdS9r bXMtcHJvcGVydGllcy5jc3YKPiBAQCAtOTksNSArOTksNSBAQCByYWRlb24sRFZJLUks4oCcY29o ZXJlbnTigJ0sUkFOR0UsIk1pbj0wLCBNYXg9MSIsQ29ubmVjdG9yLFRCRAo+ICwsIiIidW5kZXJz Y2FuIHZib3JkZXIiIiIsUkFOR0UsIk1pbj0wLCBNYXg9MTI4IixDb25uZWN0b3IsVEJECj4gICxB dWRpbyzigJxhdWRpb+KAnSxFTlVNLCJ7ICIib2ZmIiIsICIib24iIiwgIiJhdXRvIiIgfSIsQ29u bmVjdG9yLFRCRAo+ICAsRk1UIERpdGhlcmluZyzigJxkaXRoZXLigJ0sRU5VTSwieyAiIm9mZiIi LCAiIm9uIiIgfSIsQ29ubmVjdG9yLFRCRAo+IC1yY2FyLWR1LEdlbmVyaWMsIiIiYWxwaGEiIiIs UkFOR0UsIk1pbj0wLCBNYXg9MjU1IixQbGFuZSxUQkQKPiArLCwiIiJhbHBoYSIiIixSQU5HRSwi TWluPTAsIE1heD1Ecml2ZXIgZGVwZW5kYW50IixQbGFuZSxPcGFjaXR5IG9mIHRoZQo+IHBsYW5l IGZyb20gdHJhbnNwYXJlbnQgKDApIHRvIGZ1bGx5IG9wYXF1ZSAoTUFYKS4gSWYgdGhpcyBwcm9w ZXJ0eSBpcyBzZXQKPiB0byBhIHZhbHVlIGRpZmZlcmVudCB0aGFuIG1heCwgYW5kIHRoYXQgdGhl IHBpeGVsIHdpbGwgZGVmaW5lIGFuIGFscGhhCj4gY29tcG9uZW50LCB0aGUgcHJvcGVydHkgd2ls bCBoYXZlIHByZWNlbmRhbmNlIGFuZCB0aGUgcGl4ZWwgdmFsdWUgd2lsbCBiZQo+IGlnbm9yZWQu IFRoZSBhbHBoYSB2YWx1ZSBpcyByZXByZXNlbnRlZCBhcyBzdHJhaWdodCBhbHBoYSwgaWUgdGhl IGNvbG9ycwo+IGhhdmVuJ3QgYmVlbiBwcmUtYWRqdXN0ZWQgZm9yIHRoZWlyIG9wYWNpdHkgYnkg bXVsdGlwbGljYXRpb24uIFRoZXJlZm9yZSwKPiB0aGUgZXF1YXRpb24gdG8gZ2V0IGEgY29sb3Ig dmFsdWUgZm9yIG9uZSBwaXhlbCwgYXNzdW1pbmcgdHdvIHBsYW5lcyBBIGFuZAo+IEIsIHdpbGwg YmUgKGNvbG9yX2EgKiBhbHBoYV9hICsgY29sb3JfYiAqIGFscGhhX2IgKiAoTUFYIC0gYWxwaGFf YSkgLyBNQVgpCj4gLyAoYWxwaGFfYSArIGFscGhhX2IgKiAoTUFYIC0gYWxwaGFfYSkgLyBNQVgp Cj4gLCwiIiJjb2xvcmtleSIiIixSQU5HRSwiTWluPTAsIE1heD0weDAxZmZmZmZmIixQbGFuZSxU QkQKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYyBiL2RyaXZlcnMv Z3B1L2RybS9kcm1fYXRvbWljLmMKPiBpbmRleCA3ZDlhZDIwMDQwYTEuLjNkZWZjNTZhMWVmMiAx MDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5jCj4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2RybV9hdG9taWMuYwo+IEBAIC03NTMsNiArNzUzLDggQEAgc3RhdGljIGludCBk cm1fYXRvbWljX3BsYW5lX3NldF9wcm9wZXJ0eShzdHJ1Y3QKPiBkcm1fcGxhbmUgKnBsYW5lLCBz dGF0ZS0+c3JjX3cgPSB2YWw7Cj4gIAl9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbmZpZy0+cHJv cF9zcmNfaCkgewo+ICAJCXN0YXRlLT5zcmNfaCA9IHZhbDsKPiArCX0gZWxzZSBpZiAocHJvcGVy dHkgPT0gcGxhbmUtPmFscGhhX3Byb3BlcnR5KSB7Cj4gKwkJc3RhdGUtPmFscGhhID0gdmFsOwo+ ICAJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBwbGFuZS0+cm90YXRpb25fcHJvcGVydHkpIHsKPiAg CQlpZiAoIWlzX3Bvd2VyX29mXzIodmFsICYgRFJNX01PREVfUk9UQVRFX01BU0spKQo+ICAJCQly ZXR1cm4gLUVJTlZBTDsKPiBAQCAtODE0LDYgKzgxNiw4IEBAIGRybV9hdG9taWNfcGxhbmVfZ2V0 X3Byb3BlcnR5KHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAo+ICAJCSp2YWwgPSBzdGF0ZS0+c3Jj X3c7Cj4gIAl9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbmZpZy0+cHJvcF9zcmNfaCkgewo+ICAJ CSp2YWwgPSBzdGF0ZS0+c3JjX2g7Cj4gKwl9IGVsc2UgaWYgKHByb3BlcnR5ID09IHBsYW5lLT5h bHBoYV9wcm9wZXJ0eSkgewo+ICsJCSp2YWwgPSBzdGF0ZS0+YWxwaGE7Cj4gIAl9IGVsc2UgaWYg KHByb3BlcnR5ID09IHBsYW5lLT5yb3RhdGlvbl9wcm9wZXJ0eSkgewo+ICAJCSp2YWwgPSBzdGF0 ZS0+cm90YXRpb247Cj4gIAl9IGVsc2UgaWYgKHByb3BlcnR5ID09IHBsYW5lLT56cG9zX3Byb3Bl cnR5KSB7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX2hlbHBlci5j Cj4gYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY19oZWxwZXIuYyBpbmRleCBhZTNjYmZlOWUw MWMuLjJiODhmNTkzYWFiNAo+IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRv bWljX2hlbHBlci5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfaGVscGVyLmMK PiBAQCAtMzQ4Miw2ICszNDgyLDEwIEBAIHZvaWQgZHJtX2F0b21pY19oZWxwZXJfcGxhbmVfcmVz ZXQoc3RydWN0IGRybV9wbGFuZQo+ICpwbGFuZSkgaWYgKHBsYW5lLT5zdGF0ZSkgewo+ICAJCXBs YW5lLT5zdGF0ZS0+cGxhbmUgPSBwbGFuZTsKPiAgCQlwbGFuZS0+c3RhdGUtPnJvdGF0aW9uID0g RFJNX01PREVfUk9UQVRFXzA7Cj4gKwo+ICsJCS8qIFJlc2V0IHRoZSBhbHBoYSB2YWx1ZSB0byBm dWxseSBvcGFxdWUgaWYgaXQgbWF0dGVycyAqLwo+ICsJCWlmIChwbGFuZS0+YWxwaGFfcHJvcGVy dHkpCj4gKwkJCXBsYW5lLT5zdGF0ZS0+YWxwaGEgPSBwbGFuZS0+YWxwaGFfcHJvcGVydHktPnZh bHVlc1sxXTsKPiAgCX0KPiAgfQo+ICBFWFBPUlRfU1lNQk9MKGRybV9hdG9taWNfaGVscGVyX3Bs YW5lX3Jlc2V0KTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9ibGVuZC5jIGIv ZHJpdmVycy9ncHUvZHJtL2RybV9ibGVuZC5jCj4gaW5kZXggNGM2MmRmZjE0ODkzLi5hNWRlYTdj YmVkMmMgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9ibGVuZC5jCj4gKysrIGIv ZHJpdmVycy9ncHUvZHJtL2RybV9ibGVuZC5jCj4gQEAgLTEwNCw2ICsxMDQsMzggQEAKPiAgICov Cj4gCj4gIC8qKgo+ICsgKiBkcm1fcGxhbmVfY3JlYXRlX2FscGhhX3Byb3BlcnR5IC0gY3JlYXRl IGEgbmV3IGFscGhhIHByb3BlcnR5Cj4gKyAqIEBwbGFuZTogZHJtIHBsYW5lCj4gKyAqIEBtYXhf YWxwaGE6IG1heGltdW0gdmFsdWUgb2YgYWxwaGEKPiArICoKPiArICogVGhpcyBmdW5jdGlvbiBp bml0aWFsaXplcyBhIGdlbmVyaWMsIG11dGFibGUsIGFscGhhIHByb3BlcnR5IGFuZAo+ICsgKiBl bmFibGVzIHN1cHBvcnQgZm9yIGl0IGluIHRoZSBEUk0gY29yZS4KCnMvaW5pdGlhbGl6ZXMvY3Jl YXRlcy8KCkkgd291bGQgYWxzbyBtZW50aW9uIHRoYXQgaXQgYXR0YWNoZXMgdGhlIHByb3BlcnR5 IHRvIHRoZSBwbGFuZS4KCj4gKyAqIFRoZSBhbHBoYSBwcm9wZXJ0eSB3aWxsIGJlIGFsbG93ZWQg dG8gYmUgd2l0aGluIHRoZSBib3VuZHMgb2YgMAo+ICsgKiAodHJhbnNwYXJlbnQpIHRvIEBtYXhf YWxwaGEgKG9wYXF1ZSkKCnMvJC8uLwoKPiArICoKPiArICogUmV0dXJuczoKPiArICogMCBvbiBz dWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCj4gKyAqLwo+ICtpbnQgZHJt X3BsYW5lX2NyZWF0ZV9hbHBoYV9wcm9wZXJ0eShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwgdTE2 IG1heF9hbHBoYSkKPiArewo+ICsJc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcDsKPiArCj4gKwlw cm9wID0gZHJtX3Byb3BlcnR5X2NyZWF0ZV9yYW5nZShwbGFuZS0+ZGV2LCAwLCAiYWxwaGEiLCAw LCBtYXhfYWxwaGEpOwo+ICsJaWYgKCFwcm9wKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsKPiAr CWRybV9vYmplY3RfYXR0YWNoX3Byb3BlcnR5KCZwbGFuZS0+YmFzZSwgcHJvcCwgbWF4X2FscGhh KTsKPiArCXBsYW5lLT5hbHBoYV9wcm9wZXJ0eSA9IHByb3A7Cj4gKwo+ICsJaWYgKHBsYW5lLT5z dGF0ZSkKPiArCQlwbGFuZS0+c3RhdGUtPmFscGhhID0gbWF4X2FscGhhOwo+ICsKPiArCXJldHVy biAwOwo+ICt9Cj4gK0VYUE9SVF9TWU1CT0woZHJtX3BsYW5lX2NyZWF0ZV9hbHBoYV9wcm9wZXJ0 eSk7Cj4gKwo+ICsvKioKPiAgICogZHJtX3BsYW5lX2NyZWF0ZV9yb3RhdGlvbl9wcm9wZXJ0eSAt IGNyZWF0ZSBhIG5ldyByb3RhdGlvbiBwcm9wZXJ0eQo+ICAgKiBAcGxhbmU6IGRybSBwbGFuZQo+ ICAgKiBAcm90YXRpb246IGluaXRpYWwgdmFsdWUgb2YgdGhlIHJvdGF0aW9uIHByb3BlcnR5Cj4g ZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9ibGVuZC5oIGIvaW5jbHVkZS9kcm0vZHJtX2Js ZW5kLmgKPiBpbmRleCAxNzYwNjAyNjU5MGIuLmU1YWZmYmE2ZWJkZSAxMDA2NDQKPiAtLS0gYS9p bmNsdWRlL2RybS9kcm1fYmxlbmQuaAo+ICsrKyBiL2luY2x1ZGUvZHJtL2RybV9ibGVuZC5oCj4g QEAgLTM2LDYgKzM2LDcgQEAgc3RhdGljIGlubGluZSBib29sIGRybV9yb3RhdGlvbl85MF9vcl8y NzAodW5zaWduZWQgaW50Cj4gcm90YXRpb24pIHJldHVybiByb3RhdGlvbiAmIChEUk1fTU9ERV9S T1RBVEVfOTAgfCBEUk1fTU9ERV9ST1RBVEVfMjcwKTsKPiAgfQo+IAo+ICtpbnQgZHJtX3BsYW5l X2NyZWF0ZV9hbHBoYV9wcm9wZXJ0eShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwgdTE2IGFscGhh KTsKPiAgaW50IGRybV9wbGFuZV9jcmVhdGVfcm90YXRpb25fcHJvcGVydHkoc3RydWN0IGRybV9w bGFuZSAqcGxhbmUsCj4gIAkJCQkgICAgICAgdW5zaWduZWQgaW50IHJvdGF0aW9uLAo+ICAJCQkJ ICAgICAgIHVuc2lnbmVkIGludCBzdXBwb3J0ZWRfcm90YXRpb25zKTsKPiBkaWZmIC0tZ2l0IGEv aW5jbHVkZS9kcm0vZHJtX3BsYW5lLmggYi9pbmNsdWRlL2RybS9kcm1fcGxhbmUuaAo+IGluZGV4 IDgxODVlMzQ2OGEyMy4uNWE2ZjI5NTI0ZjEyIDEwMDY0NAo+IC0tLSBhL2luY2x1ZGUvZHJtL2Ry bV9wbGFuZS5oCj4gKysrIGIvaW5jbHVkZS9kcm0vZHJtX3BsYW5lLmgKPiBAQCAtNDIsNiArNDIs NyBAQCBzdHJ1Y3QgZHJtX21vZGVzZXRfYWNxdWlyZV9jdHg7Cj4gICAqCXBsYW5lIChpbiAxNi4x NikKPiAgICogQHNyY193OiB3aWR0aCBvZiB2aXNpYmxlIHBvcnRpb24gb2YgcGxhbmUgKGluIDE2 LjE2KQo+ICAgKiBAc3JjX2g6IGhlaWdodCBvZiB2aXNpYmxlIHBvcnRpb24gb2YgcGxhbmUgKGlu IDE2LjE2KQo+ICsgKiBAYWxwaGE6IG9wYWNpdHkgb2YgdGhlIHBsYW5lCj4gICAqIEByb3RhdGlv bjogcm90YXRpb24gb2YgdGhlIHBsYW5lCj4gICAqIEB6cG9zOiBwcmlvcml0eSBvZiB0aGUgZ2l2 ZW4gcGxhbmUgb24gY3J0YyAob3B0aW9uYWwpCj4gICAqCU5vdGUgdGhhdCBtdWx0aXBsZSBhY3Rp dmUgcGxhbmVzIG9uIHRoZSBzYW1lIGNydGMgY2FuIGhhdmUgYW4gaWRlbnRpY2FsCj4gQEAgLTEw NSw2ICsxMDYsOSBAQCBzdHJ1Y3QgZHJtX3BsYW5lX3N0YXRlIHsKPiAgCXVpbnQzMl90IHNyY194 LCBzcmNfeTsKPiAgCXVpbnQzMl90IHNyY19oLCBzcmNfdzsKPiAKPiArCS8qIFBsYW5lIG9wYWNp dHkgKi8KPiArCXU4IGFscGhhOwo+ICsKPiAgCS8qIFBsYW5lIHJvdGF0aW9uICovCj4gIAl1bnNp Z25lZCBpbnQgcm90YXRpb247Cj4gCj4gQEAgLTQ4MSw2ICs0ODUsNyBAQCBlbnVtIGRybV9wbGFu ZV90eXBlIHsKPiAgICogQGZ1bmNzOiBoZWxwZXIgZnVuY3Rpb25zCj4gICAqIEBwcm9wZXJ0aWVz OiBwcm9wZXJ0eSB0cmFja2luZyBmb3IgdGhpcyBwbGFuZQo+ICAgKiBAdHlwZTogdHlwZSBvZiBw bGFuZSAob3ZlcmxheSwgcHJpbWFyeSwgY3Vyc29yKQo+ICsgKiBAYWxwaGFfcHJvcGVydHk6IGFs cGhhIHByb3BlcnR5IGZvciB0aGlzIHBsYW5lCj4gICAqIEB6cG9zX3Byb3BlcnR5OiB6cG9zIHBy b3BlcnR5IGZvciB0aGlzIHBsYW5lCj4gICAqIEByb3RhdGlvbl9wcm9wZXJ0eTogcm90YXRpb24g cHJvcGVydHkgZm9yIHRoaXMgcGxhbmUKPiAgICogQGhlbHBlcl9wcml2YXRlOiBtaWQtbGF5ZXIg cHJpdmF0ZSBkYXRhCj4gQEAgLTU1Niw2ICs1NjEsNyBAQCBzdHJ1Y3QgZHJtX3BsYW5lIHsKPiAg CSAqLwo+ICAJc3RydWN0IGRybV9wbGFuZV9zdGF0ZSAqc3RhdGU7Cj4gCj4gKwlzdHJ1Y3QgZHJt X3Byb3BlcnR5ICphbHBoYV9wcm9wZXJ0eTsKPiAgCXN0cnVjdCBkcm1fcHJvcGVydHkgKnpwb3Nf cHJvcGVydHk7Cj4gIAlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpyb3RhdGlvbl9wcm9wZXJ0eTsKPiAg fTsKCi0tIApSZWdhcmRzLAoKTGF1cmVudCBQaW5jaGFydAoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2 ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21h aWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==