From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Laurent Pinchart To: Kieran Bingham Cc: linux-renesas-soc@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: Re: [PATCH v4 06/11] media: vsp1: Provide VSP1 feature helper macro Date: Thu, 24 May 2018 14:00:35 +0300 Message-ID: <2086855.Txm5IEeXWY@avalon> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-media-owner@vger.kernel.org List-ID: Hi Kieran, Thank you for the patch. On Thursday, 3 May 2018 16:36:17 EEST Kieran Bingham wrote: > The VSP1 devices define their specific capabilities through features > marked in their device info structure. Various parts of the code read > this info structure to infer if the features are available. > > Wrap this into a more readable vsp1_feature(vsp1, f) macro to ensure > that usage is consistent throughout the driver. > > Signed-off-by: Kieran Bingham Reviewed-by: Laurent Pinchart > --- > drivers/media/platform/vsp1/vsp1.h | 2 ++ > drivers/media/platform/vsp1/vsp1_drv.c | 16 ++++++++-------- > drivers/media/platform/vsp1/vsp1_wpf.c | 6 +++--- > 3 files changed, 13 insertions(+), 11 deletions(-) > > diff --git a/drivers/media/platform/vsp1/vsp1.h > b/drivers/media/platform/vsp1/vsp1.h index 33f632331474..f0d21cc8e9ab > 100644 > --- a/drivers/media/platform/vsp1/vsp1.h > +++ b/drivers/media/platform/vsp1/vsp1.h > @@ -68,6 +68,8 @@ struct vsp1_device_info { > bool uapi; > }; > > +#define vsp1_feature(vsp1, f) ((vsp1)->info->features & (f)) > + > struct vsp1_device { > struct device *dev; > const struct vsp1_device_info *info; > diff --git a/drivers/media/platform/vsp1/vsp1_drv.c > b/drivers/media/platform/vsp1/vsp1_drv.c index d29f9c4baebe..0fc388bf5a33 > 100644 > --- a/drivers/media/platform/vsp1/vsp1_drv.c > +++ b/drivers/media/platform/vsp1/vsp1_drv.c > @@ -265,7 +265,7 @@ static int vsp1_create_entities(struct vsp1_device > *vsp1) } > > /* Instantiate all the entities. */ > - if (vsp1->info->features & VSP1_HAS_BRS) { > + if (vsp1_feature(vsp1, VSP1_HAS_BRS)) { > vsp1->brs = vsp1_brx_create(vsp1, VSP1_ENTITY_BRS); > if (IS_ERR(vsp1->brs)) { > ret = PTR_ERR(vsp1->brs); > @@ -275,7 +275,7 @@ static int vsp1_create_entities(struct vsp1_device > *vsp1) list_add_tail(&vsp1->brs->entity.list_dev, &vsp1->entities); > } > > - if (vsp1->info->features & VSP1_HAS_BRU) { > + if (vsp1_feature(vsp1, VSP1_HAS_BRU)) { > vsp1->bru = vsp1_brx_create(vsp1, VSP1_ENTITY_BRU); > if (IS_ERR(vsp1->bru)) { > ret = PTR_ERR(vsp1->bru); > @@ -285,7 +285,7 @@ static int vsp1_create_entities(struct vsp1_device > *vsp1) list_add_tail(&vsp1->bru->entity.list_dev, &vsp1->entities); > } > > - if (vsp1->info->features & VSP1_HAS_CLU) { > + if (vsp1_feature(vsp1, VSP1_HAS_CLU)) { > vsp1->clu = vsp1_clu_create(vsp1); > if (IS_ERR(vsp1->clu)) { > ret = PTR_ERR(vsp1->clu); > @@ -311,7 +311,7 @@ static int vsp1_create_entities(struct vsp1_device > *vsp1) > > list_add_tail(&vsp1->hst->entity.list_dev, &vsp1->entities); > > - if (vsp1->info->features & VSP1_HAS_HGO && vsp1->info->uapi) { > + if (vsp1_feature(vsp1, VSP1_HAS_HGO) && vsp1->info->uapi) { > vsp1->hgo = vsp1_hgo_create(vsp1); > if (IS_ERR(vsp1->hgo)) { > ret = PTR_ERR(vsp1->hgo); > @@ -322,7 +322,7 @@ static int vsp1_create_entities(struct vsp1_device > *vsp1) &vsp1->entities); > } > > - if (vsp1->info->features & VSP1_HAS_HGT && vsp1->info->uapi) { > + if (vsp1_feature(vsp1, VSP1_HAS_HGT) && vsp1->info->uapi) { > vsp1->hgt = vsp1_hgt_create(vsp1); > if (IS_ERR(vsp1->hgt)) { > ret = PTR_ERR(vsp1->hgt); > @@ -353,7 +353,7 @@ static int vsp1_create_entities(struct vsp1_device > *vsp1) } > } > > - if (vsp1->info->features & VSP1_HAS_LUT) { > + if (vsp1_feature(vsp1, VSP1_HAS_LUT)) { > vsp1->lut = vsp1_lut_create(vsp1); > if (IS_ERR(vsp1->lut)) { > ret = PTR_ERR(vsp1->lut); > @@ -387,7 +387,7 @@ static int vsp1_create_entities(struct vsp1_device > *vsp1) } > } > > - if (vsp1->info->features & VSP1_HAS_SRU) { > + if (vsp1_feature(vsp1, VSP1_HAS_SRU)) { > vsp1->sru = vsp1_sru_create(vsp1); > if (IS_ERR(vsp1->sru)) { > ret = PTR_ERR(vsp1->sru); > @@ -537,7 +537,7 @@ static int vsp1_device_init(struct vsp1_device *vsp1) > vsp1_write(vsp1, VI6_DPR_HSI_ROUTE, VI6_DPR_NODE_UNUSED); > vsp1_write(vsp1, VI6_DPR_BRU_ROUTE, VI6_DPR_NODE_UNUSED); > > - if (vsp1->info->features & VSP1_HAS_BRS) > + if (vsp1_feature(vsp1, VSP1_HAS_BRS)) > vsp1_write(vsp1, VI6_DPR_ILV_BRS_ROUTE, VI6_DPR_NODE_UNUSED); > > vsp1_write(vsp1, VI6_DPR_HGO_SMPPT, (7 << VI6_DPR_SMPPT_TGW_SHIFT) | > diff --git a/drivers/media/platform/vsp1/vsp1_wpf.c > b/drivers/media/platform/vsp1/vsp1_wpf.c index 2edea361eee4..ea1d226371b2 > 100644 > --- a/drivers/media/platform/vsp1/vsp1_wpf.c > +++ b/drivers/media/platform/vsp1/vsp1_wpf.c > @@ -141,13 +141,13 @@ static int wpf_init_controls(struct vsp1_rwpf *wpf) > if (wpf->entity.index != 0) { > /* Only WPF0 supports flipping. */ > num_flip_ctrls = 0; > - } else if (vsp1->info->features & VSP1_HAS_WPF_HFLIP) { > + } else if (vsp1_feature(vsp1, VSP1_HAS_WPF_HFLIP)) { > /* > * When horizontal flip is supported the WPF implements three > * controls (horizontal flip, vertical flip and rotation). > */ > num_flip_ctrls = 3; > - } else if (vsp1->info->features & VSP1_HAS_WPF_VFLIP) { > + } else if (vsp1_feature(vsp1, VSP1_HAS_WPF_VFLIP)) { > /* > * When only vertical flip is supported the WPF implements a > * single control (vertical flip). > @@ -276,7 +276,7 @@ static void wpf_configure_stream(struct vsp1_entity > *entity, > > vsp1_wpf_write(wpf, dlb, VI6_WPF_DSWAP, fmtinfo->swap); > > - if (vsp1->info->features & VSP1_HAS_WPF_HFLIP && > + if (vsp1_feature(vsp1, VSP1_HAS_WPF_HFLIP) && > wpf->entity.index == 0) > vsp1_wpf_write(wpf, dlb, VI6_WPF_ROT_CTRL, > VI6_WPF_ROT_CTRL_LN16 | -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v4 06/11] media: vsp1: Provide VSP1 feature helper macro Date: Thu, 24 May 2018 14:00:35 +0300 Message-ID: <2086855.Txm5IEeXWY@avalon> References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by gabe.freedesktop.org (Postfix) with ESMTPS id E1A486E01C for ; Thu, 24 May 2018 11:00:39 +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: Kieran Bingham Cc: linux-renesas-soc@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org SGkgS2llcmFuLAoKVGhhbmsgeW91IGZvciB0aGUgcGF0Y2guCgpPbiBUaHVyc2RheSwgMyBNYXkg MjAxOCAxNjozNjoxNyBFRVNUIEtpZXJhbiBCaW5naGFtIHdyb3RlOgo+IFRoZSBWU1AxIGRldmlj ZXMgZGVmaW5lIHRoZWlyIHNwZWNpZmljIGNhcGFiaWxpdGllcyB0aHJvdWdoIGZlYXR1cmVzCj4g bWFya2VkIGluIHRoZWlyIGRldmljZSBpbmZvIHN0cnVjdHVyZS4gVmFyaW91cyBwYXJ0cyBvZiB0 aGUgY29kZSByZWFkCj4gdGhpcyBpbmZvIHN0cnVjdHVyZSB0byBpbmZlciBpZiB0aGUgZmVhdHVy ZXMgYXJlIGF2YWlsYWJsZS4KPiAKPiBXcmFwIHRoaXMgaW50byBhIG1vcmUgcmVhZGFibGUgdnNw MV9mZWF0dXJlKHZzcDEsIGYpIG1hY3JvIHRvIGVuc3VyZQo+IHRoYXQgdXNhZ2UgaXMgY29uc2lz dGVudCB0aHJvdWdob3V0IHRoZSBkcml2ZXIuCj4gCj4gU2lnbmVkLW9mZi1ieTogS2llcmFuIEJp bmdoYW0gPGtpZXJhbi5iaW5naGFtK3JlbmVzYXNAaWRlYXNvbmJvYXJkLmNvbT4KClJldmlld2Vk LWJ5OiBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+ Cgo+IC0tLQo+ICBkcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMS5oICAgICB8ICAyICsr Cj4gIGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2Rydi5jIHwgMTYgKysrKysrKyst LS0tLS0tLQo+ICBkcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV93cGYuYyB8ICA2ICsr Ky0tLQo+ICAzIGZpbGVzIGNoYW5nZWQsIDEzIGluc2VydGlvbnMoKyksIDExIGRlbGV0aW9ucygt KQo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMS5oCj4g Yi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMS5oIGluZGV4IDMzZjYzMjMzMTQ3NC4u ZjBkMjFjYzhlOWFiCj4gMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3Ax L3ZzcDEuaAo+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxLmgKPiBAQCAt NjgsNiArNjgsOCBAQCBzdHJ1Y3QgdnNwMV9kZXZpY2VfaW5mbyB7Cj4gIAlib29sIHVhcGk7Cj4g IH07Cj4gCj4gKyNkZWZpbmUgdnNwMV9mZWF0dXJlKHZzcDEsIGYpICgodnNwMSktPmluZm8tPmZl YXR1cmVzICYgKGYpKQo+ICsKPiAgc3RydWN0IHZzcDFfZGV2aWNlIHsKPiAgCXN0cnVjdCBkZXZp Y2UgKmRldjsKPiAgCWNvbnN0IHN0cnVjdCB2c3AxX2RldmljZV9pbmZvICppbmZvOwo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9kcnYuYwo+IGIvZHJpdmVy cy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZHJ2LmMgaW5kZXggZDI5ZjljNGJhZWJlLi4wZmMz ODhiZjVhMzMKPiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNw MV9kcnYuYwo+ICsrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2Rydi5jCj4g QEAgLTI2NSw3ICsyNjUsNyBAQCBzdGF0aWMgaW50IHZzcDFfY3JlYXRlX2VudGl0aWVzKHN0cnVj dCB2c3AxX2RldmljZQo+ICp2c3AxKSB9Cj4gCj4gIAkvKiBJbnN0YW50aWF0ZSBhbGwgdGhlIGVu dGl0aWVzLiAqLwo+IC0JaWYgKHZzcDEtPmluZm8tPmZlYXR1cmVzICYgVlNQMV9IQVNfQlJTKSB7 Cj4gKwlpZiAodnNwMV9mZWF0dXJlKHZzcDEsIFZTUDFfSEFTX0JSUykpIHsKPiAgCQl2c3AxLT5i cnMgPSB2c3AxX2JyeF9jcmVhdGUodnNwMSwgVlNQMV9FTlRJVFlfQlJTKTsKPiAgCQlpZiAoSVNf RVJSKHZzcDEtPmJycykpIHsKPiAgCQkJcmV0ID0gUFRSX0VSUih2c3AxLT5icnMpOwo+IEBAIC0y NzUsNyArMjc1LDcgQEAgc3RhdGljIGludCB2c3AxX2NyZWF0ZV9lbnRpdGllcyhzdHJ1Y3QgdnNw MV9kZXZpY2UKPiAqdnNwMSkgbGlzdF9hZGRfdGFpbCgmdnNwMS0+YnJzLT5lbnRpdHkubGlzdF9k ZXYsICZ2c3AxLT5lbnRpdGllcyk7Cj4gIAl9Cj4gCj4gLQlpZiAodnNwMS0+aW5mby0+ZmVhdHVy ZXMgJiBWU1AxX0hBU19CUlUpIHsKPiArCWlmICh2c3AxX2ZlYXR1cmUodnNwMSwgVlNQMV9IQVNf QlJVKSkgewo+ICAJCXZzcDEtPmJydSA9IHZzcDFfYnJ4X2NyZWF0ZSh2c3AxLCBWU1AxX0VOVElU WV9CUlUpOwo+ICAJCWlmIChJU19FUlIodnNwMS0+YnJ1KSkgewo+ICAJCQlyZXQgPSBQVFJfRVJS KHZzcDEtPmJydSk7Cj4gQEAgLTI4NSw3ICsyODUsNyBAQCBzdGF0aWMgaW50IHZzcDFfY3JlYXRl X2VudGl0aWVzKHN0cnVjdCB2c3AxX2RldmljZQo+ICp2c3AxKSBsaXN0X2FkZF90YWlsKCZ2c3Ax LT5icnUtPmVudGl0eS5saXN0X2RldiwgJnZzcDEtPmVudGl0aWVzKTsKPiAgCX0KPiAKPiAtCWlm ICh2c3AxLT5pbmZvLT5mZWF0dXJlcyAmIFZTUDFfSEFTX0NMVSkgewo+ICsJaWYgKHZzcDFfZmVh dHVyZSh2c3AxLCBWU1AxX0hBU19DTFUpKSB7Cj4gIAkJdnNwMS0+Y2x1ID0gdnNwMV9jbHVfY3Jl YXRlKHZzcDEpOwo+ICAJCWlmIChJU19FUlIodnNwMS0+Y2x1KSkgewo+ICAJCQlyZXQgPSBQVFJf RVJSKHZzcDEtPmNsdSk7Cj4gQEAgLTMxMSw3ICszMTEsNyBAQCBzdGF0aWMgaW50IHZzcDFfY3Jl YXRlX2VudGl0aWVzKHN0cnVjdCB2c3AxX2RldmljZQo+ICp2c3AxKQo+IAo+ICAJbGlzdF9hZGRf dGFpbCgmdnNwMS0+aHN0LT5lbnRpdHkubGlzdF9kZXYsICZ2c3AxLT5lbnRpdGllcyk7Cj4gCj4g LQlpZiAodnNwMS0+aW5mby0+ZmVhdHVyZXMgJiBWU1AxX0hBU19IR08gJiYgdnNwMS0+aW5mby0+ dWFwaSkgewo+ICsJaWYgKHZzcDFfZmVhdHVyZSh2c3AxLCBWU1AxX0hBU19IR08pICYmIHZzcDEt PmluZm8tPnVhcGkpIHsKPiAgCQl2c3AxLT5oZ28gPSB2c3AxX2hnb19jcmVhdGUodnNwMSk7Cj4g IAkJaWYgKElTX0VSUih2c3AxLT5oZ28pKSB7Cj4gIAkJCXJldCA9IFBUUl9FUlIodnNwMS0+aGdv KTsKPiBAQCAtMzIyLDcgKzMyMiw3IEBAIHN0YXRpYyBpbnQgdnNwMV9jcmVhdGVfZW50aXRpZXMo c3RydWN0IHZzcDFfZGV2aWNlCj4gKnZzcDEpICZ2c3AxLT5lbnRpdGllcyk7Cj4gIAl9Cj4gCj4g LQlpZiAodnNwMS0+aW5mby0+ZmVhdHVyZXMgJiBWU1AxX0hBU19IR1QgJiYgdnNwMS0+aW5mby0+ dWFwaSkgewo+ICsJaWYgKHZzcDFfZmVhdHVyZSh2c3AxLCBWU1AxX0hBU19IR1QpICYmIHZzcDEt PmluZm8tPnVhcGkpIHsKPiAgCQl2c3AxLT5oZ3QgPSB2c3AxX2hndF9jcmVhdGUodnNwMSk7Cj4g IAkJaWYgKElTX0VSUih2c3AxLT5oZ3QpKSB7Cj4gIAkJCXJldCA9IFBUUl9FUlIodnNwMS0+aGd0 KTsKPiBAQCAtMzUzLDcgKzM1Myw3IEBAIHN0YXRpYyBpbnQgdnNwMV9jcmVhdGVfZW50aXRpZXMo c3RydWN0IHZzcDFfZGV2aWNlCj4gKnZzcDEpIH0KPiAgCX0KPiAKPiAtCWlmICh2c3AxLT5pbmZv LT5mZWF0dXJlcyAmIFZTUDFfSEFTX0xVVCkgewo+ICsJaWYgKHZzcDFfZmVhdHVyZSh2c3AxLCBW U1AxX0hBU19MVVQpKSB7Cj4gIAkJdnNwMS0+bHV0ID0gdnNwMV9sdXRfY3JlYXRlKHZzcDEpOwo+ ICAJCWlmIChJU19FUlIodnNwMS0+bHV0KSkgewo+ICAJCQlyZXQgPSBQVFJfRVJSKHZzcDEtPmx1 dCk7Cj4gQEAgLTM4Nyw3ICszODcsNyBAQCBzdGF0aWMgaW50IHZzcDFfY3JlYXRlX2VudGl0aWVz KHN0cnVjdCB2c3AxX2RldmljZQo+ICp2c3AxKSB9Cj4gIAl9Cj4gCj4gLQlpZiAodnNwMS0+aW5m by0+ZmVhdHVyZXMgJiBWU1AxX0hBU19TUlUpIHsKPiArCWlmICh2c3AxX2ZlYXR1cmUodnNwMSwg VlNQMV9IQVNfU1JVKSkgewo+ICAJCXZzcDEtPnNydSA9IHZzcDFfc3J1X2NyZWF0ZSh2c3AxKTsK PiAgCQlpZiAoSVNfRVJSKHZzcDEtPnNydSkpIHsKPiAgCQkJcmV0ID0gUFRSX0VSUih2c3AxLT5z cnUpOwo+IEBAIC01MzcsNyArNTM3LDcgQEAgc3RhdGljIGludCB2c3AxX2RldmljZV9pbml0KHN0 cnVjdCB2c3AxX2RldmljZSAqdnNwMSkKPiAgCXZzcDFfd3JpdGUodnNwMSwgVkk2X0RQUl9IU0lf Uk9VVEUsIFZJNl9EUFJfTk9ERV9VTlVTRUQpOwo+ICAJdnNwMV93cml0ZSh2c3AxLCBWSTZfRFBS X0JSVV9ST1VURSwgVkk2X0RQUl9OT0RFX1VOVVNFRCk7Cj4gCj4gLQlpZiAodnNwMS0+aW5mby0+ ZmVhdHVyZXMgJiBWU1AxX0hBU19CUlMpCj4gKwlpZiAodnNwMV9mZWF0dXJlKHZzcDEsIFZTUDFf SEFTX0JSUykpCj4gIAkJdnNwMV93cml0ZSh2c3AxLCBWSTZfRFBSX0lMVl9CUlNfUk9VVEUsIFZJ Nl9EUFJfTk9ERV9VTlVTRUQpOwo+IAo+ICAJdnNwMV93cml0ZSh2c3AxLCBWSTZfRFBSX0hHT19T TVBQVCwgKDcgPDwgVkk2X0RQUl9TTVBQVF9UR1dfU0hJRlQpIHwKPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfd3BmLmMKPiBiL2RyaXZlcnMvbWVkaWEvcGxh dGZvcm0vdnNwMS92c3AxX3dwZi5jIGluZGV4IDJlZGVhMzYxZWVlNC4uZWExZDIyNjM3MWIyCj4g MTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfd3BmLmMKPiAr KysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV93cGYuYwo+IEBAIC0xNDEsMTMg KzE0MSwxMyBAQCBzdGF0aWMgaW50IHdwZl9pbml0X2NvbnRyb2xzKHN0cnVjdCB2c3AxX3J3cGYg KndwZikKPiAgCWlmICh3cGYtPmVudGl0eS5pbmRleCAhPSAwKSB7Cj4gIAkJLyogT25seSBXUEYw IHN1cHBvcnRzIGZsaXBwaW5nLiAqLwo+ICAJCW51bV9mbGlwX2N0cmxzID0gMDsKPiAtCX0gZWxz ZSBpZiAodnNwMS0+aW5mby0+ZmVhdHVyZXMgJiBWU1AxX0hBU19XUEZfSEZMSVApIHsKPiArCX0g ZWxzZSBpZiAodnNwMV9mZWF0dXJlKHZzcDEsIFZTUDFfSEFTX1dQRl9IRkxJUCkpIHsKPiAgCQkv Kgo+ICAJCSAqIFdoZW4gaG9yaXpvbnRhbCBmbGlwIGlzIHN1cHBvcnRlZCB0aGUgV1BGIGltcGxl bWVudHMgdGhyZWUKPiAgCQkgKiBjb250cm9scyAoaG9yaXpvbnRhbCBmbGlwLCB2ZXJ0aWNhbCBm bGlwIGFuZCByb3RhdGlvbikuCj4gIAkJICovCj4gIAkJbnVtX2ZsaXBfY3RybHMgPSAzOwo+IC0J fSBlbHNlIGlmICh2c3AxLT5pbmZvLT5mZWF0dXJlcyAmIFZTUDFfSEFTX1dQRl9WRkxJUCkgewo+ ICsJfSBlbHNlIGlmICh2c3AxX2ZlYXR1cmUodnNwMSwgVlNQMV9IQVNfV1BGX1ZGTElQKSkgewo+ ICAJCS8qCj4gIAkJICogV2hlbiBvbmx5IHZlcnRpY2FsIGZsaXAgaXMgc3VwcG9ydGVkIHRoZSBX UEYgaW1wbGVtZW50cyBhCj4gIAkJICogc2luZ2xlIGNvbnRyb2wgKHZlcnRpY2FsIGZsaXApLgo+ IEBAIC0yNzYsNyArMjc2LDcgQEAgc3RhdGljIHZvaWQgd3BmX2NvbmZpZ3VyZV9zdHJlYW0oc3Ry dWN0IHZzcDFfZW50aXR5Cj4gKmVudGl0eSwKPiAKPiAgCQl2c3AxX3dwZl93cml0ZSh3cGYsIGRs YiwgVkk2X1dQRl9EU1dBUCwgZm10aW5mby0+c3dhcCk7Cj4gCj4gLQkJaWYgKHZzcDEtPmluZm8t PmZlYXR1cmVzICYgVlNQMV9IQVNfV1BGX0hGTElQICYmCj4gKwkJaWYgKHZzcDFfZmVhdHVyZSh2 c3AxLCBWU1AxX0hBU19XUEZfSEZMSVApICYmCj4gIAkJICAgIHdwZi0+ZW50aXR5LmluZGV4ID09 IDApCj4gIAkJCXZzcDFfd3BmX3dyaXRlKHdwZiwgZGxiLCBWSTZfV1BGX1JPVF9DVFJMLAo+ICAJ CQkJICAgICAgIFZJNl9XUEZfUk9UX0NUUkxfTE4xNiB8CgoKLS0gClJlZ2FyZHMsCgpMYXVyZW50 IFBpbmNoYXJ0CgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9y ZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZl bAo=