From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755351AbbBBNJq (ORCPT ); Mon, 2 Feb 2015 08:09:46 -0500 Received: from pandora.arm.linux.org.uk ([78.32.30.218]:42717 "EHLO pandora.arm.linux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754233AbbBBNJp (ORCPT ); Mon, 2 Feb 2015 08:09:45 -0500 Date: Mon, 2 Feb 2015 13:09:20 +0000 From: Russell King - ARM Linux To: Yang Kuankuan Cc: Daniel Kurtz , David Airlie , Philipp Zabel , Fabio Estevam , Shawn Guo , Rob Clark , Mark Yao , Daniel Vetter , dri-devel , "linux-kernel@vger.kernel.org" , dbehr@chromoum.org, Heiko =?iso-8859-1?Q?St=FCbner?= , Douglas Anderson , =?iso-8859-1?Q?St=E9phane?= Marchesin , rockchip-discuss Subject: Re: [PATCH v2 08/12] drm: bridge/dw_hdmi: add audio config interfaces Message-ID: <20150202130920.GC8656@n2100.arm.linux.org.uk> References: <1422617031-25098-1-git-send-email-ykk@rock-chips.com> <1422617543-25684-1-git-send-email-ykk@rock-chips.com> <20150131114806.GD26493@n2100.arm.linux.org.uk> <54CCE7EF.5040706@rock-chips.com> <20150202115315.GB8656@n2100.arm.linux.org.uk> <54CF6E45.8080104@rock-chips.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54CF6E45.8080104@rock-chips.com> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Feb 02, 2015 at 07:32:05AM -0500, Yang Kuankuan wrote: > On 02/02/2015 06:53 AM, Russell King - ARM Linux wrote: > >On Mon, Feb 02, 2015 at 12:02:50PM +0800, Daniel Kurtz wrote: > >>Hi ykk, > >> > >>On Sat, Jan 31, 2015 at 10:34 PM, Yang Kuankuan wrote: > >>>On 01/31/2015 06:48 AM, Russell King - ARM Linux wrote: > >>>>>+void hdmi_audio_clk_enable(struct dw_hdmi *hdmi) > >>>>>+{ > >>>>>+ if (hdmi->audio_enable) > >>>>>+ return; > >>>>>+ > >>>>>+ mutex_lock(&hdmi->audio_mutex); > >>>>>+ hdmi->audio_enable = true; > >>>>>+ hdmi_modb(hdmi, 0, HDMI_MC_CLKDIS_AUDCLK_DISABLE, > >>>>>HDMI_MC_CLKDIS); > >>>>>+ mutex_unlock(&hdmi->audio_mutex); > >>>>This is racy. The test needs to be within the mutex-protected region. > >>>This function will be called by other driver (dw-hdmi-audio), both modify > >>>the variable "hdmi->audio_enable", so i add the mutex-protected. > >>>From your comment it isn't clear whether you understand what Russell meant. > >>He is say you should do the following: > >> > >>{ > >> mutex_lock(&hdmi->audio_mutex); > >> > >> if (hdmi->audio_enable) { > >> mutex_unlock(&hdmi->audio_mutex); > >> return; > >> } > >> hdmi->audio_enable = true; > >> hdmi_modb(hdmi, 0, HDMI_MC_CLKDIS_AUDCLK_DISABLE, HDMI_MC_CLKDIS); > >> > >> mutex_unlock(&hdmi->audio_mutex); > >>} > >Yes, however, I prefer this kind of layout: > > > > mutex_lock(&hdmi->audio_mutex); > > if (!hdmi->audio_enable) { > > hdmi->audio_enable = true; > > hdmi_modb(hdmi, 0, HDMI_MC_CLKDIS_AUDCLK_DISABLE, > > HDMI_MC_CLKDIS); > > } > > > > mutex_unlock(&hdmi->audio_mutex); > > > >but that's a matter of personal opinion. The important thing is that the > >testing and setting of the flag are both within the protected region. > > > >However, there are other bugs here: what if the audio driver is calling > >the sample rate setting function at the same time that a mode switch is > >occuring. We actually need a mutex to protect more than just the > >audio_enable flag. > > Okay, got it. > > Thanks. : ) I've been moving my code closer to what you have posted. I've split up your patches into smaller steps so each change can be evaluated on iMX6. So far: drm: bridge/dw_hdmi: combine hdmi_set_clock_regenerator_n() and hdmi_regenerate_cts() This patch _just_ combines the two functions without any other changes. drm: bridge/dw_hdmi: protect n/cts setting with a mutex This patch _just_ adds a mutex to protect the calls to hdmi_set_clk_regenerator(), since we will need to call that from both the DRM and audio drivers. drm: bridge/dw_hdmi: adjust n/cts setting order This patch changes the order to: - write CTS3 CTS_manual = 0 - write CTS3 N_shift = 0 - write CTS3 CTS value - write CTS2 CTS value - write CTS1 CTS value - write N3 N value - write N2 N value - write N1 N value which is broadly what you're doing, but without the initial N3 write and without CTS_manual=1. I've asked Freescale whether they can clarify what effect adding those would have on their SoCs. Note: the mutex in my second patch needs to be a spinlock - as it seems my new workaround for iMX6 ERR005174 needs to call the CTS/N setting functions in an irqs-off region (from the ALSA ->trigger callback.) That will need further rework of the CTS/N code to reduce the size of the spinlock protected region. Incidentally, your Synopsis IP indicates that it is the same revision as the iMX6's IP revision which suffers from this ERR005174 errata. I think you need to check whether this errata applies on your SoC too. Seach for "iMX6 ERR005174" in google. > >>By the way, it doesn't matter that the function is called from another driver. > >>What matters is that this function can be called concurrently on > >>multiple different threads of execution to change the hdmi audio > >>enable state. > >>>From DRM land, it is called with DRM lock held when enabling/disabling > >>hdmi audio (mode_set / DPMS). > >>It is also called from audio land, when enabling/disabling audio in > >>response to some audio events (userspace ioctls?). I'm not sure > >>exactly how the audio side works, or what locks are involved, but this > >>mutex synchronizes calls from these two worlds to ensure that > >>"hdmi->audio_enable" field always matches the current (intended) > >>status of the hdmi audio clock. This would be useful, for example, if > >>you needed to temporarily disable all HDMI clocks during a mode set, > >>and then restore the audio clock to its pre-mode_set state: > >There's some rather quirky comments in the driver right now which make > >me uneasy about changing things too much. > > > >My initial idea would be that audio should remain disabled until the > >audio driver wants it enabled, and the CTS/N values should either be > >left alone, or set to a value which disables them (there is an iMX6 > >errata which says to set N=0 initially, but as seems common with iMX6 > >errata, I see no code implementing the method specified in the > >documentation - I have found code implementing something similar > >though.) > > I am confused with the way that audio driver realize the display > resolution-changing. > If audio driver cannot knowing that, then audio clock may be closed > permanently ? The audio driver shouldn't care about the display resolution. That should be the responsibility of the dw_hdmi core - as it is at the moment. > static void hdmi_keep_audio_clk_status(struct dw_hdmi *hdmi) > { > mutex_lock(&hdmi->audio_mutex); > > if (hdmi->audio_enable) > hdmi_modb(hdmi, 0, HDMI_MC_CLKDIS_AUDCLK_DISABLE, > HDMI_MC_CLKDIS); > else > hdmi_modb(hdmi, HDMI_MC_CLKDIS_AUDCLK_DISABLE, > HDMI_MC_CLKDIS_AUDCLK_DISABLE, HDMI_MC_CLKDIS); > > mutex_unlock(&hdmi->audio_mutex); > } > > /* HDMI Initialization Step E - Configure audio */ > hdmi_clk_regenerator_update_pixel_clock(hdmi); > hdmi_keep_audio_clk_status(hdmi); > > keep audio status maybe suitable here. What I don't know right now is what triggers this overflow indication in HDMI_IH_FC_STAT2, and whether the code I quoted (which fakes the audio setup) is actually necessary. In other words: - is it necessary to have the audio clock enabled when video is enabled to prevent the overflow indication? We don't know. Therefore, we can't say whether it is permitted to disable the audio clock when audio is inactive. - is it necessary to program a dummy CTS/N value for 74.25MHz/48kHz, or can we program a non-zero CTS value and a zero N at initialisation until the audio driver comes up? Again, we don't know. What we do know is that as the driver stands, it works for video output. With my changes for AHB audio support on the iMX6 (which includes some errata workarounds found in the iMX6 errata documentation to avoid FIFO issues), we have working audio there. -- FTTC broadband for 0.8mile line: currently at 10.5Mbps down 400kbps up according to speedtest.net. From mboxrd@z Thu Jan 1 00:00:00 1970 From: Russell King - ARM Linux Subject: Re: [PATCH v2 08/12] drm: bridge/dw_hdmi: add audio config interfaces Date: Mon, 2 Feb 2015 13:09:20 +0000 Message-ID: <20150202130920.GC8656@n2100.arm.linux.org.uk> References: <1422617031-25098-1-git-send-email-ykk@rock-chips.com> <1422617543-25684-1-git-send-email-ykk@rock-chips.com> <20150131114806.GD26493@n2100.arm.linux.org.uk> <54CCE7EF.5040706@rock-chips.com> <20150202115315.GB8656@n2100.arm.linux.org.uk> <54CF6E45.8080104@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from pandora.arm.linux.org.uk (pandora.arm.linux.org.uk [78.32.30.218]) by gabe.freedesktop.org (Postfix) with ESMTP id DA6C2896E9 for ; Mon, 2 Feb 2015 05:09:43 -0800 (PST) Content-Disposition: inline In-Reply-To: <54CF6E45.8080104@rock-chips.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Yang Kuankuan Cc: Fabio Estevam , Heiko =?iso-8859-1?Q?St=FCbner?= , dbehr@chromoum.org, "linux-kernel@vger.kernel.org" , Douglas Anderson , dri-devel , rockchip-discuss , =?iso-8859-1?Q?St=E9phane?= Marchesin , Mark Yao List-Id: dri-devel@lists.freedesktop.org T24gTW9uLCBGZWIgMDIsIDIwMTUgYXQgMDc6MzI6MDVBTSAtMDUwMCwgWWFuZyBLdWFua3VhbiB3 cm90ZToKPiBPbiAwMi8wMi8yMDE1IDA2OjUzIEFNLCBSdXNzZWxsIEtpbmcgLSBBUk0gTGludXgg d3JvdGU6Cj4gPk9uIE1vbiwgRmViIDAyLCAyMDE1IGF0IDEyOjAyOjUwUE0gKzA4MDAsIERhbmll bCBLdXJ0eiB3cm90ZToKPiA+PkhpIHlraywKPiA+Pgo+ID4+T24gU2F0LCBKYW4gMzEsIDIwMTUg YXQgMTA6MzQgUE0sIFlhbmcgS3Vhbmt1YW4gPHlra0Byb2NrLWNoaXBzLmNvbT4gd3JvdGU6Cj4g Pj4+T24gMDEvMzEvMjAxNSAwNjo0OCBBTSwgUnVzc2VsbCBLaW5nIC0gQVJNIExpbnV4IHdyb3Rl Ogo+ID4+Pj4+K3ZvaWQgaGRtaV9hdWRpb19jbGtfZW5hYmxlKHN0cnVjdCBkd19oZG1pICpoZG1p KQo+ID4+Pj4+K3sKPiA+Pj4+PisgICAgICAgaWYgKGhkbWktPmF1ZGlvX2VuYWJsZSkKPiA+Pj4+ PisgICAgICAgICAgICAgICByZXR1cm47Cj4gPj4+Pj4rCj4gPj4+Pj4rICAgICAgIG11dGV4X2xv Y2soJmhkbWktPmF1ZGlvX211dGV4KTsKPiA+Pj4+PisgICAgICAgaGRtaS0+YXVkaW9fZW5hYmxl ID0gdHJ1ZTsKPiA+Pj4+PisgICAgICAgaGRtaV9tb2RiKGhkbWksIDAsIEhETUlfTUNfQ0xLRElT X0FVRENMS19ESVNBQkxFLAo+ID4+Pj4+SERNSV9NQ19DTEtESVMpOwo+ID4+Pj4+KyAgICAgICBt dXRleF91bmxvY2soJmhkbWktPmF1ZGlvX211dGV4KTsKPiA+Pj4+VGhpcyBpcyByYWN5LiAgVGhl IHRlc3QgbmVlZHMgdG8gYmUgd2l0aGluIHRoZSBtdXRleC1wcm90ZWN0ZWQgcmVnaW9uLgo+ID4+ PlRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYnkgb3RoZXIgZHJpdmVyIChkdy1oZG1pLWF1 ZGlvKSwgYm90aCBtb2RpZnkKPiA+Pj50aGUgdmFyaWFibGUgImhkbWktPmF1ZGlvX2VuYWJsZSIs IHNvIGkgYWRkIHRoZSBtdXRleC1wcm90ZWN0ZWQuCj4gPj4+RnJvbSB5b3VyIGNvbW1lbnQgaXQg aXNuJ3QgY2xlYXIgd2hldGhlciB5b3UgdW5kZXJzdGFuZCB3aGF0IFJ1c3NlbGwgbWVhbnQuCj4g Pj5IZSBpcyBzYXkgeW91IHNob3VsZCBkbyB0aGUgZm9sbG93aW5nOgo+ID4+Cj4gPj57Cj4gPj4g ICAgICAgIG11dGV4X2xvY2soJmhkbWktPmF1ZGlvX211dGV4KTsKPiA+Pgo+ID4+ICAgICAgICBp ZiAoaGRtaS0+YXVkaW9fZW5hYmxlKSB7Cj4gPj4gICAgICAgICAgICAgICBtdXRleF91bmxvY2so JmhkbWktPmF1ZGlvX211dGV4KTsKPiA+PiAgICAgICAgICAgICAgIHJldHVybjsKPiA+PiAgICAg ICAgfQo+ID4+ICAgICAgICBoZG1pLT5hdWRpb19lbmFibGUgPSB0cnVlOwo+ID4+ICAgICAgICBo ZG1pX21vZGIoaGRtaSwgMCwgSERNSV9NQ19DTEtESVNfQVVEQ0xLX0RJU0FCTEUsIEhETUlfTUNf Q0xLRElTKTsKPiA+Pgo+ID4+ICAgICAgICBtdXRleF91bmxvY2soJmhkbWktPmF1ZGlvX211dGV4 KTsKPiA+Pn0KPiA+WWVzLCBob3dldmVyLCBJIHByZWZlciB0aGlzIGtpbmQgb2YgbGF5b3V0Ogo+ ID4KPiA+CW11dGV4X2xvY2soJmhkbWktPmF1ZGlvX211dGV4KTsKPiA+CWlmICghaGRtaS0+YXVk aW9fZW5hYmxlKSB7Cj4gPgkJaGRtaS0+YXVkaW9fZW5hYmxlID0gdHJ1ZTsKPiA+CQloZG1pX21v ZGIoaGRtaSwgMCwgSERNSV9NQ19DTEtESVNfQVVEQ0xLX0RJU0FCTEUsCj4gPgkJCSAgSERNSV9N Q19DTEtESVMpOwo+ID4gIAl9Cj4gPgo+ID4JbXV0ZXhfdW5sb2NrKCZoZG1pLT5hdWRpb19tdXRl eCk7Cj4gPgo+ID5idXQgdGhhdCdzIGEgbWF0dGVyIG9mIHBlcnNvbmFsIG9waW5pb24uICBUaGUg aW1wb3J0YW50IHRoaW5nIGlzIHRoYXQgdGhlCj4gPnRlc3RpbmcgYW5kIHNldHRpbmcgb2YgdGhl IGZsYWcgYXJlIGJvdGggd2l0aGluIHRoZSBwcm90ZWN0ZWQgcmVnaW9uLgo+ID4KPiA+SG93ZXZl ciwgdGhlcmUgYXJlIG90aGVyIGJ1Z3MgaGVyZTogd2hhdCBpZiB0aGUgYXVkaW8gZHJpdmVyIGlz IGNhbGxpbmcKPiA+dGhlIHNhbXBsZSByYXRlIHNldHRpbmcgZnVuY3Rpb24gYXQgdGhlIHNhbWUg dGltZSB0aGF0IGEgbW9kZSBzd2l0Y2ggaXMKPiA+b2NjdXJpbmcuICBXZSBhY3R1YWxseSBuZWVk IGEgbXV0ZXggdG8gcHJvdGVjdCBtb3JlIHRoYW4ganVzdCB0aGUKPiA+YXVkaW9fZW5hYmxlIGZs YWcuCj4gCj4gT2theSwgZ290IGl0Lgo+IAo+IFRoYW5rcy4gIDogKQoKSSd2ZSBiZWVuIG1vdmlu ZyBteSBjb2RlIGNsb3NlciB0byB3aGF0IHlvdSBoYXZlIHBvc3RlZC4gIEkndmUgc3BsaXQgdXAK eW91ciBwYXRjaGVzIGludG8gc21hbGxlciBzdGVwcyBzbyBlYWNoIGNoYW5nZSBjYW4gYmUgZXZh bHVhdGVkIG9uIGlNWDYuClNvIGZhcjoKCmRybTogYnJpZGdlL2R3X2hkbWk6IGNvbWJpbmUgaGRt aV9zZXRfY2xvY2tfcmVnZW5lcmF0b3JfbigpIGFuZCBoZG1pX3JlZ2VuZXJhdGVfY3RzKCkKCiAg VGhpcyBwYXRjaCBfanVzdF8gY29tYmluZXMgdGhlIHR3byBmdW5jdGlvbnMgd2l0aG91dCBhbnkg b3RoZXIgY2hhbmdlcy4KCmRybTogYnJpZGdlL2R3X2hkbWk6IHByb3RlY3Qgbi9jdHMgc2V0dGlu ZyB3aXRoIGEgbXV0ZXgKCiAgVGhpcyBwYXRjaCBfanVzdF8gYWRkcyBhIG11dGV4IHRvIHByb3Rl Y3QgdGhlIGNhbGxzIHRvCiAgaGRtaV9zZXRfY2xrX3JlZ2VuZXJhdG9yKCksIHNpbmNlIHdlIHdp bGwgbmVlZCB0byBjYWxsIHRoYXQgZnJvbSBib3RoCiAgdGhlIERSTSBhbmQgYXVkaW8gZHJpdmVy cy4KCmRybTogYnJpZGdlL2R3X2hkbWk6IGFkanVzdCBuL2N0cyBzZXR0aW5nIG9yZGVyCgogIFRo aXMgcGF0Y2ggY2hhbmdlcyB0aGUgb3JkZXIgdG86CiAgLSB3cml0ZSBDVFMzIENUU19tYW51YWwg PSAwCiAgLSB3cml0ZSBDVFMzIE5fc2hpZnQgPSAwCiAgLSB3cml0ZSBDVFMzIENUUyB2YWx1ZQog IC0gd3JpdGUgQ1RTMiBDVFMgdmFsdWUKICAtIHdyaXRlIENUUzEgQ1RTIHZhbHVlCiAgLSB3cml0 ZSBOMyBOIHZhbHVlCiAgLSB3cml0ZSBOMiBOIHZhbHVlCiAgLSB3cml0ZSBOMSBOIHZhbHVlCiAg d2hpY2ggaXMgYnJvYWRseSB3aGF0IHlvdSdyZSBkb2luZywgYnV0IHdpdGhvdXQgdGhlIGluaXRp YWwgTjMgd3JpdGUKICBhbmQgd2l0aG91dCBDVFNfbWFudWFsPTEuICBJJ3ZlIGFza2VkIEZyZWVz Y2FsZSB3aGV0aGVyIHRoZXkgY2FuCiAgY2xhcmlmeSB3aGF0IGVmZmVjdCBhZGRpbmcgdGhvc2Ug d291bGQgaGF2ZSBvbiB0aGVpciBTb0NzLgoKTm90ZTogdGhlIG11dGV4IGluIG15IHNlY29uZCBw YXRjaCBuZWVkcyB0byBiZSBhIHNwaW5sb2NrIC0gYXMgaXQgc2VlbXMKbXkgbmV3IHdvcmthcm91 bmQgZm9yIGlNWDYgRVJSMDA1MTc0IG5lZWRzIHRvIGNhbGwgdGhlIENUUy9OIHNldHRpbmcKZnVu Y3Rpb25zIGluIGFuIGlycXMtb2ZmIHJlZ2lvbiAoZnJvbSB0aGUgQUxTQSAtPnRyaWdnZXIgY2Fs bGJhY2suKQpUaGF0IHdpbGwgbmVlZCBmdXJ0aGVyIHJld29yayBvZiB0aGUgQ1RTL04gY29kZSB0 byByZWR1Y2UgdGhlIHNpemUgb2YKdGhlIHNwaW5sb2NrIHByb3RlY3RlZCByZWdpb24uCgpJbmNp ZGVudGFsbHksIHlvdXIgU3lub3BzaXMgSVAgaW5kaWNhdGVzIHRoYXQgaXQgaXMgdGhlIHNhbWUg cmV2aXNpb24KYXMgdGhlIGlNWDYncyBJUCByZXZpc2lvbiB3aGljaCBzdWZmZXJzIGZyb20gdGhp cyBFUlIwMDUxNzQgZXJyYXRhLgpJIHRoaW5rIHlvdSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhp cyBlcnJhdGEgYXBwbGllcyBvbiB5b3VyIFNvQyB0b28uClNlYWNoIGZvciAiaU1YNiBFUlIwMDUx NzQiIGluIGdvb2dsZS4KCj4gPj5CeSB0aGUgd2F5LCBpdCBkb2Vzbid0IG1hdHRlciB0aGF0IHRo ZSBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhbm90aGVyIGRyaXZlci4KPiA+PldoYXQgbWF0dGVy cyBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBjb25jdXJyZW50bHkgb24KPiA+ Pm11bHRpcGxlIGRpZmZlcmVudCB0aHJlYWRzIG9mIGV4ZWN1dGlvbiB0byBjaGFuZ2UgdGhlIGhk bWkgYXVkaW8KPiA+PmVuYWJsZSBzdGF0ZS4KPiA+Pj5Gcm9tIERSTSBsYW5kLCBpdCBpcyBjYWxs ZWQgd2l0aCBEUk0gbG9jayBoZWxkIHdoZW4gZW5hYmxpbmcvZGlzYWJsaW5nCj4gPj5oZG1pIGF1 ZGlvIChtb2RlX3NldCAvIERQTVMpLgo+ID4+SXQgaXMgYWxzbyBjYWxsZWQgZnJvbSBhdWRpbyBs YW5kLCB3aGVuIGVuYWJsaW5nL2Rpc2FibGluZyBhdWRpbyBpbgo+ID4+cmVzcG9uc2UgdG8gc29t ZSBhdWRpbyBldmVudHMgKHVzZXJzcGFjZSBpb2N0bHM/KS4gIEknbSBub3Qgc3VyZQo+ID4+ZXhh Y3RseSBob3cgdGhlIGF1ZGlvIHNpZGUgd29ya3MsIG9yIHdoYXQgbG9ja3MgYXJlIGludm9sdmVk LCBidXQgdGhpcwo+ID4+bXV0ZXggc3luY2hyb25pemVzIGNhbGxzIGZyb20gdGhlc2UgdHdvIHdv cmxkcyB0byBlbnN1cmUgdGhhdAo+ID4+ImhkbWktPmF1ZGlvX2VuYWJsZSIgZmllbGQgYWx3YXlz IG1hdGNoZXMgdGhlIGN1cnJlbnQgKGludGVuZGVkKQo+ID4+c3RhdHVzIG9mIHRoZSBoZG1pIGF1 ZGlvIGNsb2NrLiAgVGhpcyB3b3VsZCBiZSB1c2VmdWwsIGZvciBleGFtcGxlLCBpZgo+ID4+eW91 IG5lZWRlZCB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIGFsbCBIRE1JIGNsb2NrcyBkdXJpbmcgYSBt b2RlIHNldCwKPiA+PmFuZCB0aGVuIHJlc3RvcmUgdGhlIGF1ZGlvIGNsb2NrIHRvIGl0cyBwcmUt bW9kZV9zZXQgc3RhdGU6Cj4gPlRoZXJlJ3Mgc29tZSByYXRoZXIgcXVpcmt5IGNvbW1lbnRzIGlu IHRoZSBkcml2ZXIgcmlnaHQgbm93IHdoaWNoIG1ha2UKPiA+bWUgdW5lYXN5IGFib3V0IGNoYW5n aW5nIHRoaW5ncyB0b28gbXVjaC4KPiA+Cj4gPk15IGluaXRpYWwgaWRlYSB3b3VsZCBiZSB0aGF0 IGF1ZGlvIHNob3VsZCByZW1haW4gZGlzYWJsZWQgdW50aWwgdGhlCj4gPmF1ZGlvIGRyaXZlciB3 YW50cyBpdCBlbmFibGVkLCBhbmQgdGhlIENUUy9OIHZhbHVlcyBzaG91bGQgZWl0aGVyIGJlCj4g PmxlZnQgYWxvbmUsIG9yIHNldCB0byBhIHZhbHVlIHdoaWNoIGRpc2FibGVzIHRoZW0gKHRoZXJl IGlzIGFuIGlNWDYKPiA+ZXJyYXRhIHdoaWNoIHNheXMgdG8gc2V0IE49MCBpbml0aWFsbHksIGJ1 dCBhcyBzZWVtcyBjb21tb24gd2l0aCBpTVg2Cj4gPmVycmF0YSwgSSBzZWUgbm8gY29kZSBpbXBs ZW1lbnRpbmcgdGhlIG1ldGhvZCBzcGVjaWZpZWQgaW4gdGhlCj4gPmRvY3VtZW50YXRpb24gLSBJ IGhhdmUgZm91bmQgY29kZSBpbXBsZW1lbnRpbmcgc29tZXRoaW5nIHNpbWlsYXIKPiA+dGhvdWdo LikKPiAKPiBJIGFtIGNvbmZ1c2VkIHdpdGggdGhlIHdheSB0aGF0IGF1ZGlvIGRyaXZlciByZWFs aXplIHRoZSBkaXNwbGF5Cj4gcmVzb2x1dGlvbi1jaGFuZ2luZy4KPiBJZiBhdWRpbyBkcml2ZXIg Y2Fubm90IGtub3dpbmcgdGhhdCwgdGhlbiBhdWRpbyBjbG9jayBtYXkgYmUgY2xvc2VkCj4gcGVy bWFuZW50bHkgPwoKVGhlIGF1ZGlvIGRyaXZlciBzaG91bGRuJ3QgY2FyZSBhYm91dCB0aGUgZGlz cGxheSByZXNvbHV0aW9uLiAgVGhhdApzaG91bGQgYmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRo ZSBkd19oZG1pIGNvcmUgLSBhcyBpdCBpcyBhdCB0aGUKbW9tZW50LgoKPiBzdGF0aWMgdm9pZCBo ZG1pX2tlZXBfYXVkaW9fY2xrX3N0YXR1cyhzdHJ1Y3QgZHdfaGRtaSAqaGRtaSkKPiB7Cj4gICAg IG11dGV4X2xvY2soJmhkbWktPmF1ZGlvX211dGV4KTsKPiAKPiAgICAgaWYgKGhkbWktPmF1ZGlv X2VuYWJsZSkKPiAgICAgICAgIGhkbWlfbW9kYihoZG1pLCAwLCBIRE1JX01DX0NMS0RJU19BVURD TEtfRElTQUJMRSwKPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSERNSV9NQ19DTEtESVMp Owo+ICAgICBlbHNlCj4gICAgICAgICBoZG1pX21vZGIoaGRtaSwgSERNSV9NQ19DTEtESVNfQVVE Q0xLX0RJU0FCTEUsCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhETUlfTUNfQ0xLRElT X0FVRENMS19ESVNBQkxFLCBIRE1JX01DX0NMS0RJUyk7Cj4gCj4gICAgIG11dGV4X3VubG9jaygm aGRtaS0+YXVkaW9fbXV0ZXgpOwo+IH0KPiAKPiAgICAgIC8qIEhETUkgSW5pdGlhbGl6YXRpb24g U3RlcCBFIC0gQ29uZmlndXJlIGF1ZGlvICovCj4gICAgIGhkbWlfY2xrX3JlZ2VuZXJhdG9yX3Vw ZGF0ZV9waXhlbF9jbG9jayhoZG1pKTsKPiAgICAgaGRtaV9rZWVwX2F1ZGlvX2Nsa19zdGF0dXMo aGRtaSk7Cj4gCj4ga2VlcCBhdWRpbyBzdGF0dXMgbWF5YmUgc3VpdGFibGUgaGVyZS4KCldoYXQg SSBkb24ndCBrbm93IHJpZ2h0IG5vdyBpcyB3aGF0IHRyaWdnZXJzIHRoaXMgb3ZlcmZsb3cgaW5k aWNhdGlvbiBpbgpIRE1JX0lIX0ZDX1NUQVQyLCBhbmQgd2hldGhlciB0aGUgY29kZSBJIHF1b3Rl ZCAod2hpY2ggZmFrZXMgdGhlIGF1ZGlvCnNldHVwKSBpcyBhY3R1YWxseSBuZWNlc3NhcnkuCgpJ biBvdGhlciB3b3JkczoKLSBpcyBpdCBuZWNlc3NhcnkgdG8gaGF2ZSB0aGUgYXVkaW8gY2xvY2sg ZW5hYmxlZCB3aGVuIHZpZGVvIGlzIGVuYWJsZWQKICB0byBwcmV2ZW50IHRoZSBvdmVyZmxvdyBp bmRpY2F0aW9uPyAgV2UgZG9uJ3Qga25vdy4gIFRoZXJlZm9yZSwgd2UKICBjYW4ndCBzYXkgd2hl dGhlciBpdCBpcyBwZXJtaXR0ZWQgdG8gZGlzYWJsZSB0aGUgYXVkaW8gY2xvY2sgd2hlbgogIGF1 ZGlvIGlzIGluYWN0aXZlLgotIGlzIGl0IG5lY2Vzc2FyeSB0byBwcm9ncmFtIGEgZHVtbXkgQ1RT L04gdmFsdWUgZm9yIDc0LjI1TUh6LzQ4a0h6LAogIG9yIGNhbiB3ZSBwcm9ncmFtIGEgbm9uLXpl cm8gQ1RTIHZhbHVlIGFuZCBhIHplcm8gTiBhdCBpbml0aWFsaXNhdGlvbgogIHVudGlsIHRoZSBh dWRpbyBkcml2ZXIgY29tZXMgdXA/ICBBZ2Fpbiwgd2UgZG9uJ3Qga25vdy4KCldoYXQgd2UgZG8g a25vdyBpcyB0aGF0IGFzIHRoZSBkcml2ZXIgc3RhbmRzLCBpdCB3b3JrcyBmb3IgdmlkZW8gb3V0 cHV0LgpXaXRoIG15IGNoYW5nZXMgZm9yIEFIQiBhdWRpbyBzdXBwb3J0IG9uIHRoZSBpTVg2ICh3 aGljaCBpbmNsdWRlcyBzb21lCmVycmF0YSB3b3JrYXJvdW5kcyBmb3VuZCBpbiB0aGUgaU1YNiBl cnJhdGEgZG9jdW1lbnRhdGlvbiB0byBhdm9pZCBGSUZPCmlzc3VlcyksIHdlIGhhdmUgd29ya2lu ZyBhdWRpbyB0aGVyZS4KCi0tIApGVFRDIGJyb2FkYmFuZCBmb3IgMC44bWlsZSBsaW5lOiBjdXJy ZW50bHkgYXQgMTAuNU1icHMgZG93biA0MDBrYnBzIHVwCmFjY29yZGluZyB0byBzcGVlZHRlc3Qu bmV0LgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmkt ZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDov L2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=