From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Date: Wed, 26 Nov 2014 07:28:34 +0000 Subject: Re: [PATCH v4 6/9] drm: Decouple EDID parsing from I2C adapter Message-Id: <20141126072834.GA32117@phenom.ffwll.local> List-Id: References: <1414337068-28664-7-git-send-email-laurent.pinchart+renesas@ideasonboard.com> <1416959247-23132-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> In-Reply-To: <1416959247-23132-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Laurent Pinchart Cc: linux-sh@vger.kernel.org, dri-devel@lists.freedesktop.org On Wed, Nov 26, 2014 at 01:47:27AM +0200, Laurent Pinchart wrote: > From: Lars-Peter Clausen > > The drm_get_edid() function performs direct I2C accesses to read EDID > blocks, assuming that the monitor DDC interface is directly connected to > the I2C bus. It can't thus be used with HDMI encoders that control the > DDC bus and expose EDID blocks through a different interface. > > Refactor drm_do_get_edid() to take a block read callback function > instead of an I2C adapter, and export it for direct use by drivers. > > As in the general case the DDC bus is accessible by the kernel at the > I2C level, drivers must make all reasonable efforts to expose it as an > I2C adapter and use drm_get_edid() instead of abusing this function. > > Signed-off-by: Lars-Peter Clausen > Signed-off-by: Laurent Pinchart Reviewed-by: Daniel Vetter > --- > drivers/gpu/drm/drm_edid.c | 43 ++++++++++++++++++++++++++++++------------- > include/drm/drm_edid.h | 5 +++++ > 2 files changed, 35 insertions(+), 13 deletions(-) > > Daniel, could you please review and hopefully ack this ? If this new version is > acceptable I'd like to send an updated pull request for R-Car DU HDMI support > for v3.19, so time is running short. > > Changes since v3: > > - Add kerneldoc for the new exported drm_do_get_edid function > > diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c > index 3bf999134bcc..1a77a49d2695 100644 > --- a/drivers/gpu/drm/drm_edid.c > +++ b/drivers/gpu/drm/drm_edid.c > @@ -1125,9 +1125,9 @@ EXPORT_SYMBOL(drm_edid_is_valid); > * Return: 0 on success or -1 on failure. > */ > static int > -drm_do_probe_ddc_edid(struct i2c_adapter *adapter, unsigned char *buf, > - int block, int len) > +drm_do_probe_ddc_edid(void *data, u8 *buf, unsigned int block, size_t len) > { > + struct i2c_adapter *adapter = data; > unsigned char start = block * EDID_LENGTH; > unsigned char segment = block >> 1; > unsigned char xfers = segment ? 3 : 2; > @@ -1184,8 +1184,26 @@ static bool drm_edid_is_zero(u8 *in_edid, int length) > return true; > } > > -static u8 * > -drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) > +/** > + * drm_do_get_edid - get EDID data using a custom EDID block read function > + * @connector: connector we're probing > + * @get_edid_block: EDID block read function > + * @data: private data passed to the block read function > + * > + * When the I2C adapter connected to the DDC bus is hidden behind a device that > + * exposes a different interface to read EDID blocks this function can be used > + * to get EDID data using a custom block read function. > + * > + * As in the general case the DDC bus is accessible by the kernel at the I2C > + * level, drivers must make all reasonable efforts to expose it as an I2C > + * adapter and use drm_get_edid() instead of abusing this function. > + * > + * Return: Pointer to valid EDID or NULL if we couldn't find any. > + */ > +struct edid *drm_do_get_edid(struct drm_connector *connector, > + int (*get_edid_block)(void *data, u8 *buf, unsigned int block, > + size_t len), > + void *data) > { > int i, j = 0, valid_extensions = 0; > u8 *block, *new; > @@ -1196,7 +1214,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) > > /* base block fetch */ > for (i = 0; i < 4; i++) { > - if (drm_do_probe_ddc_edid(adapter, block, 0, EDID_LENGTH)) > + if (get_edid_block(data, block, 0, EDID_LENGTH)) > goto out; > if (drm_edid_block_valid(block, 0, print_bad_edid)) > break; > @@ -1210,7 +1228,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) > > /* if there's no extensions, we're done */ > if (block[0x7e] = 0) > - return block; > + return (struct edid *)block; > > new = krealloc(block, (block[0x7e] + 1) * EDID_LENGTH, GFP_KERNEL); > if (!new) > @@ -1219,7 +1237,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) > > for (j = 1; j <= block[0x7e]; j++) { > for (i = 0; i < 4; i++) { > - if (drm_do_probe_ddc_edid(adapter, > + if (get_edid_block(data, > block + (valid_extensions + 1) * EDID_LENGTH, > j, EDID_LENGTH)) > goto out; > @@ -1247,7 +1265,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) > block = new; > } > > - return block; > + return (struct edid *)block; > > carp: > if (print_bad_edid) { > @@ -1260,6 +1278,7 @@ out: > kfree(block); > return NULL; > } > +EXPORT_SYMBOL_GPL(drm_do_get_edid); > > /** > * drm_probe_ddc() - probe DDC presence > @@ -1289,12 +1308,10 @@ EXPORT_SYMBOL(drm_probe_ddc); > struct edid *drm_get_edid(struct drm_connector *connector, > struct i2c_adapter *adapter) > { > - struct edid *edid = NULL; > - > - if (drm_probe_ddc(adapter)) > - edid = (struct edid *)drm_do_get_edid(connector, adapter); > + if (!drm_probe_ddc(adapter)) > + return NULL; > > - return edid; > + return drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter); > } > EXPORT_SYMBOL(drm_get_edid); > > diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h > index c2f1bfa22010..d59240ffb1f7 100644 > --- a/include/drm/drm_edid.h > +++ b/include/drm/drm_edid.h > @@ -381,4 +381,9 @@ static inline int drm_eld_size(const uint8_t *eld) > return DRM_ELD_HEADER_BLOCK_SIZE + eld[DRM_ELD_BASELINE_ELD_LEN] * 4; > } > > +struct edid *drm_do_get_edid(struct drm_connector *connector, > + int (*get_edid_block)(void *data, u8 *buf, unsigned int block, > + size_t len), > + void *data); > + > #endif /* __DRM_EDID_H__ */ > -- > 2.0.4 > -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH v4 6/9] drm: Decouple EDID parsing from I2C adapter Date: Wed, 26 Nov 2014 08:28:34 +0100 Message-ID: <20141126072834.GA32117@phenom.ffwll.local> References: <1414337068-28664-7-git-send-email-laurent.pinchart+renesas@ideasonboard.com> <1416959247-23132-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wi0-f170.google.com (mail-wi0-f170.google.com [209.85.212.170]) by gabe.freedesktop.org (Postfix) with ESMTP id 2F8546E11A for ; Tue, 25 Nov 2014 23:28:13 -0800 (PST) Received: by mail-wi0-f170.google.com with SMTP id bs8so14309436wib.3 for ; Tue, 25 Nov 2014 23:28:12 -0800 (PST) Content-Disposition: inline In-Reply-To: <1416959247-23132-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Laurent Pinchart Cc: linux-sh@vger.kernel.org, dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org T24gV2VkLCBOb3YgMjYsIDIwMTQgYXQgMDE6NDc6MjdBTSArMDIwMCwgTGF1cmVudCBQaW5jaGFy dCB3cm90ZToKPiBGcm9tOiBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KPiAK PiBUaGUgZHJtX2dldF9lZGlkKCkgZnVuY3Rpb24gcGVyZm9ybXMgZGlyZWN0IEkyQyBhY2Nlc3Nl cyB0byByZWFkIEVESUQKPiBibG9ja3MsIGFzc3VtaW5nIHRoYXQgdGhlIG1vbml0b3IgRERDIGlu dGVyZmFjZSBpcyBkaXJlY3RseSBjb25uZWN0ZWQgdG8KPiB0aGUgSTJDIGJ1cy4gSXQgY2FuJ3Qg dGh1cyBiZSB1c2VkIHdpdGggSERNSSBlbmNvZGVycyB0aGF0IGNvbnRyb2wgdGhlCj4gRERDIGJ1 cyBhbmQgZXhwb3NlIEVESUQgYmxvY2tzIHRocm91Z2ggYSBkaWZmZXJlbnQgaW50ZXJmYWNlLgo+ IAo+IFJlZmFjdG9yIGRybV9kb19nZXRfZWRpZCgpIHRvIHRha2UgYSBibG9jayByZWFkIGNhbGxi YWNrIGZ1bmN0aW9uCj4gaW5zdGVhZCBvZiBhbiBJMkMgYWRhcHRlciwgYW5kIGV4cG9ydCBpdCBm b3IgZGlyZWN0IHVzZSBieSBkcml2ZXJzLgo+IAo+IEFzIGluIHRoZSBnZW5lcmFsIGNhc2UgdGhl IEREQyBidXMgaXMgYWNjZXNzaWJsZSBieSB0aGUga2VybmVsIGF0IHRoZQo+IEkyQyBsZXZlbCwg ZHJpdmVycyBtdXN0IG1ha2UgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBleHBvc2UgaXQgYXMg YW4KPiBJMkMgYWRhcHRlciBhbmQgdXNlIGRybV9nZXRfZWRpZCgpIGluc3RlYWQgb2YgYWJ1c2lu ZyB0aGlzIGZ1bmN0aW9uLgo+IAo+IFNpZ25lZC1vZmYtYnk6IExhcnMtUGV0ZXIgQ2xhdXNlbiA8 bGFyc0BtZXRhZm9vLmRlPgo+IFNpZ25lZC1vZmYtYnk6IExhdXJlbnQgUGluY2hhcnQgPGxhdXJl bnQucGluY2hhcnQrcmVuZXNhc0BpZGVhc29uYm9hcmQuY29tPgoKUmV2aWV3ZWQtYnk6IERhbmll bCBWZXR0ZXIgPGRhbmllbC52ZXR0ZXJAZmZ3bGwuY2g+Cgo+IC0tLQo+ICBkcml2ZXJzL2dwdS9k cm0vZHJtX2VkaWQuYyB8IDQzICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0t LS0tLS0KPiAgaW5jbHVkZS9kcm0vZHJtX2VkaWQuaCAgICAgfCAgNSArKysrKwo+ICAyIGZpbGVz IGNoYW5nZWQsIDM1IGluc2VydGlvbnMoKyksIDEzIGRlbGV0aW9ucygtKQo+IAo+IERhbmllbCwg Y291bGQgeW91IHBsZWFzZSByZXZpZXcgYW5kIGhvcGVmdWxseSBhY2sgdGhpcyA/IElmIHRoaXMg bmV3IHZlcnNpb24gaXMKPiBhY2NlcHRhYmxlIEknZCBsaWtlIHRvIHNlbmQgYW4gdXBkYXRlZCBw dWxsIHJlcXVlc3QgZm9yIFItQ2FyIERVIEhETUkgc3VwcG9ydAo+IGZvciB2My4xOSwgc28gdGlt ZSBpcyBydW5uaW5nIHNob3J0Lgo+IAo+IENoYW5nZXMgc2luY2UgdjM6Cj4gCj4gLSBBZGQga2Vy bmVsZG9jIGZvciB0aGUgbmV3IGV4cG9ydGVkIGRybV9kb19nZXRfZWRpZCBmdW5jdGlvbgo+IAo+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWQuYyBiL2RyaXZlcnMvZ3B1L2Ry bS9kcm1fZWRpZC5jCj4gaW5kZXggM2JmOTk5MTM0YmNjLi4xYTc3YTQ5ZDI2OTUgMTAwNjQ0Cj4g LS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0v ZHJtX2VkaWQuYwo+IEBAIC0xMTI1LDkgKzExMjUsOSBAQCBFWFBPUlRfU1lNQk9MKGRybV9lZGlk X2lzX3ZhbGlkKTsKPiAgICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Mgb3IgLTEgb24gZmFpbHVyZS4K PiAgICovCj4gIHN0YXRpYyBpbnQKPiAtZHJtX2RvX3Byb2JlX2RkY19lZGlkKHN0cnVjdCBpMmNf YWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgY2hhciAqYnVmLAo+IC0JCSAgICAgIGludCBibG9j aywgaW50IGxlbikKPiArZHJtX2RvX3Byb2JlX2RkY19lZGlkKHZvaWQgKmRhdGEsIHU4ICpidWYs IHVuc2lnbmVkIGludCBibG9jaywgc2l6ZV90IGxlbikKPiAgewo+ICsJc3RydWN0IGkyY19hZGFw dGVyICphZGFwdGVyID0gZGF0YTsKPiAgCXVuc2lnbmVkIGNoYXIgc3RhcnQgPSBibG9jayAqIEVE SURfTEVOR1RIOwo+ICAJdW5zaWduZWQgY2hhciBzZWdtZW50ID0gYmxvY2sgPj4gMTsKPiAgCXVu c2lnbmVkIGNoYXIgeGZlcnMgPSBzZWdtZW50ID8gMyA6IDI7Cj4gQEAgLTExODQsOCArMTE4NCwy NiBAQCBzdGF0aWMgYm9vbCBkcm1fZWRpZF9pc196ZXJvKHU4ICppbl9lZGlkLCBpbnQgbGVuZ3Ro KQo+ICAJcmV0dXJuIHRydWU7Cj4gIH0KPiAgCj4gLXN0YXRpYyB1OCAqCj4gLWRybV9kb19nZXRf ZWRpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIg KmFkYXB0ZXIpCj4gKy8qKgo+ICsgKiBkcm1fZG9fZ2V0X2VkaWQgLSBnZXQgRURJRCBkYXRhIHVz aW5nIGEgY3VzdG9tIEVESUQgYmxvY2sgcmVhZCBmdW5jdGlvbgo+ICsgKiBAY29ubmVjdG9yOiBj b25uZWN0b3Igd2UncmUgcHJvYmluZwo+ICsgKiBAZ2V0X2VkaWRfYmxvY2s6IEVESUQgYmxvY2sg cmVhZCBmdW5jdGlvbgo+ICsgKiBAZGF0YTogcHJpdmF0ZSBkYXRhIHBhc3NlZCB0byB0aGUgYmxv Y2sgcmVhZCBmdW5jdGlvbgo+ICsgKgo+ICsgKiBXaGVuIHRoZSBJMkMgYWRhcHRlciBjb25uZWN0 ZWQgdG8gdGhlIEREQyBidXMgaXMgaGlkZGVuIGJlaGluZCBhIGRldmljZSB0aGF0Cj4gKyAqIGV4 cG9zZXMgYSBkaWZmZXJlbnQgaW50ZXJmYWNlIHRvIHJlYWQgRURJRCBibG9ja3MgdGhpcyBmdW5j dGlvbiBjYW4gYmUgdXNlZAo+ICsgKiB0byBnZXQgRURJRCBkYXRhIHVzaW5nIGEgY3VzdG9tIGJs b2NrIHJlYWQgZnVuY3Rpb24uCj4gKyAqCj4gKyAqIEFzIGluIHRoZSBnZW5lcmFsIGNhc2UgdGhl IEREQyBidXMgaXMgYWNjZXNzaWJsZSBieSB0aGUga2VybmVsIGF0IHRoZSBJMkMKPiArICogbGV2 ZWwsIGRyaXZlcnMgbXVzdCBtYWtlIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gZXhwb3NlIGl0 IGFzIGFuIEkyQwo+ICsgKiBhZGFwdGVyIGFuZCB1c2UgZHJtX2dldF9lZGlkKCkgaW5zdGVhZCBv ZiBhYnVzaW5nIHRoaXMgZnVuY3Rpb24uCj4gKyAqCj4gKyAqIFJldHVybjogUG9pbnRlciB0byB2 YWxpZCBFRElEIG9yIE5VTEwgaWYgd2UgY291bGRuJ3QgZmluZCBhbnkuCj4gKyAqLwo+ICtzdHJ1 Y3QgZWRpZCAqZHJtX2RvX2dldF9lZGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3Is Cj4gKwlpbnQgKCpnZXRfZWRpZF9ibG9jaykodm9pZCAqZGF0YSwgdTggKmJ1ZiwgdW5zaWduZWQg aW50IGJsb2NrLAo+ICsJCQkgICAgICBzaXplX3QgbGVuKSwKPiArCXZvaWQgKmRhdGEpCj4gIHsK PiAgCWludCBpLCBqID0gMCwgdmFsaWRfZXh0ZW5zaW9ucyA9IDA7Cj4gIAl1OCAqYmxvY2ssICpu ZXc7Cj4gQEAgLTExOTYsNyArMTIxNCw3IEBAIGRybV9kb19nZXRfZWRpZChzdHJ1Y3QgZHJtX2Nv bm5lY3RvciAqY29ubmVjdG9yLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCj4gIAo+ICAJ LyogYmFzZSBibG9jayBmZXRjaCAqLwo+ICAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewo+IC0J CWlmIChkcm1fZG9fcHJvYmVfZGRjX2VkaWQoYWRhcHRlciwgYmxvY2ssIDAsIEVESURfTEVOR1RI KSkKPiArCQlpZiAoZ2V0X2VkaWRfYmxvY2soZGF0YSwgYmxvY2ssIDAsIEVESURfTEVOR1RIKSkK PiAgCQkJZ290byBvdXQ7Cj4gIAkJaWYgKGRybV9lZGlkX2Jsb2NrX3ZhbGlkKGJsb2NrLCAwLCBw cmludF9iYWRfZWRpZCkpCj4gIAkJCWJyZWFrOwo+IEBAIC0xMjEwLDcgKzEyMjgsNyBAQCBkcm1f ZG9fZ2V0X2VkaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGkyY19h ZGFwdGVyICphZGFwdGVyKQo+ICAKPiAgCS8qIGlmIHRoZXJlJ3Mgbm8gZXh0ZW5zaW9ucywgd2Un cmUgZG9uZSAqLwo+ICAJaWYgKGJsb2NrWzB4N2VdID09IDApCj4gLQkJcmV0dXJuIGJsb2NrOwo+ ICsJCXJldHVybiAoc3RydWN0IGVkaWQgKilibG9jazsKPiAgCj4gIAluZXcgPSBrcmVhbGxvYyhi bG9jaywgKGJsb2NrWzB4N2VdICsgMSkgKiBFRElEX0xFTkdUSCwgR0ZQX0tFUk5FTCk7Cj4gIAlp ZiAoIW5ldykKPiBAQCAtMTIxOSw3ICsxMjM3LDcgQEAgZHJtX2RvX2dldF9lZGlkKHN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKPiAg Cj4gIAlmb3IgKGogPSAxOyBqIDw9IGJsb2NrWzB4N2VdOyBqKyspIHsKPiAgCQlmb3IgKGkgPSAw OyBpIDwgNDsgaSsrKSB7Cj4gLQkJCWlmIChkcm1fZG9fcHJvYmVfZGRjX2VkaWQoYWRhcHRlciwK PiArCQkJaWYgKGdldF9lZGlkX2Jsb2NrKGRhdGEsCj4gIAkJCQkgIGJsb2NrICsgKHZhbGlkX2V4 dGVuc2lvbnMgKyAxKSAqIEVESURfTEVOR1RILAo+ICAJCQkJICBqLCBFRElEX0xFTkdUSCkpCj4g IAkJCQlnb3RvIG91dDsKPiBAQCAtMTI0Nyw3ICsxMjY1LDcgQEAgZHJtX2RvX2dldF9lZGlkKHN0 cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRl cikKPiAgCQlibG9jayA9IG5ldzsKPiAgCX0KPiAgCj4gLQlyZXR1cm4gYmxvY2s7Cj4gKwlyZXR1 cm4gKHN0cnVjdCBlZGlkICopYmxvY2s7Cj4gIAo+ICBjYXJwOgo+ICAJaWYgKHByaW50X2JhZF9l ZGlkKSB7Cj4gQEAgLTEyNjAsNiArMTI3OCw3IEBAIG91dDoKPiAgCWtmcmVlKGJsb2NrKTsKPiAg CXJldHVybiBOVUxMOwo+ICB9Cj4gK0VYUE9SVF9TWU1CT0xfR1BMKGRybV9kb19nZXRfZWRpZCk7 Cj4gIAo+ICAvKioKPiAgICogZHJtX3Byb2JlX2RkYygpIC0gcHJvYmUgRERDIHByZXNlbmNlCj4g QEAgLTEyODksMTIgKzEzMDgsMTAgQEAgRVhQT1JUX1NZTUJPTChkcm1fcHJvYmVfZGRjKTsKPiAg c3RydWN0IGVkaWQgKmRybV9nZXRfZWRpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9y LAo+ICAJCQkgIHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKPiAgewo+IC0Jc3RydWN0IGVk aWQgKmVkaWQgPSBOVUxMOwo+IC0KPiAtCWlmIChkcm1fcHJvYmVfZGRjKGFkYXB0ZXIpKQo+IC0J CWVkaWQgPSAoc3RydWN0IGVkaWQgKilkcm1fZG9fZ2V0X2VkaWQoY29ubmVjdG9yLCBhZGFwdGVy KTsKPiArCWlmICghZHJtX3Byb2JlX2RkYyhhZGFwdGVyKSkKPiArCQlyZXR1cm4gTlVMTDsKPiAg Cj4gLQlyZXR1cm4gZWRpZDsKPiArCXJldHVybiBkcm1fZG9fZ2V0X2VkaWQoY29ubmVjdG9yLCBk cm1fZG9fcHJvYmVfZGRjX2VkaWQsIGFkYXB0ZXIpOwo+ICB9Cj4gIEVYUE9SVF9TWU1CT0woZHJt X2dldF9lZGlkKTsKPiAgCj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9lZGlkLmggYi9p bmNsdWRlL2RybS9kcm1fZWRpZC5oCj4gaW5kZXggYzJmMWJmYTIyMDEwLi5kNTkyNDBmZmIxZjcg MTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2VkaWQuaAo+ICsrKyBiL2luY2x1ZGUvZHJt L2RybV9lZGlkLmgKPiBAQCAtMzgxLDQgKzM4MSw5IEBAIHN0YXRpYyBpbmxpbmUgaW50IGRybV9l bGRfc2l6ZShjb25zdCB1aW50OF90ICplbGQpCj4gIAlyZXR1cm4gRFJNX0VMRF9IRUFERVJfQkxP Q0tfU0laRSArIGVsZFtEUk1fRUxEX0JBU0VMSU5FX0VMRF9MRU5dICogNDsKPiAgfQo+ICAKPiAr c3RydWN0IGVkaWQgKmRybV9kb19nZXRfZWRpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVj dG9yLAo+ICsJaW50ICgqZ2V0X2VkaWRfYmxvY2spKHZvaWQgKmRhdGEsIHU4ICpidWYsIHVuc2ln bmVkIGludCBibG9jaywKPiArCQkJICAgICAgc2l6ZV90IGxlbiksCj4gKwl2b2lkICpkYXRhKTsK PiArCj4gICNlbmRpZiAvKiBfX0RSTV9FRElEX0hfXyAqLwo+IC0tIAo+IDIuMC40Cj4gCgotLSAK RGFuaWVsIFZldHRlcgpTb2Z0d2FyZSBFbmdpbmVlciwgSW50ZWwgQ29ycG9yYXRpb24KKzQxICgw KSA3OSAzNjUgNTcgNDggLSBodHRwOi8vYmxvZy5mZndsbC5jaApfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1k ZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=