From mboxrd@z Thu Jan 1 00:00:00 1970 From: Carlos Palminha Date: Thu, 21 Jan 2016 18:09:53 +0000 Subject: Re: Whats missing in my new FB DRM driver... "No connectors reported connected with modes"? Message-Id: <56A11EF1.3070004@synopsys.com> List-Id: References: <5684268E.2000607@synopsys.com> <569CF78F.7050303@synopsys.com> <569CFA9B.4060108@synopsys.com> <569E5E51.8000303@synopsys.com> <569E69EB.3010003@synopsys.com> In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Xinliang Liu , Carlos Palminha Cc: linux-fbdev@vger.kernel.org, tomi.valkeinen@ti.com, Alexey Brodkin , laurent.pinchart@ideasonboard.com, dri-devel i made some progress in identifying the issue... When my driver calls drm_fb_helper_initial_config it seems DRM blocks waiting for register_framebuffer to return. The sequence is drm_fb_helper_initial_config->drm_fb_helper_single_fb_probe->register_framebuffer. Its strange because register_framebuffer function is just a mutex around do_register_framebuffer. Any clue?! On 20-01-2016 01:24, Xinliang Liu wrote: > On 20 January 2016 at 00:52, Carlos Palminha > wrote: >> when i boot the kernel and connect the HDMI cable after booting i can retrieve 4 modes... :) >> >> if i boot linux with the HDMI cable inserted the kernel hangs. > > What's the hang kernel log. Is it a oops? > >> Possible relation with HPD? > > Yes, I think there might be something wrong with the HPD interrupt or > the EDID ready interrupt. > I do meet the similar issue before when I using the upstream adv7511 > driver to enable adv7533. > I found that the HPD and EDID interrupt is not reliable. > In order to get modes stably, I have to add some delay like bellow: > -- > --- a/drivers/gpu/drm/i2c/adv7511.c > +++ b/drivers/gpu/drm/i2c/adv7511.c > @@ -657,6 +657,8 @@ static int adv7511_get_modes(struct adv7511 *adv7511, > regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER, > ADV7511_POWER_POWER_DOWN, 0); > adv7511->current_edid_segment = -1; > + /* wait some time for edid is ready */ > + msleep(200); > } > > edid = drm_do_get_edid(connector, adv7511_get_edid_block, adv7511); > -- > > Best, > -xinliang > >> >> Regards, >> C.Palminha >> >> # modetest -M drm-arcpgu -c >> Connectors: >> id encoder status type size (mm) modes encoders >> 21 0 connected HDMI-A 0x0 4 20 >> modes: >> name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot) >> 800x600 60 800 840 968 1056 600 601 605 628 flags: phsync, pvsync; type: driver >> 800x600 56 800 824 896 1024 600 601 603 625 flags: phsync, pvsync; type: driver >> 848x480 60 848 864 976 1088 480 486 494 517 flags: phsync, pvsync; type: driver >> 640x480 60 640 656 752 800 480 490 492 525 flags: nhsync, nvsync; type: driver >> props: >> 1 EDID: >> flags: immutable blob >> blobs: >> >> value: >> 2 DPMS: >> flags: enum >> enums: On=0 Standby=1 Suspend=2 Off=3 >> value: 0 >> >> # >> >> On 19-01-2016 16:03, Carlos Palminha wrote: >>> Hi Xiang, >>> >>> Its returning 0 modes... :( >>> >>> Regards, >>> C.Palminha >>> >>> # modetest -M drm-arcpgu -c >>> Connectors: >>> id encoder status type size (mm) modes encoders >>> 21 0 disconnected HDMI-A 0x0 0 20 >>> props: >>> 1 EDID: >>> flags: immutable blob >>> blobs: >>> >>> value: >>> 2 DPMS: >>> flags: enum >>> enums: On=0 Standby=1 Suspend=2 Off=3 >>> value: 0 >>> >>> # >>> >>> On 19-01-2016 03:38, Xinliang Liu wrote: >>>> On 18 January 2016 at 22:45, Carlos Palminha >>>> wrote: >>>> >>>>> I'm also getting a message from DRM saying can't find any crtc or >>>>> sizes...i'm really missing something here. >>>>> :( >>>>> >>>>> -- log -- >>>>> [drm] Initialized drm 1.1.0 20060810 >>>>> drm-arcpgu e0017000.pgu: No connectors reported connected with modes >>>>> [drm] Cannot find any crtc or sizes - going 1024x768 >>>>> Console: switching to colour frame buffer device 128x48 >>>>> drm-arcpgu e0017000.pgu: fb0: frame buffer device >>>>> [drm] Initialized drm-arcpgu 1.0.0 20151127 on minor 0 >>>>> -- log --- >>>>> >>>>> Any help? >>>>> >>>>> Regards, >>>>> C.Palminha >>>>> >>>>> >>>>> On 18-01-2016 14:32, Carlos Palminha wrote: >>>>>> Hi Xinliang, >>>>>> >>>>>> My get_modes seems to be implemented as the rcar driver... >>>>>> Probably still missing some init step? >>>>>> >>>>>> Regards, >>>>>> C.Palminha >>>>>> >>>>>> >>>>>> static int arcpgu_drm_connector_get_modes(struct drm_connector >>>>> *connector) >>>>>> { >>>>>> struct drm_encoder_slave *slave; >>>>>> const struct drm_encoder_slave_funcs *sfuncs; >>>>>> struct arcpgu_drm_connector * con >>>>>> container_of(connector, struct arcpgu_drm_connector, connector); >>>>>> >>>>>> slave = con->encoder_slave; >>>>>> if(slave = NULL) { >>>>>> dev_err(connector->dev->dev, >>>>>> "connector_get_modes: cannot find slave encoder for connector\n"); >>>>>> return 0; >>>>>> } >>>>>> >>>>>> sfuncs = slave->slave_funcs; >>>>>> if(sfuncs->get_modes = NULL){ >>>>>> return 0; >>>>>> } >>>>>> >>>>>> return sfuncs-> >>>>> >>>>> get_modes(&slave->base,connector); >>>>>> } >>>>>> >>>>> >>>> >>>> so, this will call adv7511 driver's >>>> >>>> get_modes call back. >>>> I wonder if the system boot up, it can get modes or not. >>>> You can test it with the modetest. i.e. $ modetest -M DRM_DRIVER_NAME -c >>>> >>>> >>>> >>>> >>>>>> On 31-12-2015 02:19, Xinliang Liu wrote: >>>>>>> >>>>>>> >>>>>>> On 31 December 2015 at 02:46, Carlos Palminha >>>>>>> > >>>>> wrote: >>>>>>> >>>>>>> Hi guys, >>>>>>> >>>>>>> I'm writing a DRM driver for a framebuffer embedded hardware that >>>>>>> uses an i2c encoder (adv7511), following the basic steps suggested >>>>>>> by Laurent in "anatomy of an embedded KMS driver": >>>>>>> https://www.youtube.com/watch?v=Ja8fM7rTae4 >>>>>>> >>>>>>> After initiliazing all kms, crtc, encoder, i2c, connector functions >>>>>>> and structures i'm calling drm_fbdev_cma_init to create a fbdev. >>>>>>> >>>>>>> When booting i'm getting an error message saying "No connectors >>>>>>> reported connected with modes", but the driver init is ok and i can >>>>>>> find the /dev/dri/* and /dev/fb0 devices. >>>>>>> >>>>>>> Any clue what i might be missing during the driver load? >>>>>>> >>>>>>> >>>>>>> I think you should check on the 'get_modes' call back of adv7511 >>>>>>> driver. (Or, if possible show us the code.) >>>>>>> >>>>>>> Best, >>>>>>> -xinliang >>>>>>> >>>>>>> >>>>>>> Thanks... >>>>>>> >>>>>>> Regards, >>>>>>> C.Palminha >>>>>>> >>>>>>> --- boot log snippet --- >>>>>>> [drm] Initialized drm 1.1.0 20060810 >>>>>>> drm-arcpgu e0017000.pgu: No connectors reported connected with modes >>>>>>> [drm] Cannot find any crtc or sizes - going 1024x768 >>>>>>> Console: switching to colour frame buffer device 128x48 >>>>>>> drm-arcpgu e0017000.pgu: fb0: frame buffer device >>>>>>> [drm] Initialized drm-arcpgu 1.0.0 20151127 on minor 0 >>>>>>> --- boot log snippet --- >>>>>>> -- >>>>>>> To unsubscribe from this list: send the line "unsubscribe >>>>>>> linux-fbdev" in >>>>>>> the body of a message to majordomo@vger.kernel.org >>>>>>> >>>>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html >>>>>>> >>>>>>> >>>>> >>>> From mboxrd@z Thu Jan 1 00:00:00 1970 From: Carlos Palminha Subject: Re: Whats missing in my new FB DRM driver... "No connectors reported connected with modes"? Date: Thu, 21 Jan 2016 18:09:53 +0000 Message-ID: <56A11EF1.3070004@synopsys.com> References: <5684268E.2000607@synopsys.com> <569CF78F.7050303@synopsys.com> <569CFA9B.4060108@synopsys.com> <569E5E51.8000303@synopsys.com> <569E69EB.3010003@synopsys.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from smtprelay.synopsys.com (smtprelay2.synopsys.com [198.182.60.111]) by gabe.freedesktop.org (Postfix) with ESMTPS id 0E3206EB3F for ; Thu, 21 Jan 2016 10:10:47 -0800 (PST) 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: Xinliang Liu , Carlos Palminha Cc: linux-fbdev@vger.kernel.org, tomi.valkeinen@ti.com, Alexey Brodkin , laurent.pinchart@ideasonboard.com, dri-devel List-Id: dri-devel@lists.freedesktop.org aSBtYWRlIHNvbWUgcHJvZ3Jlc3MgaW4gaWRlbnRpZnlpbmcgdGhlIGlzc3VlLi4uCldoZW4gbXkg ZHJpdmVyIGNhbGxzIGRybV9mYl9oZWxwZXJfaW5pdGlhbF9jb25maWcgaXQgc2VlbXMgRFJNIGJs b2NrcyB3YWl0aW5nIGZvciByZWdpc3Rlcl9mcmFtZWJ1ZmZlciB0byByZXR1cm4uClRoZSBzZXF1 ZW5jZSBpcyBkcm1fZmJfaGVscGVyX2luaXRpYWxfY29uZmlnLT5kcm1fZmJfaGVscGVyX3Npbmds ZV9mYl9wcm9iZS0+cmVnaXN0ZXJfZnJhbWVidWZmZXIuCgpJdHMgc3RyYW5nZSBiZWNhdXNlIHJl Z2lzdGVyX2ZyYW1lYnVmZmVyIGZ1bmN0aW9uIGlzIGp1c3QgYSBtdXRleCBhcm91bmQgZG9fcmVn aXN0ZXJfZnJhbWVidWZmZXIuCgpBbnkgY2x1ZT8hCgpPbiAyMC0wMS0yMDE2IDAxOjI0LCBYaW5s aWFuZyBMaXUgd3JvdGU6Cj4gT24gMjAgSmFudWFyeSAyMDE2IGF0IDAwOjUyLCBDYXJsb3MgUGFs bWluaGEKPiA8Q0FSTE9TLlBBTE1JTkhBQHN5bm9wc3lzLmNvbT4gd3JvdGU6Cj4+IHdoZW4gaSBi b290IHRoZSBrZXJuZWwgYW5kIGNvbm5lY3QgdGhlIEhETUkgY2FibGUgYWZ0ZXIgYm9vdGluZyBp IGNhbiByZXRyaWV2ZSA0IG1vZGVzLi4uIDopCj4+Cj4+IGlmIGkgYm9vdCBsaW51eCB3aXRoIHRo ZSBIRE1JIGNhYmxlIGluc2VydGVkIHRoZSBrZXJuZWwgaGFuZ3MuCj4gCj4gV2hhdCdzIHRoZSBo YW5nIGtlcm5lbCBsb2cuIElzIGl0IGEgb29wcz8KPiAKPj4gUG9zc2libGUgcmVsYXRpb24gd2l0 aCBIUEQ/Cj4gCj4gWWVzLCAgSSB0aGluayB0aGVyZSBtaWdodCBiZSBzb21ldGhpbmcgd3Jvbmcg d2l0aCB0aGUgSFBEIGludGVycnVwdCBvcgo+IHRoZSBFRElEIHJlYWR5IGludGVycnVwdC4KPiBJ IGRvIG1lZXQgdGhlIHNpbWlsYXIgaXNzdWUgYmVmb3JlIHdoZW4gSSB1c2luZyB0aGUgdXBzdHJl YW0gYWR2NzUxMQo+IGRyaXZlciB0byBlbmFibGUgYWR2NzUzMy4KPiBJIGZvdW5kIHRoYXQgdGhl IEhQRCBhbmQgRURJRCBpbnRlcnJ1cHQgaXMgbm90IHJlbGlhYmxlLgo+IEluIG9yZGVyIHRvIGdl dCBtb2RlcyBzdGFibHksIEkgaGF2ZSB0byBhZGQgc29tZSBkZWxheSBsaWtlIGJlbGxvdzoKPiAt LQo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pMmMvYWR2NzUxMS5jCj4gKysrIGIvZHJpdmVycy9n cHUvZHJtL2kyYy9hZHY3NTExLmMKPiBAQCAtNjU3LDYgKzY1Nyw4IEBAIHN0YXRpYyBpbnQgYWR2 NzUxMV9nZXRfbW9kZXMoc3RydWN0IGFkdjc1MTEgKmFkdjc1MTEsCj4gICAgICAgICAgICAgICAg IHJlZ21hcF91cGRhdGVfYml0cyhhZHY3NTExLT5yZWdtYXAsIEFEVjc1MTFfUkVHX1BPV0VSLAo+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURWNzUxMV9QT1dFUl9QT1dFUl9E T1dOLCAwKTsKPiAgICAgICAgICAgICAgICAgYWR2NzUxMS0+Y3VycmVudF9lZGlkX3NlZ21lbnQg PSAtMTsKPiArICAgICAgICAgICAgICAgLyogd2FpdCBzb21lIHRpbWUgZm9yIGVkaWQgaXMgcmVh ZHkgKi8KPiArICAgICAgICAgICAgICAgbXNsZWVwKDIwMCk7Cj4gICAgICAgICB9Cj4gCj4gICAg ICAgICBlZGlkID0gZHJtX2RvX2dldF9lZGlkKGNvbm5lY3RvciwgYWR2NzUxMV9nZXRfZWRpZF9i bG9jaywgYWR2NzUxMSk7Cj4gLS0KPiAKPiBCZXN0LAo+IC14aW5saWFuZwo+IAo+Pgo+PiBSZWdh cmRzLAo+PiBDLlBhbG1pbmhhCj4+Cj4+ICMgbW9kZXRlc3QgLU0gZHJtLWFyY3BndSAtYwo+PiBD b25uZWN0b3JzOgo+PiBpZCAgICAgIGVuY29kZXIgc3RhdHVzICAgICAgICAgIHR5cGUgICAgc2l6 ZSAobW0pICAgICAgIG1vZGVzICAgZW5jb2RlcnMKPj4gMjEgICAgICAwICAgICAgIGNvbm5lY3Rl ZCAgICAgICBIRE1JLUEgIDB4MCAgICAgICAgICAgICA0ICAgICAgIDIwCj4+ICAgbW9kZXM6Cj4+ ICAgICAgICAgbmFtZSByZWZyZXNoIChIeikgaGRpc3AgaHNzIGhzZSBodG90IHZkaXNwIHZzcyB2 c2UgdnRvdCkKPj4gICA4MDB4NjAwIDYwIDgwMCA4NDAgOTY4IDEwNTYgNjAwIDYwMSA2MDUgNjI4 IGZsYWdzOiBwaHN5bmMsIHB2c3luYzsgdHlwZTogZHJpdmVyCj4+ICAgODAweDYwMCA1NiA4MDAg ODI0IDg5NiAxMDI0IDYwMCA2MDEgNjAzIDYyNSBmbGFnczogcGhzeW5jLCBwdnN5bmM7IHR5cGU6 IGRyaXZlcgo+PiAgIDg0OHg0ODAgNjAgODQ4IDg2NCA5NzYgMTA4OCA0ODAgNDg2IDQ5NCA1MTcg ZmxhZ3M6IHBoc3luYywgcHZzeW5jOyB0eXBlOiBkcml2ZXIKPj4gICA2NDB4NDgwIDYwIDY0MCA2 NTYgNzUyIDgwMCA0ODAgNDkwIDQ5MiA1MjUgZmxhZ3M6IG5oc3luYywgbnZzeW5jOyB0eXBlOiBk cml2ZXIKPj4gICBwcm9wczoKPj4gICAgICAgICAxIEVESUQ6Cj4+ICAgICAgICAgICAgICAgICBm bGFnczogaW1tdXRhYmxlIGJsb2IKPj4gICAgICAgICAgICAgICAgIGJsb2JzOgo+Pgo+PiAgICAg ICAgICAgICAgICAgdmFsdWU6Cj4+ICAgICAgICAgMiBEUE1TOgo+PiAgICAgICAgICAgICAgICAg ZmxhZ3M6IGVudW0KPj4gICAgICAgICAgICAgICAgIGVudW1zOiBPbj0wIFN0YW5kYnk9MSBTdXNw ZW5kPTIgT2ZmPTMKPj4gICAgICAgICAgICAgICAgIHZhbHVlOiAwCj4+Cj4+ICMKPj4KPj4gT24g MTktMDEtMjAxNiAxNjowMywgQ2FybG9zIFBhbG1pbmhhIHdyb3RlOgo+Pj4gSGkgWGlhbmcsCj4+ Pgo+Pj4gSXRzIHJldHVybmluZyAwIG1vZGVzLi4uIDooCj4+Pgo+Pj4gUmVnYXJkcywKPj4+IEMu UGFsbWluaGEKPj4+Cj4+PiAjIG1vZGV0ZXN0IC1NIGRybS1hcmNwZ3UgLWMKPj4+IENvbm5lY3Rv cnM6Cj4+PiBpZCAgICAgIGVuY29kZXIgc3RhdHVzICAgICAgICAgIHR5cGUgICAgc2l6ZSAobW0p ICAgICAgIG1vZGVzICAgZW5jb2RlcnMKPj4+IDIxICAgICAgMCAgICAgICBkaXNjb25uZWN0ZWQg ICAgSERNSS1BICAweDAgICAgICAgICAgICAgMCAgICAgICAyMAo+Pj4gICBwcm9wczoKPj4+ICAg ICAgICAgMSBFRElEOgo+Pj4gICAgICAgICAgICAgICAgIGZsYWdzOiBpbW11dGFibGUgYmxvYgo+ Pj4gICAgICAgICAgICAgICAgIGJsb2JzOgo+Pj4KPj4+ICAgICAgICAgICAgICAgICB2YWx1ZToK Pj4+ICAgICAgICAgMiBEUE1TOgo+Pj4gICAgICAgICAgICAgICAgIGZsYWdzOiBlbnVtCj4+PiAg ICAgICAgICAgICAgICAgZW51bXM6IE9uPTAgU3RhbmRieT0xIFN1c3BlbmQ9MiBPZmY9Mwo+Pj4g ICAgICAgICAgICAgICAgIHZhbHVlOiAwCj4+Pgo+Pj4gIwo+Pj4KPj4+IE9uIDE5LTAxLTIwMTYg MDM6MzgsIFhpbmxpYW5nIExpdSB3cm90ZToKPj4+PiBPbiAxOCBKYW51YXJ5IDIwMTYgYXQgMjI6 NDUsIENhcmxvcyBQYWxtaW5oYSA8Q0FSTE9TLlBBTE1JTkhBQHN5bm9wc3lzLmNvbT4KPj4+PiB3 cm90ZToKPj4+Pgo+Pj4+PiBJJ20gYWxzbyBnZXR0aW5nIGEgbWVzc2FnZSBmcm9tIERSTSBzYXlp bmcgY2FuJ3QgZmluZCBhbnkgY3J0YyBvcgo+Pj4+PiBzaXplcy4uLmknbSByZWFsbHkgbWlzc2lu ZyBzb21ldGhpbmcgaGVyZS4KPj4+Pj4gOigKPj4+Pj4KPj4+Pj4gLS0gbG9nIC0tCj4+Pj4+IFtk cm1dIEluaXRpYWxpemVkIGRybSAxLjEuMCAyMDA2MDgxMAo+Pj4+PiBkcm0tYXJjcGd1IGUwMDE3 MDAwLnBndTogTm8gY29ubmVjdG9ycyByZXBvcnRlZCBjb25uZWN0ZWQgd2l0aCBtb2Rlcwo+Pj4+ PiBbZHJtXSBDYW5ub3QgZmluZCBhbnkgY3J0YyBvciBzaXplcyAtIGdvaW5nIDEwMjR4NzY4Cj4+ Pj4+IENvbnNvbGU6IHN3aXRjaGluZyB0byBjb2xvdXIgZnJhbWUgYnVmZmVyIGRldmljZSAxMjh4 NDgKPj4+Pj4gZHJtLWFyY3BndSBlMDAxNzAwMC5wZ3U6IGZiMDogZnJhbWUgYnVmZmVyIGRldmlj ZQo+Pj4+PiBbZHJtXSBJbml0aWFsaXplZCBkcm0tYXJjcGd1IDEuMC4wIDIwMTUxMTI3IG9uIG1p bm9yIDAKPj4+Pj4gLS0gbG9nIC0tLQo+Pj4+Pgo+Pj4+PiBBbnkgaGVscD8KPj4+Pj4KPj4+Pj4g UmVnYXJkcywKPj4+Pj4gQy5QYWxtaW5oYQo+Pj4+Pgo+Pj4+Pgo+Pj4+PiBPbiAxOC0wMS0yMDE2 IDE0OjMyLCBDYXJsb3MgUGFsbWluaGEgd3JvdGU6Cj4+Pj4+PiBIaSBYaW5saWFuZywKPj4+Pj4+ Cj4+Pj4+PiBNeSBnZXRfbW9kZXMgc2VlbXMgdG8gYmUgaW1wbGVtZW50ZWQgYXMgdGhlIHJjYXIg ZHJpdmVyLi4uCj4+Pj4+PiBQcm9iYWJseSBzdGlsbCBtaXNzaW5nIHNvbWUgaW5pdCBzdGVwPwo+ Pj4+Pj4KPj4+Pj4+IFJlZ2FyZHMsCj4+Pj4+PiBDLlBhbG1pbmhhCj4+Pj4+Pgo+Pj4+Pj4KPj4+ Pj4+IHN0YXRpYyBpbnQgYXJjcGd1X2RybV9jb25uZWN0b3JfZ2V0X21vZGVzKHN0cnVjdCBkcm1f Y29ubmVjdG9yCj4+Pj4+ICpjb25uZWN0b3IpCj4+Pj4+PiB7Cj4+Pj4+PiBzdHJ1Y3QgZHJtX2Vu Y29kZXJfc2xhdmUgKnNsYXZlOwo+Pj4+Pj4gY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX3NsYXZl X2Z1bmNzICpzZnVuY3M7Cj4+Pj4+PiBzdHJ1Y3QgYXJjcGd1X2RybV9jb25uZWN0b3IgKiBjb24g PQo+Pj4+Pj4gY29udGFpbmVyX29mKGNvbm5lY3Rvciwgc3RydWN0IGFyY3BndV9kcm1fY29ubmVj dG9yLCBjb25uZWN0b3IpOwo+Pj4+Pj4KPj4+Pj4+IHNsYXZlID0gY29uLT5lbmNvZGVyX3NsYXZl Owo+Pj4+Pj4gaWYoc2xhdmUgPT0gTlVMTCkgewo+Pj4+Pj4gZGV2X2Vycihjb25uZWN0b3ItPmRl di0+ZGV2LAo+Pj4+Pj4gImNvbm5lY3Rvcl9nZXRfbW9kZXM6IGNhbm5vdCBmaW5kIHNsYXZlIGVu Y29kZXIgZm9yIGNvbm5lY3RvclxuIik7Cj4+Pj4+PiByZXR1cm4gMDsKPj4+Pj4+IH0KPj4+Pj4+ Cj4+Pj4+PiBzZnVuY3MgPSBzbGF2ZS0+c2xhdmVfZnVuY3M7Cj4+Pj4+PiBpZihzZnVuY3MtPmdl dF9tb2RlcyA9PSBOVUxMKXsKPj4+Pj4+IHJldHVybiAwOwo+Pj4+Pj4gfQo+Pj4+Pj4KPj4+Pj4+ IHJldHVybiBzZnVuY3MtPgo+Pj4+Pgo+Pj4+PiBnZXRfbW9kZXMoJnNsYXZlLT5iYXNlLGNvbm5l Y3Rvcik7Cj4+Pj4+PiB9Cj4+Pj4+Pgo+Pj4+Pgo+Pj4+Cj4+Pj4gc28sIHRoaXMgd2lsbCBjYWxs IGFkdjc1MTEgZHJpdmVyJ3MKPj4+Pgo+Pj4+IGdldF9tb2RlcyBjYWxsIGJhY2suCj4+Pj4gSSB3 b25kZXIgaWYgdGhlIHN5c3RlbSBib290IHVwLCBpdCBjYW4gZ2V0IG1vZGVzIG9yIG5vdC4KPj4+ PiBZb3UgY2FuIHRlc3QgaXQgd2l0aCB0aGUgbW9kZXRlc3QuIGkuZS4gJCBtb2RldGVzdCAtTSBE Uk1fRFJJVkVSX05BTUUgLWMKPj4+Pgo+Pj4+Cj4+Pj4KPj4+Pgo+Pj4+Pj4gT24gMzEtMTItMjAx NSAwMjoxOSwgWGlubGlhbmcgTGl1IHdyb3RlOgo+Pj4+Pj4+Cj4+Pj4+Pj4KPj4+Pj4+PiBPbiAz MSBEZWNlbWJlciAyMDE1IGF0IDAyOjQ2LCBDYXJsb3MgUGFsbWluaGEKPj4+Pj4+PiA8Q0FSTE9T LlBBTE1JTkhBQHN5bm9wc3lzLmNvbSA8bWFpbHRvOkNBUkxPUy5QQUxNSU5IQUBzeW5vcHN5cy5j b20+Pgo+Pj4+PiB3cm90ZToKPj4+Pj4+Pgo+Pj4+Pj4+ICAgICBIaSBndXlzLAo+Pj4+Pj4+Cj4+ Pj4+Pj4gICAgIEknbSB3cml0aW5nIGEgRFJNIGRyaXZlciBmb3IgYSBmcmFtZWJ1ZmZlciBlbWJl ZGRlZCBoYXJkd2FyZSB0aGF0Cj4+Pj4+Pj4gICAgIHVzZXMgYW4gaTJjIGVuY29kZXIgKGFkdjc1 MTEpLCBmb2xsb3dpbmcgdGhlIGJhc2ljIHN0ZXBzIHN1Z2dlc3RlZAo+Pj4+Pj4+ICAgICBieSBM YXVyZW50IGluICJhbmF0b215IG9mIGFuIGVtYmVkZGVkIEtNUyBkcml2ZXIiOgo+Pj4+Pj4+ICAg ICBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUphOGZNN3JUYWU0Cj4+Pj4+Pj4KPj4+ Pj4+PiAgICAgQWZ0ZXIgaW5pdGlsaWF6aW5nIGFsbCBrbXMsIGNydGMsIGVuY29kZXIsIGkyYywg Y29ubmVjdG9yIGZ1bmN0aW9ucwo+Pj4+Pj4+ICAgICBhbmQgc3RydWN0dXJlcyBpJ20gY2FsbGlu ZyBkcm1fZmJkZXZfY21hX2luaXQgdG8gY3JlYXRlIGEgZmJkZXYuCj4+Pj4+Pj4KPj4+Pj4+PiAg ICAgV2hlbiBib290aW5nIGknbSBnZXR0aW5nIGFuIGVycm9yIG1lc3NhZ2Ugc2F5aW5nICJObyBj b25uZWN0b3JzCj4+Pj4+Pj4gICAgIHJlcG9ydGVkIGNvbm5lY3RlZCB3aXRoIG1vZGVzIiwgYnV0 IHRoZSBkcml2ZXIgaW5pdCBpcyBvayBhbmQgaSBjYW4KPj4+Pj4+PiAgICAgZmluZCB0aGUgL2Rl di9kcmkvKiBhbmQgL2Rldi9mYjAgZGV2aWNlcy4KPj4+Pj4+Pgo+Pj4+Pj4+ICAgICBBbnkgY2x1 ZSB3aGF0IGkgbWlnaHQgYmUgbWlzc2luZyBkdXJpbmcgdGhlIGRyaXZlciBsb2FkPwo+Pj4+Pj4+ Cj4+Pj4+Pj4KPj4+Pj4+PiBJIHRoaW5rIHlvdSBzaG91bGQgY2hlY2sgb24gdGhlICdnZXRfbW9k ZXMnIGNhbGwgYmFjayBvZiBhZHY3NTExCj4+Pj4+Pj4gZHJpdmVyLiAoT3IsIGlmIHBvc3NpYmxl IHNob3cgdXMgdGhlIGNvZGUuKQo+Pj4+Pj4+Cj4+Pj4+Pj4gQmVzdCwKPj4+Pj4+PiAteGlubGlh bmcKPj4+Pj4+Pgo+Pj4+Pj4+Cj4+Pj4+Pj4gICAgIFRoYW5rcy4uLgo+Pj4+Pj4+Cj4+Pj4+Pj4g ICAgIFJlZ2FyZHMsCj4+Pj4+Pj4gICAgIEMuUGFsbWluaGEKPj4+Pj4+Pgo+Pj4+Pj4+ICAgICAt LS0gYm9vdCBsb2cgc25pcHBldCAtLS0KPj4+Pj4+PiAgICAgW2RybV0gSW5pdGlhbGl6ZWQgZHJt IDEuMS4wIDIwMDYwODEwCj4+Pj4+Pj4gICAgIGRybS1hcmNwZ3UgZTAwMTcwMDAucGd1OiBObyBj b25uZWN0b3JzIHJlcG9ydGVkIGNvbm5lY3RlZCB3aXRoIG1vZGVzCj4+Pj4+Pj4gICAgIFtkcm1d IENhbm5vdCBmaW5kIGFueSBjcnRjIG9yIHNpemVzIC0gZ29pbmcgMTAyNHg3NjgKPj4+Pj4+PiAg ICAgQ29uc29sZTogc3dpdGNoaW5nIHRvIGNvbG91ciBmcmFtZSBidWZmZXIgZGV2aWNlIDEyOHg0 OAo+Pj4+Pj4+ICAgICBkcm0tYXJjcGd1IGUwMDE3MDAwLnBndTogZmIwOiAgZnJhbWUgYnVmZmVy IGRldmljZQo+Pj4+Pj4+ICAgICBbZHJtXSBJbml0aWFsaXplZCBkcm0tYXJjcGd1IDEuMC4wIDIw MTUxMTI3IG9uIG1pbm9yIDAKPj4+Pj4+PiAgICAgLS0tIGJvb3QgbG9nIHNuaXBwZXQgLS0tCj4+ Pj4+Pj4gICAgIC0tCj4+Pj4+Pj4gICAgIFRvIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0OiBz ZW5kIHRoZSBsaW5lICJ1bnN1YnNjcmliZQo+Pj4+Pj4+ICAgICBsaW51eC1mYmRldiIgaW4KPj4+ Pj4+PiAgICAgdGhlIGJvZHkgb2YgYSBtZXNzYWdlIHRvIG1ham9yZG9tb0B2Z2VyLmtlcm5lbC5v cmcKPj4+Pj4+PiAgICAgPG1haWx0bzptYWpvcmRvbW9Admdlci5rZXJuZWwub3JnPgo+Pj4+Pj4+ ICAgICBNb3JlIG1ham9yZG9tbyBpbmZvIGF0IGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvbWFqb3Jk b21vLWluZm8uaHRtbAo+Pj4+Pj4+Cj4+Pj4+Pj4KPj4+Pj4KPj4+PgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRy aS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=