From mboxrd@z Thu Jan 1 00:00:00 1970 From: laurent.pinchart@ideasonboard.com (Laurent Pinchart) Date: Wed, 04 Apr 2018 12:23:16 +0300 Subject: [PATCH v5 2/5] drm/atmel-hclcdc: Convert to the new generic alpha property In-Reply-To: <393827d6161e144a9182f07beab53cc1e68be62f.1522829034.git-series.maxime.ripard@bootlin.com> References: <393827d6161e144a9182f07beab53cc1e68be62f.1522829034.git-series.maxime.ripard@bootlin.com> Message-ID: <1787745.3vzAnH0I27@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:20 EEST Maxime Ripard wrote: > Now that we have support for per-plane alpha in the core, let's use it. > > Acked-by: Boris Brezillon > Signed-off-by: Maxime Ripard Reviewed-by: Laurent Pinchart > --- > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h | 13 +--- > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c | 89 ++---------------- > 2 files changed, 14 insertions(+), 88 deletions(-) > > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h index > ab32d5b268d2..60c937f42114 100644 > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h > @@ -299,7 +299,6 @@ struct atmel_hlcdc_layer { > struct atmel_hlcdc_plane { > struct drm_plane base; > struct atmel_hlcdc_layer layer; > - struct atmel_hlcdc_plane_properties *properties; > }; > > static inline struct atmel_hlcdc_plane * > @@ -346,18 +345,6 @@ struct atmel_hlcdc_dc_desc { > }; > > /** > - * Atmel HLCDC Plane properties. > - * > - * This structure stores plane property definitions. > - * > - * @alpha: alpha blending (or transparency) property > - * @rotation: rotation property > - */ > -struct atmel_hlcdc_plane_properties { > - struct drm_property *alpha; > -}; > - > -/** > * Atmel HLCDC Display Controller. > * > * @desc: HLCDC Display Controller description > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c > b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c index > e18800ed7cd1..73c875db45f4 100644 > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c > @@ -31,7 +31,6 @@ > * @src_y: y buffer position > * @src_w: buffer width > * @src_h: buffer height > - * @alpha: alpha blending of the plane > * @disc_x: x discard position > * @disc_y: y discard position > * @disc_w: discard width > @@ -54,8 +53,6 @@ struct atmel_hlcdc_plane_state { > uint32_t src_w; > uint32_t src_h; > > - u8 alpha; > - > int disc_x; > int disc_y; > int disc_w; > @@ -385,7 +382,7 @@ atmel_hlcdc_plane_update_general_settings(struct > atmel_hlcdc_plane *plane, cfg |= ATMEL_HLCDC_LAYER_LAEN; > else > cfg |= ATMEL_HLCDC_LAYER_GAEN | > - ATMEL_HLCDC_LAYER_GA(state->alpha); > + ATMEL_HLCDC_LAYER_GA(state->base.alpha >> 8); > } > > if (state->disc_h && state->disc_w) > @@ -553,7 +550,7 @@ atmel_hlcdc_plane_prepare_disc_area(struct > drm_crtc_state *c_state) > > if (!ovl_s->fb || > ovl_s->fb->format->has_alpha || > - ovl_state->alpha != 255) > + ovl_s->alpha != DRM_BLEND_ALPHA_OPAQUE) > continue; > > /* TODO: implement a smarter hidden area detection */ > @@ -829,51 +826,18 @@ static void atmel_hlcdc_plane_destroy(struct drm_plane > *p) drm_plane_cleanup(p); > } > > -static int atmel_hlcdc_plane_atomic_set_property(struct drm_plane *p, > - struct drm_plane_state *s, > - struct drm_property *property, > - uint64_t val) > -{ > - struct atmel_hlcdc_plane *plane = drm_plane_to_atmel_hlcdc_plane(p); > - struct atmel_hlcdc_plane_properties *props = plane->properties; > - struct atmel_hlcdc_plane_state *state = > - drm_plane_state_to_atmel_hlcdc_plane_state(s); > - > - if (property == props->alpha) > - state->alpha = val; > - else > - return -EINVAL; > - > - return 0; > -} > - > -static int atmel_hlcdc_plane_atomic_get_property(struct drm_plane *p, > - const struct drm_plane_state *s, > - struct drm_property *property, > - uint64_t *val) > -{ > - struct atmel_hlcdc_plane *plane = drm_plane_to_atmel_hlcdc_plane(p); > - struct atmel_hlcdc_plane_properties *props = plane->properties; > - const struct atmel_hlcdc_plane_state *state = > - container_of(s, const struct atmel_hlcdc_plane_state, base); > - > - if (property == props->alpha) > - *val = state->alpha; > - else > - return -EINVAL; > - > - return 0; > -} > - > -static int atmel_hlcdc_plane_init_properties(struct atmel_hlcdc_plane > *plane, - struct atmel_hlcdc_plane_properties *props) > +static int atmel_hlcdc_plane_init_properties(struct atmel_hlcdc_plane > *plane) { > const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc; > > if (desc->type == ATMEL_HLCDC_OVERLAY_LAYER || > - desc->type == ATMEL_HLCDC_CURSOR_LAYER) > - drm_object_attach_property(&plane->base.base, > - props->alpha, 255); > + desc->type == ATMEL_HLCDC_CURSOR_LAYER) { > + int ret; > + > + ret = drm_plane_create_alpha_property(&plane->base); > + if (ret) > + return ret; > + } > > if (desc->layout.xstride && desc->layout.pstride) { > int ret; > @@ -988,8 +952,8 @@ static void atmel_hlcdc_plane_reset(struct drm_plane *p) > return; > } > > - state->alpha = 255; > p->state = &state->base; > + p->state->alpha = DRM_BLEND_ALPHA_OPAQUE; > p->state->plane = p; > } > } > @@ -1042,13 +1006,10 @@ static const struct drm_plane_funcs > layer_plane_funcs = { .reset = atmel_hlcdc_plane_reset, > .atomic_duplicate_state = atmel_hlcdc_plane_atomic_duplicate_state, > .atomic_destroy_state = atmel_hlcdc_plane_atomic_destroy_state, > - .atomic_set_property = atmel_hlcdc_plane_atomic_set_property, > - .atomic_get_property = atmel_hlcdc_plane_atomic_get_property, > }; > > static int atmel_hlcdc_plane_create(struct drm_device *dev, > - const struct atmel_hlcdc_layer_desc *desc, > - struct atmel_hlcdc_plane_properties *props) > + const struct atmel_hlcdc_layer_desc *desc) > { > struct atmel_hlcdc_dc *dc = dev->dev_private; > struct atmel_hlcdc_plane *plane; > @@ -1060,7 +1021,6 @@ static int atmel_hlcdc_plane_create(struct drm_device > *dev, return -ENOMEM; > > atmel_hlcdc_layer_init(&plane->layer, desc, dc->hlcdc->regmap); > - plane->properties = props; > > if (desc->type == ATMEL_HLCDC_BASE_LAYER) > type = DRM_PLANE_TYPE_PRIMARY; > @@ -1081,7 +1041,7 @@ static int atmel_hlcdc_plane_create(struct drm_device > *dev, &atmel_hlcdc_layer_plane_helper_funcs); > > /* Set default property values*/ > - ret = atmel_hlcdc_plane_init_properties(plane, props); > + ret = atmel_hlcdc_plane_init_properties(plane); > if (ret) > return ret; > > @@ -1090,34 +1050,13 @@ static int atmel_hlcdc_plane_create(struct > drm_device *dev, return 0; > } > > -static struct atmel_hlcdc_plane_properties * > -atmel_hlcdc_plane_create_properties(struct drm_device *dev) > -{ > - struct atmel_hlcdc_plane_properties *props; > - > - props = devm_kzalloc(dev->dev, sizeof(*props), GFP_KERNEL); > - if (!props) > - return ERR_PTR(-ENOMEM); > - > - props->alpha = drm_property_create_range(dev, 0, "alpha", 0, 255); > - if (!props->alpha) > - return ERR_PTR(-ENOMEM); > - > - return props; > -} > - > int atmel_hlcdc_create_planes(struct drm_device *dev) > { > struct atmel_hlcdc_dc *dc = dev->dev_private; > - struct atmel_hlcdc_plane_properties *props; > const struct atmel_hlcdc_layer_desc *descs = dc->desc->layers; > int nlayers = dc->desc->nlayers; > int i, ret; > > - props = atmel_hlcdc_plane_create_properties(dev); > - if (IS_ERR(props)) > - return PTR_ERR(props); > - > dc->dscrpool = dmam_pool_create("atmel-hlcdc-dscr", dev->dev, > sizeof(struct atmel_hlcdc_dma_channel_dscr), > sizeof(u64), 0); > @@ -1130,7 +1069,7 @@ int atmel_hlcdc_create_planes(struct drm_device *dev) > descs[i].type != ATMEL_HLCDC_CURSOR_LAYER) > continue; > > - ret = atmel_hlcdc_plane_create(dev, &descs[i], props); > + ret = atmel_hlcdc_plane_create(dev, &descs[i]); > if (ret) > return ret; > } -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v5 2/5] drm/atmel-hclcdc: Convert to the new generic alpha property Date: Wed, 04 Apr 2018 12:23:16 +0300 Message-ID: <1787745.3vzAnH0I27@avalon> References: <393827d6161e144a9182f07beab53cc1e68be62f.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 5C04D6E20E for ; Wed, 4 Apr 2018 09:23:09 +0000 (UTC) In-Reply-To: <393827d6161e144a9182f07beab53cc1e68be62f.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 aWwgMjAxOCAxMTowNDoyMCBFRVNUIE1heGltZSBSaXBhcmQgd3JvdGU6Cj4gTm93IHRoYXQgd2Ug aGF2ZSBzdXBwb3J0IGZvciBwZXItcGxhbmUgYWxwaGEgaW4gdGhlIGNvcmUsIGxldCdzIHVzZSBp dC4KPiAKPiBBY2tlZC1ieTogQm9yaXMgQnJlemlsbG9uIDxib3Jpcy5icmV6aWxsb25AYm9vdGxp bi5jb20+Cj4gU2lnbmVkLW9mZi1ieTogTWF4aW1lIFJpcGFyZCA8bWF4aW1lLnJpcGFyZEBib290 bGluLmNvbT4KClJldmlld2VkLWJ5OiBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0 QGlkZWFzb25ib2FyZC5jb20+Cgo+IC0tLQo+ICBkcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMv YXRtZWxfaGxjZGNfZGMuaCAgICB8IDEzICstLS0KPiAgZHJpdmVycy9ncHUvZHJtL2F0bWVsLWhs Y2RjL2F0bWVsX2hsY2RjX3BsYW5lLmMgfCA4OSArKy0tLS0tLS0tLS0tLS0tLS0KPiAgMiBmaWxl cyBjaGFuZ2VkLCAxNCBpbnNlcnRpb25zKCspLCA4OCBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2F0bWVsLWhsY2RjL2F0bWVsX2hsY2RjX2RjLmgKPiBiL2Ry aXZlcnMvZ3B1L2RybS9hdG1lbC1obGNkYy9hdG1lbF9obGNkY19kYy5oIGluZGV4Cj4gYWIzMmQ1 YjI2OGQyLi42MGM5MzdmNDIxMTQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2F0bWVs LWhsY2RjL2F0bWVsX2hsY2RjX2RjLmgKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxj ZGMvYXRtZWxfaGxjZGNfZGMuaAo+IEBAIC0yOTksNyArMjk5LDYgQEAgc3RydWN0IGF0bWVsX2hs Y2RjX2xheWVyIHsKPiAgc3RydWN0IGF0bWVsX2hsY2RjX3BsYW5lIHsKPiAgCXN0cnVjdCBkcm1f cGxhbmUgYmFzZTsKPiAgCXN0cnVjdCBhdG1lbF9obGNkY19sYXllciBsYXllcjsKPiAtCXN0cnVj dCBhdG1lbF9obGNkY19wbGFuZV9wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzOwo+ICB9Owo+IAo+ICBz dGF0aWMgaW5saW5lIHN0cnVjdCBhdG1lbF9obGNkY19wbGFuZSAqCj4gQEAgLTM0NiwxOCArMzQ1 LDYgQEAgc3RydWN0IGF0bWVsX2hsY2RjX2RjX2Rlc2Mgewo+ICB9Owo+IAo+ICAvKioKPiAtICog QXRtZWwgSExDREMgUGxhbmUgcHJvcGVydGllcy4KPiAtICoKPiAtICogVGhpcyBzdHJ1Y3R1cmUg c3RvcmVzIHBsYW5lIHByb3BlcnR5IGRlZmluaXRpb25zLgo+IC0gKgo+IC0gKiBAYWxwaGE6IGFs cGhhIGJsZW5kaW5nIChvciB0cmFuc3BhcmVuY3kpIHByb3BlcnR5Cj4gLSAqIEByb3RhdGlvbjog cm90YXRpb24gcHJvcGVydHkKPiAtICovCj4gLXN0cnVjdCBhdG1lbF9obGNkY19wbGFuZV9wcm9w ZXJ0aWVzIHsKPiAtCXN0cnVjdCBkcm1fcHJvcGVydHkgKmFscGhhOwo+IC19Owo+IC0KPiAtLyoq Cj4gICAqIEF0bWVsIEhMQ0RDIERpc3BsYXkgQ29udHJvbGxlci4KPiAgICoKPiAgICogQGRlc2M6 IEhMQ0RDIERpc3BsYXkgQ29udHJvbGxlciBkZXNjcmlwdGlvbgo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMvYXRtZWxfaGxjZGNfcGxhbmUuYwo+IGIvZHJpdmVycy9n cHUvZHJtL2F0bWVsLWhsY2RjL2F0bWVsX2hsY2RjX3BsYW5lLmMgaW5kZXgKPiBlMTg4MDBlZDdj ZDEuLjczYzg3NWRiNDVmNCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxj ZGMvYXRtZWxfaGxjZGNfcGxhbmUuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9hdG1lbC1obGNk Yy9hdG1lbF9obGNkY19wbGFuZS5jCj4gQEAgLTMxLDcgKzMxLDYgQEAKPiAgICogQHNyY195OiB5 IGJ1ZmZlciBwb3NpdGlvbgo+ICAgKiBAc3JjX3c6IGJ1ZmZlciB3aWR0aAo+ICAgKiBAc3JjX2g6 IGJ1ZmZlciBoZWlnaHQKPiAtICogQGFscGhhOiBhbHBoYSBibGVuZGluZyBvZiB0aGUgcGxhbmUK PiAgICogQGRpc2NfeDogeCBkaXNjYXJkIHBvc2l0aW9uCj4gICAqIEBkaXNjX3k6IHkgZGlzY2Fy ZCBwb3NpdGlvbgo+ICAgKiBAZGlzY193OiBkaXNjYXJkIHdpZHRoCj4gQEAgLTU0LDggKzUzLDYg QEAgc3RydWN0IGF0bWVsX2hsY2RjX3BsYW5lX3N0YXRlIHsKPiAgCXVpbnQzMl90IHNyY193Owo+ ICAJdWludDMyX3Qgc3JjX2g7Cj4gCj4gLQl1OCBhbHBoYTsKPiAtCj4gIAlpbnQgZGlzY194Owo+ ICAJaW50IGRpc2NfeTsKPiAgCWludCBkaXNjX3c7Cj4gQEAgLTM4NSw3ICszODIsNyBAQCBhdG1l bF9obGNkY19wbGFuZV91cGRhdGVfZ2VuZXJhbF9zZXR0aW5ncyhzdHJ1Y3QKPiBhdG1lbF9obGNk Y19wbGFuZSAqcGxhbmUsIGNmZyB8PSBBVE1FTF9ITENEQ19MQVlFUl9MQUVOOwo+ICAJCWVsc2UK PiAgCQkJY2ZnIHw9IEFUTUVMX0hMQ0RDX0xBWUVSX0dBRU4gfAo+IC0JCQkgICAgICAgQVRNRUxf SExDRENfTEFZRVJfR0Eoc3RhdGUtPmFscGhhKTsKPiArCQkJICAgICAgIEFUTUVMX0hMQ0RDX0xB WUVSX0dBKHN0YXRlLT5iYXNlLmFscGhhID4+IDgpOwo+ICAJfQo+IAo+ICAJaWYgKHN0YXRlLT5k aXNjX2ggJiYgc3RhdGUtPmRpc2NfdykKPiBAQCAtNTUzLDcgKzU1MCw3IEBAIGF0bWVsX2hsY2Rj X3BsYW5lX3ByZXBhcmVfZGlzY19hcmVhKHN0cnVjdAo+IGRybV9jcnRjX3N0YXRlICpjX3N0YXRl KQo+IAo+ICAJCWlmICghb3ZsX3MtPmZiIHx8Cj4gIAkJICAgIG92bF9zLT5mYi0+Zm9ybWF0LT5o YXNfYWxwaGEgfHwKPiAtCQkgICAgb3ZsX3N0YXRlLT5hbHBoYSAhPSAyNTUpCj4gKwkJICAgIG92 bF9zLT5hbHBoYSAhPSBEUk1fQkxFTkRfQUxQSEFfT1BBUVVFKQo+ICAJCQljb250aW51ZTsKPiAK PiAgCQkvKiBUT0RPOiBpbXBsZW1lbnQgYSBzbWFydGVyIGhpZGRlbiBhcmVhIGRldGVjdGlvbiAq Lwo+IEBAIC04MjksNTEgKzgyNiwxOCBAQCBzdGF0aWMgdm9pZCBhdG1lbF9obGNkY19wbGFuZV9k ZXN0cm95KHN0cnVjdCBkcm1fcGxhbmUKPiAqcCkgZHJtX3BsYW5lX2NsZWFudXAocCk7Cj4gIH0K PiAKPiAtc3RhdGljIGludCBhdG1lbF9obGNkY19wbGFuZV9hdG9taWNfc2V0X3Byb3BlcnR5KHN0 cnVjdCBkcm1fcGxhbmUgKnAsCj4gLQkJCQkJCSBzdHJ1Y3QgZHJtX3BsYW5lX3N0YXRlICpzLAo+ IC0JCQkJCQkgc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHksCj4gLQkJCQkJCSB1aW50NjRf dCB2YWwpCj4gLXsKPiAtCXN0cnVjdCBhdG1lbF9obGNkY19wbGFuZSAqcGxhbmUgPSBkcm1fcGxh bmVfdG9fYXRtZWxfaGxjZGNfcGxhbmUocCk7Cj4gLQlzdHJ1Y3QgYXRtZWxfaGxjZGNfcGxhbmVf cHJvcGVydGllcyAqcHJvcHMgPSBwbGFuZS0+cHJvcGVydGllczsKPiAtCXN0cnVjdCBhdG1lbF9o bGNkY19wbGFuZV9zdGF0ZSAqc3RhdGUgPQo+IC0JCQlkcm1fcGxhbmVfc3RhdGVfdG9fYXRtZWxf aGxjZGNfcGxhbmVfc3RhdGUocyk7Cj4gLQo+IC0JaWYgKHByb3BlcnR5ID09IHByb3BzLT5hbHBo YSkKPiAtCQlzdGF0ZS0+YWxwaGEgPSB2YWw7Cj4gLQllbHNlCj4gLQkJcmV0dXJuIC1FSU5WQUw7 Cj4gLQo+IC0JcmV0dXJuIDA7Cj4gLX0KPiAtCj4gLXN0YXRpYyBpbnQgYXRtZWxfaGxjZGNfcGxh bmVfYXRvbWljX2dldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX3BsYW5lICpwLAo+IC0JCQkJCWNvbnN0 IHN0cnVjdCBkcm1fcGxhbmVfc3RhdGUgKnMsCj4gLQkJCQkJc3RydWN0IGRybV9wcm9wZXJ0eSAq cHJvcGVydHksCj4gLQkJCQkJdWludDY0X3QgKnZhbCkKPiAtewo+IC0Jc3RydWN0IGF0bWVsX2hs Y2RjX3BsYW5lICpwbGFuZSA9IGRybV9wbGFuZV90b19hdG1lbF9obGNkY19wbGFuZShwKTsKPiAt CXN0cnVjdCBhdG1lbF9obGNkY19wbGFuZV9wcm9wZXJ0aWVzICpwcm9wcyA9IHBsYW5lLT5wcm9w ZXJ0aWVzOwo+IC0JY29uc3Qgc3RydWN0IGF0bWVsX2hsY2RjX3BsYW5lX3N0YXRlICpzdGF0ZSA9 Cj4gLQkJY29udGFpbmVyX29mKHMsIGNvbnN0IHN0cnVjdCBhdG1lbF9obGNkY19wbGFuZV9zdGF0 ZSwgYmFzZSk7Cj4gLQo+IC0JaWYgKHByb3BlcnR5ID09IHByb3BzLT5hbHBoYSkKPiAtCQkqdmFs ID0gc3RhdGUtPmFscGhhOwo+IC0JZWxzZQo+IC0JCXJldHVybiAtRUlOVkFMOwo+IC0KPiAtCXJl dHVybiAwOwo+IC19Cj4gLQo+IC1zdGF0aWMgaW50IGF0bWVsX2hsY2RjX3BsYW5lX2luaXRfcHJv cGVydGllcyhzdHJ1Y3QgYXRtZWxfaGxjZGNfcGxhbmUKPiAqcGxhbmUsIC0JCQkJc3RydWN0IGF0 bWVsX2hsY2RjX3BsYW5lX3Byb3BlcnRpZXMgKnByb3BzKQo+ICtzdGF0aWMgaW50IGF0bWVsX2hs Y2RjX3BsYW5lX2luaXRfcHJvcGVydGllcyhzdHJ1Y3QgYXRtZWxfaGxjZGNfcGxhbmUKPiAqcGxh bmUpIHsKPiAgCWNvbnN0IHN0cnVjdCBhdG1lbF9obGNkY19sYXllcl9kZXNjICpkZXNjID0gcGxh bmUtPmxheWVyLmRlc2M7Cj4gCj4gIAlpZiAoZGVzYy0+dHlwZSA9PSBBVE1FTF9ITENEQ19PVkVS TEFZX0xBWUVSIHx8Cj4gLQkgICAgZGVzYy0+dHlwZSA9PSBBVE1FTF9ITENEQ19DVVJTT1JfTEFZ RVIpCj4gLQkJZHJtX29iamVjdF9hdHRhY2hfcHJvcGVydHkoJnBsYW5lLT5iYXNlLmJhc2UsCj4g LQkJCQkJICAgcHJvcHMtPmFscGhhLCAyNTUpOwo+ICsJICAgIGRlc2MtPnR5cGUgPT0gQVRNRUxf SExDRENfQ1VSU09SX0xBWUVSKSB7Cj4gKwkJaW50IHJldDsKPiArCj4gKwkJcmV0ID0gZHJtX3Bs YW5lX2NyZWF0ZV9hbHBoYV9wcm9wZXJ0eSgmcGxhbmUtPmJhc2UpOwo+ICsJCWlmIChyZXQpCj4g KwkJCXJldHVybiByZXQ7Cj4gKwl9Cj4gCj4gIAlpZiAoZGVzYy0+bGF5b3V0LnhzdHJpZGUgJiYg ZGVzYy0+bGF5b3V0LnBzdHJpZGUpIHsKPiAgCQlpbnQgcmV0Owo+IEBAIC05ODgsOCArOTUyLDgg QEAgc3RhdGljIHZvaWQgYXRtZWxfaGxjZGNfcGxhbmVfcmVzZXQoc3RydWN0IGRybV9wbGFuZSAq cCkKPiByZXR1cm47Cj4gIAkJfQo+IAo+IC0JCXN0YXRlLT5hbHBoYSA9IDI1NTsKPiAgCQlwLT5z dGF0ZSA9ICZzdGF0ZS0+YmFzZTsKPiArCQlwLT5zdGF0ZS0+YWxwaGEgPSBEUk1fQkxFTkRfQUxQ SEFfT1BBUVVFOwo+ICAJCXAtPnN0YXRlLT5wbGFuZSA9IHA7Cj4gIAl9Cj4gIH0KPiBAQCAtMTA0 MiwxMyArMTAwNiwxMCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9wbGFuZV9mdW5jcwo+IGxh eWVyX3BsYW5lX2Z1bmNzID0geyAucmVzZXQgPSBhdG1lbF9obGNkY19wbGFuZV9yZXNldCwKPiAg CS5hdG9taWNfZHVwbGljYXRlX3N0YXRlID0gYXRtZWxfaGxjZGNfcGxhbmVfYXRvbWljX2R1cGxp Y2F0ZV9zdGF0ZSwKPiAgCS5hdG9taWNfZGVzdHJveV9zdGF0ZSA9IGF0bWVsX2hsY2RjX3BsYW5l X2F0b21pY19kZXN0cm95X3N0YXRlLAo+IC0JLmF0b21pY19zZXRfcHJvcGVydHkgPSBhdG1lbF9o bGNkY19wbGFuZV9hdG9taWNfc2V0X3Byb3BlcnR5LAo+IC0JLmF0b21pY19nZXRfcHJvcGVydHkg PSBhdG1lbF9obGNkY19wbGFuZV9hdG9taWNfZ2V0X3Byb3BlcnR5LAo+ICB9Owo+IAo+ICBzdGF0 aWMgaW50IGF0bWVsX2hsY2RjX3BsYW5lX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAo+ IC0JCQkJICAgIGNvbnN0IHN0cnVjdCBhdG1lbF9obGNkY19sYXllcl9kZXNjICpkZXNjLAo+IC0J CQkJICAgIHN0cnVjdCBhdG1lbF9obGNkY19wbGFuZV9wcm9wZXJ0aWVzICpwcm9wcykKPiArCQkJ CSAgICBjb25zdCBzdHJ1Y3QgYXRtZWxfaGxjZGNfbGF5ZXJfZGVzYyAqZGVzYykKPiAgewo+ICAJ c3RydWN0IGF0bWVsX2hsY2RjX2RjICpkYyA9IGRldi0+ZGV2X3ByaXZhdGU7Cj4gIAlzdHJ1Y3Qg YXRtZWxfaGxjZGNfcGxhbmUgKnBsYW5lOwo+IEBAIC0xMDYwLDcgKzEwMjEsNiBAQCBzdGF0aWMg aW50IGF0bWVsX2hsY2RjX3BsYW5lX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZQo+ICpkZXYsIHJl dHVybiAtRU5PTUVNOwo+IAo+ICAJYXRtZWxfaGxjZGNfbGF5ZXJfaW5pdCgmcGxhbmUtPmxheWVy LCBkZXNjLCBkYy0+aGxjZGMtPnJlZ21hcCk7Cj4gLQlwbGFuZS0+cHJvcGVydGllcyA9IHByb3Bz Owo+IAo+ICAJaWYgKGRlc2MtPnR5cGUgPT0gQVRNRUxfSExDRENfQkFTRV9MQVlFUikKPiAgCQl0 eXBlID0gRFJNX1BMQU5FX1RZUEVfUFJJTUFSWTsKPiBAQCAtMTA4MSw3ICsxMDQxLDcgQEAgc3Rh dGljIGludCBhdG1lbF9obGNkY19wbGFuZV9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UKPiAqZGV2 LCAmYXRtZWxfaGxjZGNfbGF5ZXJfcGxhbmVfaGVscGVyX2Z1bmNzKTsKPiAKPiAgCS8qIFNldCBk ZWZhdWx0IHByb3BlcnR5IHZhbHVlcyovCj4gLQlyZXQgPSBhdG1lbF9obGNkY19wbGFuZV9pbml0 X3Byb3BlcnRpZXMocGxhbmUsIHByb3BzKTsKPiArCXJldCA9IGF0bWVsX2hsY2RjX3BsYW5lX2lu aXRfcHJvcGVydGllcyhwbGFuZSk7Cj4gIAlpZiAocmV0KQo+ICAJCXJldHVybiByZXQ7Cj4gCj4g QEAgLTEwOTAsMzQgKzEwNTAsMTMgQEAgc3RhdGljIGludCBhdG1lbF9obGNkY19wbGFuZV9jcmVh dGUoc3RydWN0Cj4gZHJtX2RldmljZSAqZGV2LCByZXR1cm4gMDsKPiAgfQo+IAo+IC1zdGF0aWMg c3RydWN0IGF0bWVsX2hsY2RjX3BsYW5lX3Byb3BlcnRpZXMgKgo+IC1hdG1lbF9obGNkY19wbGFu ZV9jcmVhdGVfcHJvcGVydGllcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQo+IC17Cj4gLQlzdHJ1 Y3QgYXRtZWxfaGxjZGNfcGxhbmVfcHJvcGVydGllcyAqcHJvcHM7Cj4gLQo+IC0JcHJvcHMgPSBk ZXZtX2t6YWxsb2MoZGV2LT5kZXYsIHNpemVvZigqcHJvcHMpLCBHRlBfS0VSTkVMKTsKPiAtCWlm ICghcHJvcHMpCj4gLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cj4gLQo+IC0JcHJvcHMtPmFs cGhhID0gZHJtX3Byb3BlcnR5X2NyZWF0ZV9yYW5nZShkZXYsIDAsICJhbHBoYSIsIDAsIDI1NSk7 Cj4gLQlpZiAoIXByb3BzLT5hbHBoYSkKPiAtCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKPiAt Cj4gLQlyZXR1cm4gcHJvcHM7Cj4gLX0KPiAtCj4gIGludCBhdG1lbF9obGNkY19jcmVhdGVfcGxh bmVzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCj4gIHsKPiAgCXN0cnVjdCBhdG1lbF9obGNkY19k YyAqZGMgPSBkZXYtPmRldl9wcml2YXRlOwo+IC0Jc3RydWN0IGF0bWVsX2hsY2RjX3BsYW5lX3By b3BlcnRpZXMgKnByb3BzOwo+ICAJY29uc3Qgc3RydWN0IGF0bWVsX2hsY2RjX2xheWVyX2Rlc2Mg KmRlc2NzID0gZGMtPmRlc2MtPmxheWVyczsKPiAgCWludCBubGF5ZXJzID0gZGMtPmRlc2MtPm5s YXllcnM7Cj4gIAlpbnQgaSwgcmV0Owo+IAo+IC0JcHJvcHMgPSBhdG1lbF9obGNkY19wbGFuZV9j cmVhdGVfcHJvcGVydGllcyhkZXYpOwo+IC0JaWYgKElTX0VSUihwcm9wcykpCj4gLQkJcmV0dXJu IFBUUl9FUlIocHJvcHMpOwo+IC0KPiAgCWRjLT5kc2NycG9vbCA9IGRtYW1fcG9vbF9jcmVhdGUo ImF0bWVsLWhsY2RjLWRzY3IiLCBkZXYtPmRldiwKPiAgCQkJCXNpemVvZihzdHJ1Y3QgYXRtZWxf aGxjZGNfZG1hX2NoYW5uZWxfZHNjciksCj4gIAkJCQlzaXplb2YodTY0KSwgMCk7Cj4gQEAgLTEx MzAsNyArMTA2OSw3IEBAIGludCBhdG1lbF9obGNkY19jcmVhdGVfcGxhbmVzKHN0cnVjdCBkcm1f ZGV2aWNlICpkZXYpCj4gIAkJICAgIGRlc2NzW2ldLnR5cGUgIT0gQVRNRUxfSExDRENfQ1VSU09S X0xBWUVSKQo+ICAJCQljb250aW51ZTsKPiAKPiAtCQlyZXQgPSBhdG1lbF9obGNkY19wbGFuZV9j cmVhdGUoZGV2LCAmZGVzY3NbaV0sIHByb3BzKTsKPiArCQlyZXQgPSBhdG1lbF9obGNkY19wbGFu ZV9jcmVhdGUoZGV2LCAmZGVzY3NbaV0pOwo+ICAJCWlmIChyZXQpCj4gIAkJCXJldHVybiByZXQ7 Cj4gIAl9CgoKLS0gClJlZ2FyZHMsCgpMYXVyZW50IFBpbmNoYXJ0CgoKCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QK ZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9w Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=