From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.8 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_PASS, USER_AGENT_NEOMUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 80C9FC43381 for ; Fri, 22 Feb 2019 16:27:51 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3802F2075C for ; Fri, 22 Feb 2019 16:27:51 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=armlinux.org.uk header.i=@armlinux.org.uk header.b="Wy9T2SEY" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727347AbfBVQ1u (ORCPT ); Fri, 22 Feb 2019 11:27:50 -0500 Received: from pandora.armlinux.org.uk ([78.32.30.218]:38832 "EHLO pandora.armlinux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727274AbfBVQ1s (ORCPT ); Fri, 22 Feb 2019 11:27:48 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=armlinux.org.uk; s=pandora-2019; h=Sender:In-Reply-To:Content-Type: MIME-Version:References:Message-ID:Subject:Cc:To:From:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=sUi10VCgZ3lSLRMixykJ3Gxk9j0n6HpSSrL3SDR5Sgg=; b=Wy9T2SEYUzjwshXAFekYoyq7/ 20rnSgd8Ov8AUbAGySL0fh/beeXMYix41EP1EOH6je5aW+SUKrRqeRFZJycG1atVvL0q1pQNXdSg5 XvVFlKb/MfmLn9lHfPD9OXpQ4ughUOp4Y++cqt6pm8/xtrP+fqSZR6Zcrk8lcAOAmcABrTNZaYeLb 9DEB+4zuOgxf4YkGKhtcBznLsqIJzEWLJYRUDLynwkE3ANzoatp2vtJyICsjUM4n8S6qwrza/0gn3 KsGYo6CTuzk9/eBr1GTR8S5ZS3LP2hqxiiA30h0X/sS/PGXXbW9KWYb1wotfUiOMn3gFVIwc5zN38 m0F+2UQuw==; Received: from shell.armlinux.org.uk ([2002:4e20:1eda:1:5054:ff:fe00:4ec]:37006) by pandora.armlinux.org.uk with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.90_1) (envelope-from ) id 1gxDfo-00031N-ET; Fri, 22 Feb 2019 16:27:40 +0000 Received: from linux by shell.armlinux.org.uk with local (Exim 4.89) (envelope-from ) id 1gxDfk-0002L1-00; Fri, 22 Feb 2019 16:27:36 +0000 Date: Fri, 22 Feb 2019 16:27:35 +0000 From: Russell King - ARM Linux admin To: Sven Van Asbroeck , Mark Brown Cc: David Airlie , Daniel Vetter , dri-devel@lists.freedesktop.org, Linux Kernel Mailing List , Peter Rosin Subject: Re: [PATCH 1/2] drm/i2c: tda998x: adjust CTS_N audio pre-divider calculation Message-ID: <20190222162735.t2t57wvawpseax3k@shell.armlinux.org.uk> References: <20190221181814.24829-1-TheSven73@gmail.com> <20190222132051.voznrjt3sctdkpkf@shell.armlinux.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20170113 (1.7.2) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org (Adding Mark, ASoC maintainer.) On Fri, Feb 22, 2019 at 10:47:35AM -0500, Sven Van Asbroeck wrote: > On Fri, Feb 22, 2019 at 8:21 AM Russell King - ARM Linux admin > wrote: > > > > On Thu, Feb 21, 2019 at 01:18:13PM -0500, Sven Van Asbroeck wrote: > > > > > [SNDRV_PCM_FORMAT_S24_LE] = { > > > .width = 24, .phys = 32, .le = 1, .signd = 1, > > > .silence = {}, > > > }, > > > > The above table describes the memory format, not the wire format. > > Look further down for SNDRV_PCM_FORMAT_S24_3LE, which is 24-bit > > packed into three bytes (see include/uapi/sound/asound.h for > > the comment specifying that.) > > > > ASoC uses DAIFMT to specify the on-wire format in connection with > > the above. > > > > Interesting ! So you're saying that currently, nobody strictly defines the > layout of the on-wire format, correct? I'm not sure how this works in practice, > because codec and cpu dai should agree on the on-wire format? Except if the > formats used have enough flexibility so you don't have to care. SNDRV_PCM_FORMAT_xxx more defines the in-memory format, rather than the on-wire format. As I've said, the on-wire format is defined in ASoC using a completely different mechanism, using the definitions in include/sound/soc-dai.h. This describes parameters such as the polarity of clocks on the i2s bus, the justification of the data, etc. Bear in mind that SNDRV_PCM_FORMAT_S24_LE in memory may be right justified (using the least significant 3 bytes of every 32-bit word), but on the wire may be left justified - using the most significant bits. SND_SOC_DAIFMT_I2S defines the format to be "Philips" format, where the MSB bit is sent one BCLK _after_ the LRCLK signal changes state. There is also SND_SOC_DAIFMT_LEFT_J, where the MSB bit is sent with no delay, and extra padding zeros are sent in the "LSB" bits. SND_SOC_DAIFMT_RIGHT_J is similar, but the padding is in the "MSB" bits. Then there's the polarity of the BCLK and LRCLK (frame) signals. Finally, there's whether the codec (TDA998x in this case) is the origin of the LRCLK and/or BCLK. This information is passed via a call to snd_soc_dai_set_fmt() which takes the DAI and the format - this calls into hdmi-codec.c hdmi_codec_set_fmt(). This will be handled by the core ASoC code if the DAI has a .dai_fmt member set (which can be set by DT - see snd_soc_of_parse_daifmt().) Then there is snd_soc_dai_set_bclk_ratio() which sets the BCLK to sample-rate ratio, as I explained earlier. hdmi-codec doesn't have an implementation for this, and afaics no one calls this function. So, it seems assumptions are made throughout ASoC on that point (probably because most codecs don't care.) > > This doesn't really help in terms of working out what the correct > > settings should be, and other information I have laying around does not > > provide any further enlightenment. > > I have access to the NXP software library shipped with the tda19988. Yes, I'm aware of it. > The library's release notes have the following entry: > > . "I2S audio does not work, CTS value is not good" > Check the audio I2S format > CTS is automatically computed by the TDA accordingly to the audio input > so accordingly to the upstream settings (like an OMAP ;) > For example, I2S 16 bits or 32 bits do not produce the same CTS value > > The config structure which you need to fill in to init the audio has a > "i2s qualifier" field, where you have the choice between 16 and 32 bits. > This then maps to a "Clock Time Stamp factor x" called CTSX, which maps to > the following CTS_N register settings: > > CTSX -> CTS_N (m,k) > ----------------------------------- > 16 -> (3,0) > 32 -> (3,1) (i2s qualifier = 16 bits) > 48 -> (3,2) > 64 -> (3,3) (i2s qualifier = 32 bits) > 128 -> (0,0) > > Does this information bring us any closer to our assumption that CTS_N needs > to be calculated off the bclk to sample rate ratio ? I'm aware of other users of TDA998x, and I'm attempting to get out of them what ratios their implementations use - they've said that they have confirmed that 16bit and 24bit works for them, but that's rather incomplete in terms of what I wanted to know... waiting for another response! > I'd love to take a shot at this, but first I'd like to understand what you're > suggesting :) > > Currently there is set_bclk_ratio() support, but no-one is actually using it. > If hdmi-codec is to retrieve the ratio, wouldn't we need to add .GET_blk_ratio > to snd_soc_dai_ops ? > > I could add this to fsl_ssi in master mode, but what if somebody connects the > tda to a cpu dai for which no-one implemented .GET_bclk_ratio ? Do we guess? > Or just error out? > > Also, what would a proposed snd_soc_dai_GET_bclk_ratio() return e.g. on > fsl_ssi in slave mode, where the value arguably doesn't exist because the ssi > will accept pretty much anything you throw at it? You appear to be thinking that the codec should ask something else for the bclk ratio - however ASoC is designed from the point of view of the codecs being told the appropriate operating parameters by the "card" or core at the appropriate time(s). Hence, something needs to call snd_soc_dai_set_bclk_ratio(). hdmi-codec then needs to supply an implementation for the set_bclk_ratio() method in struct snd_soc_dai_ops, just like it already does for the set_fmt method, and pass the bclk ratio to the actual HDMI codec. Something like the below would probably be moving in the right direction: diff --git a/include/sound/hdmi-codec.h b/include/sound/hdmi-codec.h index 9483c55f871b..0fca69880dc3 100644 --- a/include/sound/hdmi-codec.h +++ b/include/sound/hdmi-codec.h @@ -42,6 +42,7 @@ struct hdmi_codec_daifmt { unsigned int frame_clk_inv:1; unsigned int bit_clk_master:1; unsigned int frame_clk_master:1; + unsigned int bclk_ratio; }; /* diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c index d00734d31e04..f0f08b7a073f 100644 --- a/sound/soc/codecs/hdmi-codec.c +++ b/sound/soc/codecs/hdmi-codec.c @@ -524,6 +524,17 @@ static int hdmi_codec_hw_params(struct snd_pcm_substream *substream, &hcp->daifmt[dai->id], &hp); } +static int hdmi_codec_set_bclk_ratio(struct snd_soc_dai *dai, + unsigned int ratio) +{ + struct hdmi_codec_priv *hcp = snd_soc_dai_get_drvdata(dai); + + /* FIXME: some validation here would be good? */ + hcp->daifmt[dai->id].bclk_ratio = ratio; + + return 0; +} + static int hdmi_codec_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { @@ -593,7 +604,11 @@ static int hdmi_codec_set_fmt(struct snd_soc_dai *dai, } } - hcp->daifmt[dai->id] = cf; + hcp->daifmt[dai->id].fmt = cf.fmt; + hcp->daifmt[dai->id].bit_clk_inv = cf.bit_clk_inv; + hcp->daifmt[dai->id].frame_clk_inv = cf.frame_clk_inv; + hcp->daifmt[dai->id].bit_clk_master = cf.bit_clk_master; + hcp->daifmt[dai->id].frame_clk_master = cf.frame_clk_master; return ret; } @@ -615,6 +630,7 @@ static const struct snd_soc_dai_ops hdmi_dai_ops = { .startup = hdmi_codec_startup, .shutdown = hdmi_codec_shutdown, .hw_params = hdmi_codec_hw_params, + .set_bclk_ratio = hdmi_codec_set_bclk_ratio, .set_fmt = hdmi_codec_set_fmt, .digital_mute = hdmi_codec_digital_mute, }; @@ -795,6 +811,8 @@ static int hdmi_codec_probe(struct platform_device *pdev) if (hcd->spdif) hcp->daidrv[i] = hdmi_spdif_dai; + hcp->daifmt[DAI_ID_I2S].bclk_ratio = 64; + ret = devm_snd_soc_register_component(dev, &hdmi_driver, hcp->daidrv, dai_count); if (ret) { Then tda998x can look at daifmt->bclk_ratio in tda998x_audio_hw_params(). -- RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTC broadband for 0.8mile line in suburbia: sync at 12.1Mbps down 622kbps up According to speedtest.net: 11.9Mbps down 500kbps up From mboxrd@z Thu Jan 1 00:00:00 1970 From: Russell King - ARM Linux admin Subject: Re: [PATCH 1/2] drm/i2c: tda998x: adjust CTS_N audio pre-divider calculation Date: Fri, 22 Feb 2019 16:27:35 +0000 Message-ID: <20190222162735.t2t57wvawpseax3k@shell.armlinux.org.uk> References: <20190221181814.24829-1-TheSven73@gmail.com> <20190222132051.voznrjt3sctdkpkf@shell.armlinux.org.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from pandora.armlinux.org.uk (pandora.armlinux.org.uk [IPv6:2001:4d48:ad52:3201:214:fdff:fe10:1be6]) by gabe.freedesktop.org (Postfix) with ESMTPS id C7F9189654 for ; Fri, 22 Feb 2019 16:27:47 +0000 (UTC) Content-Disposition: inline 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: Sven Van Asbroeck , Mark Brown Cc: David Airlie , Peter Rosin , dri-devel@lists.freedesktop.org, Linux Kernel Mailing List List-Id: dri-devel@lists.freedesktop.org KEFkZGluZyBNYXJrLCBBU29DIG1haW50YWluZXIuKQoKT24gRnJpLCBGZWIgMjIsIDIwMTkgYXQg MTA6NDc6MzVBTSAtMDUwMCwgU3ZlbiBWYW4gQXNicm9lY2sgd3JvdGU6Cj4gT24gRnJpLCBGZWIg MjIsIDIwMTkgYXQgODoyMSBBTSBSdXNzZWxsIEtpbmcgLSBBUk0gTGludXggYWRtaW4KPiA8bGlu dXhAYXJtbGludXgub3JnLnVrPiB3cm90ZToKPiA+Cj4gPiBPbiBUaHUsIEZlYiAyMSwgMjAxOSBh dCAwMToxODoxM1BNIC0wNTAwLCBTdmVuIFZhbiBBc2Jyb2VjayB3cm90ZToKPiA+Cj4gPiA+ICAg ICAgIFtTTkRSVl9QQ01fRk9STUFUX1MyNF9MRV0gPSB7Cj4gPiA+ICAgICAgICAgICAgICAgLndp ZHRoID0gMjQsIC5waHlzID0gMzIsIC5sZSA9IDEsIC5zaWduZCA9IDEsCj4gPiA+ICAgICAgICAg ICAgICAgLnNpbGVuY2UgPSB7fSwKPiA+ID4gICAgICAgfSwKPiA+Cj4gPiBUaGUgYWJvdmUgdGFi bGUgZGVzY3JpYmVzIHRoZSBtZW1vcnkgZm9ybWF0LCBub3QgdGhlIHdpcmUgZm9ybWF0Lgo+ID4g TG9vayBmdXJ0aGVyIGRvd24gZm9yIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRSwgd2hpY2ggaXMg MjQtYml0Cj4gPiBwYWNrZWQgaW50byB0aHJlZSBieXRlcyAoc2VlIGluY2x1ZGUvdWFwaS9zb3Vu ZC9hc291bmQuaCBmb3IKPiA+IHRoZSBjb21tZW50IHNwZWNpZnlpbmcgdGhhdC4pCj4gPgo+ID4g QVNvQyB1c2VzIERBSUZNVCB0byBzcGVjaWZ5IHRoZSBvbi13aXJlIGZvcm1hdCBpbiBjb25uZWN0 aW9uIHdpdGgKPiA+IHRoZSBhYm92ZS4KPiA+Cj4gCj4gSW50ZXJlc3RpbmcgISBTbyB5b3UncmUg c2F5aW5nIHRoYXQgY3VycmVudGx5LCBub2JvZHkgc3RyaWN0bHkgZGVmaW5lcyB0aGUKPiBsYXlv dXQgb2YgdGhlIG9uLXdpcmUgZm9ybWF0LCBjb3JyZWN0PyBJJ20gbm90IHN1cmUgaG93IHRoaXMg d29ya3MgaW4gcHJhY3RpY2UsCj4gYmVjYXVzZSBjb2RlYyBhbmQgY3B1IGRhaSBzaG91bGQgYWdy ZWUgb24gdGhlIG9uLXdpcmUgZm9ybWF0PyBFeGNlcHQgaWYgdGhlCj4gZm9ybWF0cyB1c2VkIGhh dmUgZW5vdWdoIGZsZXhpYmlsaXR5IHNvIHlvdSBkb24ndCBoYXZlIHRvIGNhcmUuCgpTTkRSVl9Q Q01fRk9STUFUX3h4eCBtb3JlIGRlZmluZXMgdGhlIGluLW1lbW9yeSBmb3JtYXQsIHJhdGhlciB0 aGFuCnRoZSBvbi13aXJlIGZvcm1hdC4KCkFzIEkndmUgc2FpZCwgdGhlIG9uLXdpcmUgZm9ybWF0 IGlzIGRlZmluZWQgaW4gQVNvQyB1c2luZyBhIGNvbXBsZXRlbHkKZGlmZmVyZW50IG1lY2hhbmlz bSwgdXNpbmcgdGhlIGRlZmluaXRpb25zIGluIGluY2x1ZGUvc291bmQvc29jLWRhaS5oLgpUaGlz IGRlc2NyaWJlcyBwYXJhbWV0ZXJzIHN1Y2ggYXMgdGhlIHBvbGFyaXR5IG9mIGNsb2NrcyBvbiB0 aGUgaTJzCmJ1cywgdGhlIGp1c3RpZmljYXRpb24gb2YgdGhlIGRhdGEsIGV0Yy4KCkJlYXIgaW4g bWluZCB0aGF0IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFIGluIG1lbW9yeSBtYXkgYmUgcmlnaHQK anVzdGlmaWVkICh1c2luZyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgMyBieXRlcyBvZiBldmVyeSAz Mi1iaXQgd29yZCksCmJ1dCBvbiB0aGUgd2lyZSBtYXkgYmUgbGVmdCBqdXN0aWZpZWQgLSB1c2lu ZyB0aGUgbW9zdCBzaWduaWZpY2FudApiaXRzLgoKU05EX1NPQ19EQUlGTVRfSTJTIGRlZmluZXMg dGhlIGZvcm1hdCB0byBiZSAiUGhpbGlwcyIgZm9ybWF0LCB3aGVyZQp0aGUgTVNCIGJpdCBpcyBz ZW50IG9uZSBCQ0xLIF9hZnRlcl8gdGhlIExSQ0xLIHNpZ25hbCBjaGFuZ2VzIHN0YXRlLgpUaGVy ZSBpcyBhbHNvIFNORF9TT0NfREFJRk1UX0xFRlRfSiwgd2hlcmUgdGhlIE1TQiBiaXQgaXMgc2Vu dCB3aXRoCm5vIGRlbGF5LCBhbmQgZXh0cmEgcGFkZGluZyB6ZXJvcyBhcmUgc2VudCBpbiB0aGUg IkxTQiIgYml0cy4KU05EX1NPQ19EQUlGTVRfUklHSFRfSiBpcyBzaW1pbGFyLCBidXQgdGhlIHBh ZGRpbmcgaXMgaW4gdGhlICJNU0IiCmJpdHMuCgpUaGVuIHRoZXJlJ3MgdGhlIHBvbGFyaXR5IG9m IHRoZSBCQ0xLIGFuZCBMUkNMSyAoZnJhbWUpIHNpZ25hbHMuCkZpbmFsbHksIHRoZXJlJ3Mgd2hl dGhlciB0aGUgY29kZWMgKFREQTk5OHggaW4gdGhpcyBjYXNlKSBpcyB0aGUKb3JpZ2luIG9mIHRo ZSBMUkNMSyBhbmQvb3IgQkNMSy4KClRoaXMgaW5mb3JtYXRpb24gaXMgcGFzc2VkIHZpYSBhIGNh bGwgdG8gc25kX3NvY19kYWlfc2V0X2ZtdCgpCndoaWNoIHRha2VzIHRoZSBEQUkgYW5kIHRoZSBm b3JtYXQgLSB0aGlzIGNhbGxzIGludG8gaGRtaS1jb2RlYy5jCmhkbWlfY29kZWNfc2V0X2ZtdCgp LiAgVGhpcyB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIGNvcmUgQVNvQyBjb2RlCmlmIHRoZSBEQUkg aGFzIGEgLmRhaV9mbXQgbWVtYmVyIHNldCAod2hpY2ggY2FuIGJlIHNldCBieSBEVCAtCnNlZSBz bmRfc29jX29mX3BhcnNlX2RhaWZtdCgpLikKClRoZW4gdGhlcmUgaXMgc25kX3NvY19kYWlfc2V0 X2JjbGtfcmF0aW8oKSB3aGljaCBzZXRzIHRoZSBCQ0xLCnRvIHNhbXBsZS1yYXRlIHJhdGlvLCBh cyBJIGV4cGxhaW5lZCBlYXJsaWVyLiAgaGRtaS1jb2RlYyBkb2Vzbid0CmhhdmUgYW4gaW1wbGVt ZW50YXRpb24gZm9yIHRoaXMsIGFuZCBhZmFpY3Mgbm8gb25lIGNhbGxzIHRoaXMKZnVuY3Rpb24u ICBTbywgaXQgc2VlbXMgYXNzdW1wdGlvbnMgYXJlIG1hZGUgdGhyb3VnaG91dCBBU29DCm9uIHRo YXQgcG9pbnQgKHByb2JhYmx5IGJlY2F1c2UgbW9zdCBjb2RlY3MgZG9uJ3QgY2FyZS4pCgo+ID4g VGhpcyBkb2Vzbid0IHJlYWxseSBoZWxwIGluIHRlcm1zIG9mIHdvcmtpbmcgb3V0IHdoYXQgdGhl IGNvcnJlY3QKPiA+IHNldHRpbmdzIHNob3VsZCBiZSwgYW5kIG90aGVyIGluZm9ybWF0aW9uIEkg aGF2ZSBsYXlpbmcgYXJvdW5kIGRvZXMgbm90Cj4gPiBwcm92aWRlIGFueSBmdXJ0aGVyIGVubGln aHRlbm1lbnQuCj4gCj4gSSBoYXZlIGFjY2VzcyB0byB0aGUgTlhQIHNvZnR3YXJlIGxpYnJhcnkg c2hpcHBlZCB3aXRoIHRoZSB0ZGExOTk4OC4KClllcywgSSdtIGF3YXJlIG9mIGl0LgoKPiBUaGUg bGlicmFyeSdzIHJlbGVhc2Ugbm90ZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGVudHJ5Ogo+IAo+ICAg LiAiSTJTIGF1ZGlvIGRvZXMgbm90IHdvcmssIENUUyB2YWx1ZSBpcyBub3QgZ29vZCIKPiAgICAg Q2hlY2sgdGhlIGF1ZGlvIEkyUyBmb3JtYXQgPHNuaXA+Cj4gICAgIENUUyBpcyBhdXRvbWF0aWNh bGx5IGNvbXB1dGVkIGJ5IHRoZSBUREEgYWNjb3JkaW5nbHkgdG8gdGhlIGF1ZGlvIGlucHV0Cj4g ICAgIHNvIGFjY29yZGluZ2x5IHRvIHRoZSB1cHN0cmVhbSBzZXR0aW5ncyAobGlrZSBhbiBPTUFQ IDspCj4gICAgIEZvciBleGFtcGxlLCBJMlMgMTYgYml0cyBvciAzMiBiaXRzIGRvIG5vdCBwcm9k dWNlIHRoZSBzYW1lIENUUyB2YWx1ZQo+IAo+IFRoZSBjb25maWcgc3RydWN0dXJlIHdoaWNoIHlv dSBuZWVkIHRvIGZpbGwgaW4gdG8gaW5pdCB0aGUgYXVkaW8gaGFzIGEKPiAiaTJzIHF1YWxpZmll ciIgZmllbGQsIHdoZXJlIHlvdSBoYXZlIHRoZSBjaG9pY2UgYmV0d2VlbiAxNiBhbmQgMzIgYml0 cy4KPiBUaGlzIHRoZW4gbWFwcyB0byBhICJDbG9jayBUaW1lIFN0YW1wIGZhY3RvciB4IiBjYWxs ZWQgQ1RTWCwgd2hpY2ggbWFwcyB0bwo+IHRoZSBmb2xsb3dpbmcgQ1RTX04gcmVnaXN0ZXIgc2V0 dGluZ3M6Cj4gCj4gQ1RTWCAtPiBDVFNfTiAobSxrKQo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCj4gMTYgLT4gKDMsMCkKPiAzMiAtPiAoMywxKSAoaTJzIHF1YWxpZmllciA9 IDE2IGJpdHMpCj4gNDggLT4gKDMsMikKPiA2NCAtPiAoMywzKSAoaTJzIHF1YWxpZmllciA9IDMy IGJpdHMpCj4gMTI4IC0+ICgwLDApCj4gCj4gRG9lcyB0aGlzIGluZm9ybWF0aW9uIGJyaW5nIHVz IGFueSBjbG9zZXIgdG8gb3VyIGFzc3VtcHRpb24gdGhhdCBDVFNfTiBuZWVkcwo+IHRvIGJlIGNh bGN1bGF0ZWQgb2ZmIHRoZSBiY2xrIHRvIHNhbXBsZSByYXRlIHJhdGlvID8KCkknbSBhd2FyZSBv ZiBvdGhlciB1c2VycyBvZiBUREE5OTh4LCBhbmQgSSdtIGF0dGVtcHRpbmcgdG8gZ2V0IG91dCBv Zgp0aGVtIHdoYXQgcmF0aW9zIHRoZWlyIGltcGxlbWVudGF0aW9ucyB1c2UgLSB0aGV5J3ZlIHNh aWQgdGhhdCB0aGV5CmhhdmUgY29uZmlybWVkIHRoYXQgMTZiaXQgYW5kIDI0Yml0IHdvcmtzIGZv ciB0aGVtLCBidXQgdGhhdCdzIHJhdGhlcgppbmNvbXBsZXRlIGluIHRlcm1zIG9mIHdoYXQgSSB3 YW50ZWQgdG8ga25vdy4uLiB3YWl0aW5nIGZvciBhbm90aGVyCnJlc3BvbnNlIQogCj4gSSdkIGxv dmUgdG8gdGFrZSBhIHNob3QgYXQgdGhpcywgYnV0IGZpcnN0IEknZCBsaWtlIHRvIHVuZGVyc3Rh bmQgd2hhdCB5b3UncmUKPiBzdWdnZXN0aW5nIDopCj4gCj4gQ3VycmVudGx5IHRoZXJlIGlzIHNl dF9iY2xrX3JhdGlvKCkgc3VwcG9ydCwgYnV0IG5vLW9uZSBpcyBhY3R1YWxseSB1c2luZyBpdC4K PiBJZiBoZG1pLWNvZGVjIGlzIHRvIHJldHJpZXZlIHRoZSByYXRpbywgd291bGRuJ3Qgd2UgbmVl ZCB0byBhZGQgLkdFVF9ibGtfcmF0aW8KPiB0byBzbmRfc29jX2RhaV9vcHMgPwo+IAo+IEkgY291 bGQgYWRkIHRoaXMgdG8gZnNsX3NzaSBpbiBtYXN0ZXIgbW9kZSwgYnV0IHdoYXQgaWYgc29tZWJv ZHkgY29ubmVjdHMgdGhlCj4gdGRhIHRvIGEgY3B1IGRhaSBmb3Igd2hpY2ggbm8tb25lIGltcGxl bWVudGVkIC5HRVRfYmNsa19yYXRpbyA/IERvIHdlIGd1ZXNzPwo+IE9yIGp1c3QgZXJyb3Igb3V0 Pwo+IAo+IEFsc28sIHdoYXQgd291bGQgYSBwcm9wb3NlZCBzbmRfc29jX2RhaV9HRVRfYmNsa19y YXRpbygpIHJldHVybiBlLmcuIG9uCj4gZnNsX3NzaSBpbiBzbGF2ZSBtb2RlLCB3aGVyZSB0aGUg dmFsdWUgYXJndWFibHkgZG9lc24ndCBleGlzdCBiZWNhdXNlIHRoZSBzc2kKPiB3aWxsIGFjY2Vw dCBwcmV0dHkgbXVjaCBhbnl0aGluZyB5b3UgdGhyb3cgYXQgaXQ/CgpZb3UgYXBwZWFyIHRvIGJl IHRoaW5raW5nIHRoYXQgdGhlIGNvZGVjIHNob3VsZCBhc2sgc29tZXRoaW5nIGVsc2UgZm9yCnRo ZSBiY2xrIHJhdGlvIC0gaG93ZXZlciBBU29DIGlzIGRlc2lnbmVkIGZyb20gdGhlIHBvaW50IG9m IHZpZXcgb2YKdGhlIGNvZGVjcyBiZWluZyB0b2xkIHRoZSBhcHByb3ByaWF0ZSBvcGVyYXRpbmcg cGFyYW1ldGVycyBieSB0aGUKImNhcmQiIG9yIGNvcmUgYXQgdGhlIGFwcHJvcHJpYXRlIHRpbWUo cykuICBIZW5jZSwgc29tZXRoaW5nIG5lZWRzCnRvIGNhbGwgc25kX3NvY19kYWlfc2V0X2JjbGtf cmF0aW8oKS4KCmhkbWktY29kZWMgdGhlbiBuZWVkcyB0byBzdXBwbHkgYW4gaW1wbGVtZW50YXRp b24gZm9yIHRoZQpzZXRfYmNsa19yYXRpbygpIG1ldGhvZCBpbiBzdHJ1Y3Qgc25kX3NvY19kYWlf b3BzLCBqdXN0IGxpa2UgaXQKYWxyZWFkeSBkb2VzIGZvciB0aGUgc2V0X2ZtdCBtZXRob2QsIGFu ZCBwYXNzIHRoZSBiY2xrIHJhdGlvIHRvIHRoZQphY3R1YWwgSERNSSBjb2RlYy4KClNvbWV0aGlu ZyBsaWtlIHRoZSBiZWxvdyB3b3VsZCBwcm9iYWJseSBiZSBtb3ZpbmcgaW4gdGhlIHJpZ2h0CmRp cmVjdGlvbjoKCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2hkbWktY29kZWMuaCBiL2luY2x1 ZGUvc291bmQvaGRtaS1jb2RlYy5oCmluZGV4IDk0ODNjNTVmODcxYi4uMGZjYTY5ODgwZGMzIDEw MDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2hkbWktY29kZWMuaAorKysgYi9pbmNsdWRlL3NvdW5k L2hkbWktY29kZWMuaApAQCAtNDIsNiArNDIsNyBAQCBzdHJ1Y3QgaGRtaV9jb2RlY19kYWlmbXQg ewogCXVuc2lnbmVkIGludCBmcmFtZV9jbGtfaW52OjE7CiAJdW5zaWduZWQgaW50IGJpdF9jbGtf bWFzdGVyOjE7CiAJdW5zaWduZWQgaW50IGZyYW1lX2Nsa19tYXN0ZXI6MTsKKwl1bnNpZ25lZCBp bnQgYmNsa19yYXRpbzsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2hk bWktY29kZWMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvaGRtaS1jb2RlYy5jCmluZGV4IGQwMDczNGQz MWUwNC4uZjBmMDhiN2EwNzNmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2hkbWktY29k ZWMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2hkbWktY29kZWMuYwpAQCAtNTI0LDYgKzUyNCwx NyBAQCBzdGF0aWMgaW50IGhkbWlfY29kZWNfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0 cmVhbSAqc3Vic3RyZWFtLAogCQkJCSAgICAgICAmaGNwLT5kYWlmbXRbZGFpLT5pZF0sICZocCk7 CiB9CiAKK3N0YXRpYyBpbnQgaGRtaV9jb2RlY19zZXRfYmNsa19yYXRpbyhzdHJ1Y3Qgc25kX3Nv Y19kYWkgKmRhaSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCByYXRpbykKK3sKKwlzdHJ1Y3QgaGRt aV9jb2RlY19wcml2ICpoY3AgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOworCisJLyog RklYTUU6IHNvbWUgdmFsaWRhdGlvbiBoZXJlIHdvdWxkIGJlIGdvb2Q/ICovCisJaGNwLT5kYWlm bXRbZGFpLT5pZF0uYmNsa19yYXRpbyA9IHJhdGlvOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRp YyBpbnQgaGRtaV9jb2RlY19zZXRfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAogCQkJICAg ICAgdW5zaWduZWQgaW50IGZtdCkKIHsKQEAgLTU5Myw3ICs2MDQsMTEgQEAgc3RhdGljIGludCBo ZG1pX2NvZGVjX3NldF9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCiAJCX0KIAl9CiAKLQlo Y3AtPmRhaWZtdFtkYWktPmlkXSA9IGNmOworCWhjcC0+ZGFpZm10W2RhaS0+aWRdLmZtdCA9IGNm LmZtdDsKKwloY3AtPmRhaWZtdFtkYWktPmlkXS5iaXRfY2xrX2ludiA9IGNmLmJpdF9jbGtfaW52 OworCWhjcC0+ZGFpZm10W2RhaS0+aWRdLmZyYW1lX2Nsa19pbnYgPSBjZi5mcmFtZV9jbGtfaW52 OworCWhjcC0+ZGFpZm10W2RhaS0+aWRdLmJpdF9jbGtfbWFzdGVyID0gY2YuYml0X2Nsa19tYXN0 ZXI7CisJaGNwLT5kYWlmbXRbZGFpLT5pZF0uZnJhbWVfY2xrX21hc3RlciA9IGNmLmZyYW1lX2Ns a19tYXN0ZXI7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjE1LDYgKzYzMCw3IEBAIHN0YXRpYyBj b25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGhkbWlfZGFpX29wcyA9IHsKIAkuc3RhcnR1cAk9 IGhkbWlfY29kZWNfc3RhcnR1cCwKIAkuc2h1dGRvd24JPSBoZG1pX2NvZGVjX3NodXRkb3duLAog CS5od19wYXJhbXMJPSBoZG1pX2NvZGVjX2h3X3BhcmFtcywKKwkuc2V0X2JjbGtfcmF0aW8JPSBo ZG1pX2NvZGVjX3NldF9iY2xrX3JhdGlvLAogCS5zZXRfZm10CT0gaGRtaV9jb2RlY19zZXRfZm10 LAogCS5kaWdpdGFsX211dGUJPSBoZG1pX2NvZGVjX2RpZ2l0YWxfbXV0ZSwKIH07CkBAIC03OTUs NiArODExLDggQEAgc3RhdGljIGludCBoZG1pX2NvZGVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYpCiAJaWYgKGhjZC0+c3BkaWYpCiAJCWhjcC0+ZGFpZHJ2W2ldID0gaGRtaV9z cGRpZl9kYWk7CiAKKwloY3AtPmRhaWZtdFtEQUlfSURfSTJTXS5iY2xrX3JhdGlvID0gNjQ7CisK IAlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KGRldiwgJmhkbWlfZHJpdmVy LCBoY3AtPmRhaWRydiwKIAkJCQkgICAgIGRhaV9jb3VudCk7CiAJaWYgKHJldCkgewoKVGhlbiB0 ZGE5OTh4IGNhbiBsb29rIGF0IGRhaWZtdC0+YmNsa19yYXRpbyBpbgp0ZGE5OTh4X2F1ZGlvX2h3 X3BhcmFtcygpLgoKLS0gClJNSydzIFBhdGNoIHN5c3RlbTogaHR0cHM6Ly93d3cuYXJtbGludXgu b3JnLnVrL2RldmVsb3Blci9wYXRjaGVzLwpGVFRDIGJyb2FkYmFuZCBmb3IgMC44bWlsZSBsaW5l IGluIHN1YnVyYmlhOiBzeW5jIGF0IDEyLjFNYnBzIGRvd24gNjIya2JwcyB1cApBY2NvcmRpbmcg dG8gc3BlZWR0ZXN0Lm5ldDogMTEuOU1icHMgZG93biA1MDBrYnBzIHVwCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QK ZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9w Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbA==