From mboxrd@z Thu Jan 1 00:00:00 1970 From: laurent.pinchart@ideasonboard.com (Laurent Pinchart) Date: Wed, 04 Apr 2018 12:21:41 +0300 Subject: [PATCH v5 1/5] drm/blend: Add a generic alpha property In-Reply-To: <433cf537279d1cbd3d6e48e06341490e2c94443f.1522829034.git-series.maxime.ripard@bootlin.com> References: <433cf537279d1cbd3d6e48e06341490e2c94443f.1522829034.git-series.maxime.ripard@bootlin.com> Message-ID: <4523362.6qLWbm60l3@avalon> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Maxime, Thank you for the patch. On Wednesday, 4 April 2018 11:04:19 EEST 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: Eric Anholt > Reviewed-by: Boris Brezillon > Signed-off-by: Maxime Ripard Reviewed-by: Laurent Pinchart > --- > drivers/gpu/drm/drm_atomic.c | 4 +++- > drivers/gpu/drm/drm_atomic_helper.c | 4 +++- > drivers/gpu/drm/drm_blend.c | 37 ++++++++++++++++++++++++++++++- > include/drm/drm_blend.h | 3 ++- > include/drm/drm_plane.h | 6 +++++- > 5 files changed, 54 insertions(+) > > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c > index 7d25c42f22db..3d9ae057a6cd 100644 > --- a/drivers/gpu/drm/drm_atomic.c > +++ b/drivers/gpu/drm/drm_atomic.c > @@ -783,6 +783,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; > @@ -848,6 +850,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 ee03c1ed2521..0587a0a2f3aa > 100644 > --- a/drivers/gpu/drm/drm_atomic_helper.c > +++ b/drivers/gpu/drm/drm_atomic_helper.c > @@ -3500,6 +3500,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 5a81e1b4c076..3bc8d5e85435 100644 > --- a/drivers/gpu/drm/drm_blend.c > +++ b/drivers/gpu/drm/drm_blend.c > @@ -88,6 +88,11 @@ > * On top of this basic transformation additional properties can be exposed > by * the driver: > * > + * alpha: > + * Alpha is setup with drm_plane_create_alpha_property(). It controls the > + * plane-wide opacity, from transparent (0) to opaque (0xffff). It can be > + * combined with pixel alpha. > + * > * rotation: > * Rotation is set up with drm_plane_create_rotation_property(). It adds a > * rotation and reflection step between the source and destination > rectangles. @@ -106,6 +111,38 @@ > */ > > /** > + * drm_plane_create_alpha_property - create a new alpha property > + * @plane: drm plane > + * > + * This function creates a generic, mutable, alpha property and enables > support + * for it in the DRM core. It is attached to @plane. > + * > + * The alpha property will be allowed to be within the bounds of 0 > + * (transparent) to 0xffff (opaque). > + * > + * Returns: > + * 0 on success, negative error code on failure. > + */ > +int drm_plane_create_alpha_property(struct drm_plane *plane) > +{ > + struct drm_property *prop; > + > + prop = drm_property_create_range(plane->dev, 0, "alpha", > + 0, DRM_BLEND_ALPHA_OPAQUE); > + if (!prop) > + return -ENOMEM; > + > + drm_object_attach_property(&plane->base, prop, DRM_BLEND_ALPHA_OPAQUE); > + plane->alpha_property = prop; > + > + if (plane->state) > + plane->state->alpha = DRM_BLEND_ALPHA_OPAQUE; > + > + 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..330c561c4c11 100644 > --- a/include/drm/drm_blend.h > +++ b/include/drm/drm_blend.h > @@ -36,6 +36,9 @@ static inline bool drm_rotation_90_or_270(unsigned int > rotation) return rotation & (DRM_MODE_ROTATE_90 | DRM_MODE_ROTATE_270); > } > > +#define DRM_BLEND_ALPHA_OPAQUE 0xffff > + > +int drm_plane_create_alpha_property(struct drm_plane *plane); > 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 d6da26d66a4b..9563bd25f19b 100644 > --- a/include/drm/drm_plane.h > +++ b/include/drm/drm_plane.h > @@ -43,6 +43,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 > @@ -106,6 +107,9 @@ struct drm_plane_state { > uint32_t src_x, src_y; > uint32_t src_h, src_w; > > + /* Plane opacity */ > + u16 alpha; > + > /* Plane rotation */ > unsigned int rotation; > > @@ -496,6 +500,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 > @@ -571,6 +576,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 v5 1/5] drm/blend: Add a generic alpha property Date: Wed, 04 Apr 2018 12:21:41 +0300 Message-ID: <4523362.6qLWbm60l3@avalon> References: <433cf537279d1cbd3d6e48e06341490e2c94443f.1522829034.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 F0AB36E1ED for ; Wed, 4 Apr 2018 09:21:36 +0000 (UTC) In-Reply-To: <433cf537279d1cbd3d6e48e06341490e2c94443f.1522829034.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: Maxime Ripard Cc: dri-devel@lists.freedesktop.org, Stefan Schake , Boris Brezillon , Chen-Yu Tsai , Daniel Vetter , linux-arm-kernel@lists.infradead.org List-Id: dri-devel@lists.freedesktop.org SGkgTWF4aW1lLAoKVGhhbmsgeW91IGZvciB0aGUgcGF0Y2guCgpPbiBXZWRuZXNkYXksIDQgQXBy aWwgMjAxOCAxMTowNDoxOSBFRVNUIE1heGltZSBSaXBhcmQgd3JvdGU6Cj4gU29tZSBkcml2ZXJz IGR1cGxpY2F0ZSB0aGUgbG9naWMgdG8gY3JlYXRlIGEgcHJvcGVydHkgdG8gc3RvcmUgYSBwZXIt cGxhbmUKPiBhbHBoYS4KPiAKPiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHdlIGV2ZXIg d2FudCB0byBzdXBwb3J0IGV4dHJhIHByb3RvY29scyBmb3IKPiBXYXlsYW5kIGxpa2U6Cj4gaHR0 cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvd2F5bGFuZC1kZXZlbC8yMDE3LUF1 Z3VzdC8wMzQ3NDEuaHRtbAo+IAo+IExldCdzIGNyZWF0ZSBhIGhlbHBlciBpbiBvcmRlciB0byBt b3ZlIHRoYXQgdG8gdGhlIGNvcmUuCj4gCj4gQ2M6IExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQu cGluY2hhcnRAaWRlYXNvbmJvYXJkLmNvbT4KPiBSZXZpZXdlZC1ieTogRXJpYyBBbmhvbHQgPGVy aWNAYW5ob2x0Lm5ldD4KPiBSZXZpZXdlZC1ieTogQm9yaXMgQnJlemlsbG9uIDxib3Jpcy5icmV6 aWxsb25AYm9vdGxpbi5jb20+Cj4gU2lnbmVkLW9mZi1ieTogTWF4aW1lIFJpcGFyZCA8bWF4aW1l LnJpcGFyZEBib290bGluLmNvbT4KClJldmlld2VkLWJ5OiBMYXVyZW50IFBpbmNoYXJ0IDxsYXVy ZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+Cgo+IC0tLQo+ICBkcml2ZXJzL2dwdS9kcm0v ZHJtX2F0b21pYy5jICAgICAgICB8ICA0ICsrKy0KPiAgZHJpdmVycy9ncHUvZHJtL2RybV9hdG9t aWNfaGVscGVyLmMgfCAgNCArKystCj4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fYmxlbmQuYyAgICAg ICAgIHwgMzcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLQo+ICBpbmNsdWRlL2RybS9k cm1fYmxlbmQuaCAgICAgICAgICAgICB8ICAzICsrLQo+ICBpbmNsdWRlL2RybS9kcm1fcGxhbmUu aCAgICAgICAgICAgICB8ICA2ICsrKysrLQo+ICA1IGZpbGVzIGNoYW5nZWQsIDU0IGluc2VydGlv bnMoKykKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYyBiL2Ry aXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljLmMKPiBpbmRleCA3ZDI1YzQyZjIyZGIuLjNkOWFlMDU3 YTZjZCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5jCj4gKysrIGIv ZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYwo+IEBAIC03ODMsNiArNzgzLDggQEAgc3RhdGlj IGludCBkcm1fYXRvbWljX3BsYW5lX3NldF9wcm9wZXJ0eShzdHJ1Y3QKPiBkcm1fcGxhbmUgKnBs YW5lLCBzdGF0ZS0+c3JjX3cgPSB2YWw7Cj4gIAl9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbmZp Zy0+cHJvcF9zcmNfaCkgewo+ICAJCXN0YXRlLT5zcmNfaCA9IHZhbDsKPiArCX0gZWxzZSBpZiAo cHJvcGVydHkgPT0gcGxhbmUtPmFscGhhX3Byb3BlcnR5KSB7Cj4gKwkJc3RhdGUtPmFscGhhID0g dmFsOwo+ICAJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBwbGFuZS0+cm90YXRpb25fcHJvcGVydHkp IHsKPiAgCQlpZiAoIWlzX3Bvd2VyX29mXzIodmFsICYgRFJNX01PREVfUk9UQVRFX01BU0spKQo+ ICAJCQlyZXR1cm4gLUVJTlZBTDsKPiBAQCAtODQ4LDYgKzg1MCw4IEBAIGRybV9hdG9taWNfcGxh bmVfZ2V0X3Byb3BlcnR5KHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAo+ICAJCSp2YWwgPSBzdGF0 ZS0+c3JjX3c7Cj4gIAl9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbmZpZy0+cHJvcF9zcmNfaCkg ewo+ICAJCSp2YWwgPSBzdGF0ZS0+c3JjX2g7Cj4gKwl9IGVsc2UgaWYgKHByb3BlcnR5ID09IHBs YW5lLT5hbHBoYV9wcm9wZXJ0eSkgewo+ICsJCSp2YWwgPSBzdGF0ZS0+YWxwaGE7Cj4gIAl9IGVs c2UgaWYgKHByb3BlcnR5ID09IHBsYW5lLT5yb3RhdGlvbl9wcm9wZXJ0eSkgewo+ICAJCSp2YWwg PSBzdGF0ZS0+cm90YXRpb247Cj4gIAl9IGVsc2UgaWYgKHByb3BlcnR5ID09IHBsYW5lLT56cG9z X3Byb3BlcnR5KSB7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX2hl bHBlci5jCj4gYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY19oZWxwZXIuYyBpbmRleCBlZTAz YzFlZDI1MjEuLjA1ODdhMGEyZjNhYQo+IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9k cm1fYXRvbWljX2hlbHBlci5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfaGVs cGVyLmMKPiBAQCAtMzUwMCw2ICszNTAwLDEwIEBAIHZvaWQgZHJtX2F0b21pY19oZWxwZXJfcGxh bmVfcmVzZXQoc3RydWN0IGRybV9wbGFuZQo+ICpwbGFuZSkgaWYgKHBsYW5lLT5zdGF0ZSkgewo+ ICAJCXBsYW5lLT5zdGF0ZS0+cGxhbmUgPSBwbGFuZTsKPiAgCQlwbGFuZS0+c3RhdGUtPnJvdGF0 aW9uID0gRFJNX01PREVfUk9UQVRFXzA7Cj4gKwo+ICsJCS8qIFJlc2V0IHRoZSBhbHBoYSB2YWx1 ZSB0byBmdWxseSBvcGFxdWUgaWYgaXQgbWF0dGVycyAqLwo+ICsJCWlmIChwbGFuZS0+YWxwaGFf cHJvcGVydHkpCj4gKwkJCXBsYW5lLT5zdGF0ZS0+YWxwaGEgPSBwbGFuZS0+YWxwaGFfcHJvcGVy dHktPnZhbHVlc1sxXTsKPiAgCX0KPiAgfQo+ICBFWFBPUlRfU1lNQk9MKGRybV9hdG9taWNfaGVs cGVyX3BsYW5lX3Jlc2V0KTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9ibGVu ZC5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9ibGVuZC5jCj4gaW5kZXggNWE4MWUxYjRjMDc2Li4z YmM4ZDVlODU0MzUgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9ibGVuZC5jCj4g KysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9ibGVuZC5jCj4gQEAgLTg4LDYgKzg4LDExIEBACj4g ICAqIE9uIHRvcCBvZiB0aGlzIGJhc2ljIHRyYW5zZm9ybWF0aW9uIGFkZGl0aW9uYWwgcHJvcGVy dGllcyBjYW4gYmUgZXhwb3NlZAo+IGJ5ICogdGhlIGRyaXZlcjoKPiAgICoKPiArICogYWxwaGE6 Cj4gKyAqIAlBbHBoYSBpcyBzZXR1cCB3aXRoIGRybV9wbGFuZV9jcmVhdGVfYWxwaGFfcHJvcGVy dHkoKS4gSXQgY29udHJvbHMgdGhlCj4gKyAqIAlwbGFuZS13aWRlIG9wYWNpdHksIGZyb20gdHJh bnNwYXJlbnQgKDApIHRvIG9wYXF1ZSAoMHhmZmZmKS4gSXQgY2FuIGJlCj4gKyAqIAljb21iaW5l ZCB3aXRoIHBpeGVsIGFscGhhLgo+ICsgKgo+ICAgKiByb3RhdGlvbjoKPiAgICoJUm90YXRpb24g aXMgc2V0IHVwIHdpdGggZHJtX3BsYW5lX2NyZWF0ZV9yb3RhdGlvbl9wcm9wZXJ0eSgpLiBJdCBh ZGRzIGEKPiAgICoJcm90YXRpb24gYW5kIHJlZmxlY3Rpb24gc3RlcCBiZXR3ZWVuIHRoZSBzb3Vy Y2UgYW5kIGRlc3RpbmF0aW9uCj4gcmVjdGFuZ2xlcy4gQEAgLTEwNiw2ICsxMTEsMzggQEAKPiAg ICovCj4gCj4gIC8qKgo+ICsgKiBkcm1fcGxhbmVfY3JlYXRlX2FscGhhX3Byb3BlcnR5IC0gY3Jl YXRlIGEgbmV3IGFscGhhIHByb3BlcnR5Cj4gKyAqIEBwbGFuZTogZHJtIHBsYW5lCj4gKyAqCj4g KyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGdlbmVyaWMsIG11dGFibGUsIGFscGhhIHByb3Bl cnR5IGFuZCBlbmFibGVzCj4gc3VwcG9ydCArICogZm9yIGl0IGluIHRoZSBEUk0gY29yZS4gSXQg aXMgYXR0YWNoZWQgdG8gQHBsYW5lLgo+ICsgKgo+ICsgKiBUaGUgYWxwaGEgcHJvcGVydHkgd2ls bCBiZSBhbGxvd2VkIHRvIGJlIHdpdGhpbiB0aGUgYm91bmRzIG9mIDAKPiArICogKHRyYW5zcGFy ZW50KSB0byAweGZmZmYgKG9wYXF1ZSkuCj4gKyAqCj4gKyAqIFJldHVybnM6Cj4gKyAqIDAgb24g c3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgo+ICsgKi8KPiAraW50IGRy bV9wbGFuZV9jcmVhdGVfYWxwaGFfcHJvcGVydHkoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCj4g K3sKPiArCXN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3A7Cj4gKwo+ICsJcHJvcCA9IGRybV9wcm9w ZXJ0eV9jcmVhdGVfcmFuZ2UocGxhbmUtPmRldiwgMCwgImFscGhhIiwKPiArCQkJCQkgMCwgRFJN X0JMRU5EX0FMUEhBX09QQVFVRSk7Cj4gKwlpZiAoIXByb3ApCj4gKwkJcmV0dXJuIC1FTk9NRU07 Cj4gKwo+ICsJZHJtX29iamVjdF9hdHRhY2hfcHJvcGVydHkoJnBsYW5lLT5iYXNlLCBwcm9wLCBE Uk1fQkxFTkRfQUxQSEFfT1BBUVVFKTsKPiArCXBsYW5lLT5hbHBoYV9wcm9wZXJ0eSA9IHByb3A7 Cj4gKwo+ICsJaWYgKHBsYW5lLT5zdGF0ZSkKPiArCQlwbGFuZS0+c3RhdGUtPmFscGhhID0gRFJN X0JMRU5EX0FMUEhBX09QQVFVRTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICtFWFBPUlRfU1lN Qk9MKGRybV9wbGFuZV9jcmVhdGVfYWxwaGFfcHJvcGVydHkpOwo+ICsKPiArLyoqCj4gICAqIGRy bV9wbGFuZV9jcmVhdGVfcm90YXRpb25fcHJvcGVydHkgLSBjcmVhdGUgYSBuZXcgcm90YXRpb24g cHJvcGVydHkKPiAgICogQHBsYW5lOiBkcm0gcGxhbmUKPiAgICogQHJvdGF0aW9uOiBpbml0aWFs IHZhbHVlIG9mIHRoZSByb3RhdGlvbiBwcm9wZXJ0eQo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2Ry bS9kcm1fYmxlbmQuaCBiL2luY2x1ZGUvZHJtL2RybV9ibGVuZC5oCj4gaW5kZXggMTc2MDYwMjY1 OTBiLi4zMzBjNTYxYzRjMTEgMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2JsZW5kLmgK PiArKysgYi9pbmNsdWRlL2RybS9kcm1fYmxlbmQuaAo+IEBAIC0zNiw2ICszNiw5IEBAIHN0YXRp YyBpbmxpbmUgYm9vbCBkcm1fcm90YXRpb25fOTBfb3JfMjcwKHVuc2lnbmVkIGludAo+IHJvdGF0 aW9uKSByZXR1cm4gcm90YXRpb24gJiAoRFJNX01PREVfUk9UQVRFXzkwIHwgRFJNX01PREVfUk9U QVRFXzI3MCk7Cj4gIH0KPiAKPiArI2RlZmluZSBEUk1fQkxFTkRfQUxQSEFfT1BBUVVFCQkweGZm ZmYKPiArCj4gK2ludCBkcm1fcGxhbmVfY3JlYXRlX2FscGhhX3Byb3BlcnR5KHN0cnVjdCBkcm1f cGxhbmUgKnBsYW5lKTsKPiAgaW50IGRybV9wbGFuZV9jcmVhdGVfcm90YXRpb25fcHJvcGVydHko c3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCj4gIAkJCQkgICAgICAgdW5zaWduZWQgaW50IHJvdGF0 aW9uLAo+ICAJCQkJICAgICAgIHVuc2lnbmVkIGludCBzdXBwb3J0ZWRfcm90YXRpb25zKTsKPiBk aWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX3BsYW5lLmggYi9pbmNsdWRlL2RybS9kcm1fcGxh bmUuaAo+IGluZGV4IGQ2ZGEyNmQ2NmE0Yi4uOTU2M2JkMjVmMTliIDEwMDY0NAo+IC0tLSBhL2lu Y2x1ZGUvZHJtL2RybV9wbGFuZS5oCj4gKysrIGIvaW5jbHVkZS9kcm0vZHJtX3BsYW5lLmgKPiBA QCAtNDMsNiArNDMsNyBAQCBzdHJ1Y3QgZHJtX21vZGVzZXRfYWNxdWlyZV9jdHg7Cj4gICAqCXBs YW5lIChpbiAxNi4xNikKPiAgICogQHNyY193OiB3aWR0aCBvZiB2aXNpYmxlIHBvcnRpb24gb2Yg cGxhbmUgKGluIDE2LjE2KQo+ICAgKiBAc3JjX2g6IGhlaWdodCBvZiB2aXNpYmxlIHBvcnRpb24g b2YgcGxhbmUgKGluIDE2LjE2KQo+ICsgKiBAYWxwaGE6IG9wYWNpdHkgb2YgdGhlIHBsYW5lCj4g ICAqIEByb3RhdGlvbjogcm90YXRpb24gb2YgdGhlIHBsYW5lCj4gICAqIEB6cG9zOiBwcmlvcml0 eSBvZiB0aGUgZ2l2ZW4gcGxhbmUgb24gY3J0YyAob3B0aW9uYWwpCj4gICAqCU5vdGUgdGhhdCBt dWx0aXBsZSBhY3RpdmUgcGxhbmVzIG9uIHRoZSBzYW1lIGNydGMgY2FuIGhhdmUgYW4gaWRlbnRp Y2FsCj4gQEAgLTEwNiw2ICsxMDcsOSBAQCBzdHJ1Y3QgZHJtX3BsYW5lX3N0YXRlIHsKPiAgCXVp bnQzMl90IHNyY194LCBzcmNfeTsKPiAgCXVpbnQzMl90IHNyY19oLCBzcmNfdzsKPiAKPiArCS8q IFBsYW5lIG9wYWNpdHkgKi8KPiArCXUxNiBhbHBoYTsKPiArCj4gIAkvKiBQbGFuZSByb3RhdGlv biAqLwo+ICAJdW5zaWduZWQgaW50IHJvdGF0aW9uOwo+IAo+IEBAIC00OTYsNiArNTAwLDcgQEAg ZW51bSBkcm1fcGxhbmVfdHlwZSB7Cj4gICAqIEBmdW5jczogaGVscGVyIGZ1bmN0aW9ucwo+ICAg KiBAcHJvcGVydGllczogcHJvcGVydHkgdHJhY2tpbmcgZm9yIHRoaXMgcGxhbmUKPiAgICogQHR5 cGU6IHR5cGUgb2YgcGxhbmUgKG92ZXJsYXksIHByaW1hcnksIGN1cnNvcikKPiArICogQGFscGhh X3Byb3BlcnR5OiBhbHBoYSBwcm9wZXJ0eSBmb3IgdGhpcyBwbGFuZQo+ICAgKiBAenBvc19wcm9w ZXJ0eTogenBvcyBwcm9wZXJ0eSBmb3IgdGhpcyBwbGFuZQo+ICAgKiBAcm90YXRpb25fcHJvcGVy dHk6IHJvdGF0aW9uIHByb3BlcnR5IGZvciB0aGlzIHBsYW5lCj4gICAqIEBoZWxwZXJfcHJpdmF0 ZTogbWlkLWxheWVyIHByaXZhdGUgZGF0YQo+IEBAIC01NzEsNiArNTc2LDcgQEAgc3RydWN0IGRy bV9wbGFuZSB7Cj4gIAkgKi8KPiAgCXN0cnVjdCBkcm1fcGxhbmVfc3RhdGUgKnN0YXRlOwo+IAo+ ICsJc3RydWN0IGRybV9wcm9wZXJ0eSAqYWxwaGFfcHJvcGVydHk7Cj4gIAlzdHJ1Y3QgZHJtX3By b3BlcnR5ICp6cG9zX3Byb3BlcnR5Owo+ICAJc3RydWN0IGRybV9wcm9wZXJ0eSAqcm90YXRpb25f cHJvcGVydHk7CgotLSAKUmVnYXJkcywKCkxhdXJlbnQgUGluY2hhcnQKCgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlz dApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0 b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==