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=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS 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 ACCA6C43460 for ; Wed, 14 Apr 2021 15:33:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8576861164 for ; Wed, 14 Apr 2021 15:33:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1350081AbhDNPdi (ORCPT ); Wed, 14 Apr 2021 11:33:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48344 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233935AbhDNPdh (ORCPT ); Wed, 14 Apr 2021 11:33:37 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 09EF8C061574 for ; Wed, 14 Apr 2021 08:33:16 -0700 (PDT) Received: from gallifrey.ext.pengutronix.de ([2001:67c:670:201:5054:ff:fe8d:eefb] helo=[IPv6:::1]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lWhVq-0004Hr-0V; Wed, 14 Apr 2021 17:33:06 +0200 Message-ID: <50ef17a2d57b022c48bbca71fd4e074cc3ca9be5.camel@pengutronix.de> Subject: Re: [PATCH] ASoC: fsl: imx-pcm-dma: Don't request dma channel in probe From: Lucas Stach To: Robin Gong , Shengjiu Wang Cc: "sumit.semwal@linaro.org" , "linaro-mm-sig@lists.linaro.org" , Linux-ALSA , "linuxppc-dev@lists.ozlabs.org" , linux-kernel , Timur Tabi , Xiubo Li , "shawnguo@kernel.org" , "S.j. Wang" , Takashi Iwai , Liam Girdwood , "dri-devel@lists.freedesktop.org" , "perex@perex.cz" , Nicolin Chen , Mark Brown , dl-linux-imx , "kernel@pengutronix.de" , Fabio Estevam , "s.hauer@pengutronix.de" , "linux-arm-kernel@lists.infradead.org" , "linux-media@vger.kernel.org" Date: Wed, 14 Apr 2021 17:33:03 +0200 In-Reply-To: References: <1589881301-4143-1-git-send-email-shengjiu.wang@nxp.com> <0866cd8cdb0c22f0b2a6814c4dafa29202aad5f3.camel@pengutronix.de> <53258cd99caaf1199036737f8fad6cc097939567.camel@pengutronix.de> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.4 (3.38.4-1.fc33) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 2001:67c:670:201:5054:ff:fe8d:eefb X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Robin, Am Mittwoch, dem 14.04.2021 um 14:33 +0000 schrieb Robin Gong: > On 2020/05/20 17:43 Lucas Stach wrote: > > Am Mittwoch, den 20.05.2020, 16:20 +0800 schrieb Shengjiu Wang: > > > Hi > > > > > > On Tue, May 19, 2020 at 6:04 PM Lucas Stach > > wrote: > > > > Am Dienstag, den 19.05.2020, 17:41 +0800 schrieb Shengjiu Wang: > > > > > There are two requirements that we need to move the request of dma > > > > > channel from probe to open. > > > > > > > > How do you handle -EPROBE_DEFER return code from the channel request > > > > if you don't do it in probe? > > > > > > I use the dma_request_slave_channel or dma_request_channel instead of > > > dmaengine_pcm_request_chan_of. so there should be not -EPROBE_DEFER > > > return code. > > > > This is a pretty weak argument. The dmaengine device might probe after you > > try to get the channel. Using a function to request the channel that doesn't > > allow you to handle probe deferral is IMHO a bug and should be fixed, instead > > of building even more assumptions on top of it. > > > > > > > - When dma device binds with power-domains, the power will be > > > > > enabled when we request dma channel. If the request of dma channel > > > > > happen on probe, then the power-domains will be always enabled > > > > > after kernel boot up, which is not good for power saving, so we > > > > > need to move the request of dma channel to .open(); > > > > > > > > This is certainly something which could be fixed in the dmaengine > > > > driver. > > > > > > Dma driver always call the pm_runtime_get_sync in > > > device_alloc_chan_resources, the device_alloc_chan_resources is called > > > when channel is requested. so power is enabled on channel request. > > > > So why can't you fix the dmaengine driver to do that RPM call at a later time > > when the channel is actually going to be used? This will allow further power > > savings with other slave devices than the audio PCM. > Hi Lucas, >   Thanks for your suggestion. I have tried to implement runtime autosuspend in > fsl-edma driver on i.mx8qm/qxp with delay time (2 sec) for this feature as below > (or you can refer to drivers/dma/qcom/hidma.c), and pm_runtime_get_sync/ > pm_runtime_put_autosuspend in all dmaengine driver interface like > device_alloc_chan_resources/device_prep_slave_sg/device_prep_dma_cyclic/ > device_tx_status... > > >                 pm_runtime_use_autosuspend(fsl_chan->dev); >                 pm_runtime_set_autosuspend_delay(fsl_chan->dev, 2000); > > That could resolve this audio case since the autosuspend could suspend runtime after > 2 seconds if there is no further dma transfer but only channel request(device_alloc_chan_resources). > But unfortunately, it cause another issue. As you know, on our i.mx8qm/qxp, > power domain done by scfw (drivers/firmware/imx/scu-pd.c) over mailbox: >  imx_sc_pd_power()->imx_scu_call_rpc()-> imx_scu_ipc_write()->mbox_send_message() > which means have to 'waits for completion', meanwhile, some driver like tty will call dmaengine > interfaces in non-atomic case as below, > > static int uart_write(struct tty_struct *tty, const unsigned char *buf, int count) > { >    ....... > port = uart_port_lock(state, flags); >    ...... >         __uart_start(tty); //call start_tx()->dmaengine_prep_slave_sg... >         uart_port_unlock(port, flags); >         return ret; > } > > Thus dma runtime resume may happen in that timing window and cause kernel alarm. > I'm not sure whether there are similar limitations on other driver subsystem. But for me, > It looks like the only way to resolve the contradiction between tty and scu-pd (hardware > limitation on i.mx8qm/qxp) is to give up autosuspend and keep pm_runtime_get_sync > only in device_alloc_chan_resources because request channel is a safe non-atomic phase. > Do you have any idea? Thanks in advance. If you look closely at the driver you used as an example (hidma.c) it looks like there is already something in there, which looks very much like what you need here: In hidma_issue_pending() the driver tries to get the device to runtime resume. If this doesn't work, maybe due to the power domain code not being able to be called in atomic context, the actual work of waking up the dma hardware and issuing the descriptor is shunted to a tasklet. If I'm reading this right, this is exactly what you need here to be able to call the dmaengine code from atomic context: try the rpm get and issue immediately when possible, otherwise shunt the work to a non- atomic context where you can deal with the requirements of scu-pd. Also you don't need the runtime resume in all of the functions you mentioned. From a quick look into the edma driver it looks like for example the prep_slave_dma() function only touches data structures in memory, so you don't actually need the device to be awake at that point. Only later in the flow when you write registers in the dma hardware and actually issue the transfer you need to wake the device from sleep. Regards, Lucas >    > > > > > > > > > > > - With FE-BE case, if the dma channel is requested in probe, then > > > > > there will be below issue, which is caused by that the dma channel > > > > > will be requested duplicately > > > > > > > > Why is this requested a second time? Is this just some missing > > > > cleanup on a deferred probe path? > > > > > > Not relate with deferred probe. With DMA1->ASRC->DMA2->ESAI case, the > > > DMA1->ASRC->DMA2 is in FE, ESAI is in BE. When ESAI drvier probe, > > > DMA3 channel is created with ESAI's "dma:tx" (DMA3 channel > > > is not used in this FE-BE case). When FE-BE startup, DMA2 > > > channel is created, it needs the ESAI's "dma:tx", so below warning > > > comes out. > > > > > > > Regards, > > > > Lucas > > > > > > > > > [ 638.906268] sysfs: cannot create duplicate filename > > '/devices/soc0/soc/2000000.bus/2000000.spba-bus/2024000.esai/dma:tx' > > > > > [ 638.919061] CPU: 1 PID: 673 Comm: aplay Not tainted > > > > > 5.7.0-rc1-12956-gfc64b2585593 #287 [ 638.927113] Hardware name: > > > > > Freescale i.MX6 Quad/DualLite (Device Tree) [ 638.933690] > > > > > [] (unwind_backtrace) from [] > > > > > (show_stack+0x10/0x14) [ 638.941464] [] (show_stack) > > > > > from [] (dump_stack+0xe4/0x118) [ 638.948808] > > > > > [] (dump_stack) from [] > > > > > (sysfs_warn_dup+0x50/0x64) [ 638.956406] [] > > > > > (sysfs_warn_dup) from [] > > > > > (sysfs_do_create_link_sd+0xc8/0xd4) > > > > > [ 638.965134] [] (sysfs_do_create_link_sd) from > > > > > [] (dma_request_chan+0xb0/0x210) [ 638.974120] > > > > > [] (dma_request_chan) from [] > > > > > (dma_request_slave_channel+0x8/0x14) > > > > > [ 638.983111] [] (dma_request_slave_channel) from > > > > > [] (fsl_asrc_dma_hw_params+0x1e0/0x438) > > > > > [ 638.992881] [] (fsl_asrc_dma_hw_params) from > > > > > [] (soc_pcm_hw_params+0x4a0/0x6a8) [ 639.001952] > > > > > [] (soc_pcm_hw_params) from [] > > > > > (dpcm_fe_dai_hw_params+0x70/0xe4) [ 639.010765] [] > > > > > (dpcm_fe_dai_hw_params) from [] > > > > > (snd_pcm_hw_params+0x158/0x418) [ 639.019750] [] > > > > > (snd_pcm_hw_params) from [] > > (snd_pcm_ioctl+0x734/0x183c) [ 639.028129] [] (snd_pcm_ioctl) > > from [] (ksys_ioctl+0x2ac/0xb98) [ 639.035812] [] > > (ksys_ioctl) from [] (ret_fast_syscall+0x0/0x28) [ 639.043490] > > Exception stack(0xec529fa8 to 0xec529ff0) > > > > > [ 639.048565] 9fa0: bee84650 01321870 > > 00000004 c25c4111 bee84650 0002000f > > > > > [ 639.056766] 9fc0: bee84650 01321870 01321820 00000036 > > 00001f40 > > > > > 00000000 0002c2f8 00000003 [ 639.064964] 9fe0: b6f483fc bee8451c > > > > > b6ee2655 b6e1dcf8 [ 639.070339] fsl-esai-dai 2024000.esai: Cannot > > > > > create DMA dma:tx symlink > > > > > > > > > > Signed-off-by: Shengjiu Wang > > > > > --- > > > > >  sound/soc/fsl/imx-pcm-dma.c | 173 > > > > > +++++++++++++++++++++++++++++++++--- > > > > >  1 file changed, 159 insertions(+), 14 deletions(-) > > > > > > > > > > diff --git a/sound/soc/fsl/imx-pcm-dma.c > > > > > b/sound/soc/fsl/imx-pcm-dma.c index 04a9bc749016..dae53b384df4 > > > > > 100644 > > > > > --- a/sound/soc/fsl/imx-pcm-dma.c > > > > > +++ b/sound/soc/fsl/imx-pcm-dma.c > > > > > @@ -11,6 +11,7 @@ > > > > >  #include > > > > >  #include > > > > >  #include > > > > > +#include > > > > > > > > > >  #include > > > > >  #include > > > > > @@ -29,24 +30,168 @@ static bool filter(struct dma_chan *chan, void > > *param) > > > > >       return true; > > > > >  } > > > > > > > > > > -static const struct snd_dmaengine_pcm_config > > imx_dmaengine_pcm_config = { > > > > > - .prepare_slave_config = > > snd_dmaengine_pcm_prepare_slave_config, > > > > > - .compat_filter_fn = filter, > > > > > -}; > > > > > +static int imx_pcm_hw_params(struct snd_soc_component > > *component, > > > > > + struct snd_pcm_substream *substream, > > > > > + struct snd_pcm_hw_params *params) { > > > > > + struct snd_pcm_runtime *runtime = substream->runtime; > > > > > + struct snd_soc_pcm_runtime *rtd = substream->private_data; > > > > > + struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0); > > > > > + struct snd_dmaengine_dai_dma_data *dma_data; > > > > > + struct dma_slave_config config; > > > > > + struct dma_chan *chan; > > > > > + int ret = 0; > > > > > > > > > > -int imx_pcm_dma_init(struct platform_device *pdev, size_t size) > > > > > + snd_pcm_set_runtime_buffer(substream, > > &substream->dma_buffer); > > > > > + runtime->dma_bytes = params_buffer_bytes(params); > > > > > + > > > > > + chan = snd_dmaengine_pcm_get_chan(substream); > > > > > + if (!chan) > > > > > + return -EINVAL; > > > > > + > > > > > + ret = snd_hwparams_to_dma_slave_config(substream, params, > > &config); > > > > > + if (ret) > > > > > + return ret; > > > > > + > > > > > + dma_data = snd_soc_dai_get_dma_data(cpu_dai, substream); > > > > > + if (!dma_data) > > > > > + return -EINVAL; > > > > > + > > > > > + snd_dmaengine_pcm_set_config_from_dai_data(substream, > > > > > + dma_data, > > > > > + &config); > > > > > + return dmaengine_slave_config(chan, &config); } > > > > > + > > > > > +static int imx_pcm_hw_free(struct snd_soc_component *component, > > > > > + struct snd_pcm_substream *substream) > > > > >  { > > > > > - struct snd_dmaengine_pcm_config *config; > > > > > + snd_pcm_set_runtime_buffer(substream, NULL); > > > > > + return 0; > > > > > +} > > > > > + > > > > > +static snd_pcm_uframes_t imx_pcm_pointer(struct snd_soc_component > > *component, > > > > > + struct snd_pcm_substream > > > > > +*substream) { > > > > > + return snd_dmaengine_pcm_pointer(substream); > > > > > +} > > > > > + > > > > > +static int imx_pcm_trigger(struct snd_soc_component *component, > > > > > + struct snd_pcm_substream *substream, int > > > > > +cmd) { > > > > > + return snd_dmaengine_pcm_trigger(substream, cmd); } > > > > > + > > > > > +static int imx_pcm_open(struct snd_soc_component *component, > > > > > + struct snd_pcm_substream *substream) { > > > > > + struct snd_soc_pcm_runtime *rtd = substream->private_data; > > > > > + bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; > > > > > + struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0); > > > > > + struct snd_dmaengine_dai_dma_data *dma_data; > > > > > + struct device *dev = component->dev; > > > > > + struct snd_pcm_hardware hw; > > > > > + struct dma_chan *chan; > > > > > + int ret; > > > > > + > > > > > + ret = snd_pcm_hw_constraint_integer(substream->runtime, > > > > > + > > SNDRV_PCM_HW_PARAM_PERIODS); > > > > > + if (ret < 0) { > > > > > + dev_err(dev, "failed to set pcm hw params periods\n"); > > > > > + return ret; > > > > > + } > > > > > + > > > > > + dma_data = snd_soc_dai_get_dma_data(cpu_dai, substream); > > > > > + if (!dma_data) > > > > > + return -EINVAL; > > > > > + > > > > > + chan = dma_request_slave_channel(cpu_dai->dev, tx ? "tx" : "rx"); > > > > > + if (!chan) { > > > > > + /* Try to request channel using compat_filter_fn */ > > > > > + chan = snd_dmaengine_pcm_request_channel(filter, > > > > > + > > dma_data->filter_data); > > > > > + if (!chan) > > > > > + return -ENXIO; > > > > > + } > > > > > > > > > > - config = devm_kzalloc(&pdev->dev, > > > > > - sizeof(struct snd_dmaengine_pcm_config), > > GFP_KERNEL); > > > > > - if (!config) > > > > > - return -ENOMEM; > > > > > - *config = imx_dmaengine_pcm_config; > > > > > + ret = snd_dmaengine_pcm_open(substream, chan); > > > > > + if (ret) > > > > > + goto pcm_open_fail; > > > > > > > > > > - return devm_snd_dmaengine_pcm_register(&pdev->dev, > > > > > - config, > > > > > - SND_DMAENGINE_PCM_FLAG_COMPAT); > > > > > + memset(&hw, 0, sizeof(hw)); > > > > > + hw.info = SNDRV_PCM_INFO_MMAP | > > SNDRV_PCM_INFO_MMAP_VALID | > > > > > + SNDRV_PCM_INFO_INTERLEAVED; > > > > > + hw.periods_min = 2; > > > > > + hw.periods_max = UINT_MAX; > > > > > + hw.period_bytes_min = 256; > > > > > + hw.period_bytes_max = > > dma_get_max_seg_size(chan->device->dev); > > > > > + hw.buffer_bytes_max = IMX_DEFAULT_DMABUF_SIZE; > > > > > + hw.fifo_size = dma_data->fifo_size; > > > > > + > > > > > + /* Refine the hw according to caps of DMA. */ > > > > > + ret = snd_dmaengine_pcm_refine_runtime_hwparams(substream, > > > > > + > > dma_data, > > > > > + &hw, > > > > > + chan); > > > > > + if (ret < 0) > > > > > + goto refine_runtime_hwparams_fail; > > > > > + > > > > > + snd_soc_set_runtime_hwparams(substream, &hw); > > > > > + > > > > > + /* Support allocate memory from IRAM */ > > > > > + ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_IRAM, > > > > > + chan->device->dev, > > > > > + hw.buffer_bytes_max, > > > > > + &substream->dma_buffer); > > > > > + if (ret < 0) > > > > > + goto alloc_pagas_fail; > > > > > + > > > > > + return 0; > > > > > + > > > > > +alloc_pagas_fail: > > > > > +refine_runtime_hwparams_fail: > > > > > + snd_dmaengine_pcm_close(substream); > > > > > +pcm_open_fail: > > > > > + dma_release_channel(chan); > > > > > + > > > > > + return ret; > > > > > +} > > > > > + > > > > > +static int imx_pcm_close(struct snd_soc_component *component, > > > > > + struct snd_pcm_substream *substream) { > > > > > + if (substream) { > > > > > + snd_dma_free_pages(&substream->dma_buffer); > > > > > + substream->dma_buffer.area = NULL; > > > > > + substream->dma_buffer.addr = 0; > > > > > + } > > > > > + > > > > > + return snd_dmaengine_pcm_close_release_chan(substream); > > > > > +} > > > > > + > > > > > +static int imx_pcm_new(struct snd_soc_component *component, > > > > > + struct snd_soc_pcm_runtime *rtd) { > > > > > + struct snd_card *card = rtd->card->snd_card; > > > > > + > > > > > + return dma_coerce_mask_and_coherent(card->dev, > > > > > +DMA_BIT_MASK(32)); } > > > > > + > > > > > +static const struct snd_soc_component_driver imx_pcm_component = { > > > > > + .name = "imx-pcm-dma", > > > > > + .pcm_construct = imx_pcm_new, > > > > > + .open = imx_pcm_open, > > > > > + .close = imx_pcm_close, > > > > > + .hw_params = imx_pcm_hw_params, > > > > > + .hw_free = imx_pcm_hw_free, > > > > > + .trigger = imx_pcm_trigger, > > > > > + .pointer = imx_pcm_pointer, > > > > > +}; > > > > > + > > > > > +int imx_pcm_dma_init(struct platform_device *pdev, size_t size) { > > > > > + return devm_snd_soc_register_component(&pdev->dev, > > > > > + > > &imx_pcm_component, > > > > > +NULL, 0); > > > > >  } > > > > >  EXPORT_SYMBOL_GPL(imx_pcm_dma_init); > > > > > > 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=-13.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable 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 99F42C433B4 for ; Wed, 14 Apr 2021 15:34:15 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 52FFA6100B for ; Wed, 14 Apr 2021 15:34:14 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 52FFA6100B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 47388165E; Wed, 14 Apr 2021 17:33:22 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 47388165E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1618414452; bh=2nKTby2m+7iGA2eisgWvSYaTH8ERs1St2oX4i1zf7hE=; h=Subject:From:To:Date:In-Reply-To:References:Cc:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=Wd32n/dBY0Tt0RQjC+A+oWGmcAmAhienpVrKbKvKVgp5UTWCGeSmj5wLzmCLu4sTa I/Fx99Ii0i0j2Uaz6mtfHm0Y00oXMmFDa+rDzmOmUcOFs79CLMxnJR9rC37L9uN4T1 XWGkNeQx3xMBcVdDqiVNNgK60YU9eQnQfGg3bXcY= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id AEFB8F8025B; Wed, 14 Apr 2021 17:33:21 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 4BB2DF80269; Wed, 14 Apr 2021 17:33:20 +0200 (CEST) Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 7768BF800FF for ; Wed, 14 Apr 2021 17:33:11 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 7768BF800FF Received: from gallifrey.ext.pengutronix.de ([2001:67c:670:201:5054:ff:fe8d:eefb] helo=[IPv6:::1]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lWhVq-0004Hr-0V; Wed, 14 Apr 2021 17:33:06 +0200 Message-ID: <50ef17a2d57b022c48bbca71fd4e074cc3ca9be5.camel@pengutronix.de> Subject: Re: [PATCH] ASoC: fsl: imx-pcm-dma: Don't request dma channel in probe From: Lucas Stach To: Robin Gong , Shengjiu Wang Date: Wed, 14 Apr 2021 17:33:03 +0200 In-Reply-To: References: <1589881301-4143-1-git-send-email-shengjiu.wang@nxp.com> <0866cd8cdb0c22f0b2a6814c4dafa29202aad5f3.camel@pengutronix.de> <53258cd99caaf1199036737f8fad6cc097939567.camel@pengutronix.de> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.4 (3.38.4-1.fc33) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 2001:67c:670:201:5054:ff:fe8d:eefb X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: alsa-devel@alsa-project.org Cc: Nicolin Chen , Linux-ALSA , Liam Girdwood , "s.hauer@pengutronix.de" , Timur Tabi , Xiubo Li , "shawnguo@kernel.org" , "S.j. Wang" , linux-kernel , "dri-devel@lists.freedesktop.org" , Takashi Iwai , "linaro-mm-sig@lists.linaro.org" , Mark Brown , dl-linux-imx , "kernel@pengutronix.de" , Fabio Estevam , "linuxppc-dev@lists.ozlabs.org" , "sumit.semwal@linaro.org" , "linux-arm-kernel@lists.infradead.org" , "linux-media@vger.kernel.org" X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" Hi Robin, Am Mittwoch, dem 14.04.2021 um 14:33 +0000 schrieb Robin Gong: > On 2020/05/20 17:43 Lucas Stach wrote: > > Am Mittwoch, den 20.05.2020, 16:20 +0800 schrieb Shengjiu Wang: > > > Hi > > > > > > On Tue, May 19, 2020 at 6:04 PM Lucas Stach > > wrote: > > > > Am Dienstag, den 19.05.2020, 17:41 +0800 schrieb Shengjiu Wang: > > > > > There are two requirements that we need to move the request of dma > > > > > channel from probe to open. > > > > > > > > How do you handle -EPROBE_DEFER return code from the channel request > > > > if you don't do it in probe? > > > > > > I use the dma_request_slave_channel or dma_request_channel instead of > > > dmaengine_pcm_request_chan_of. so there should be not -EPROBE_DEFER > > > return code. > > > > This is a pretty weak argument. The dmaengine device might probe after you > > try to get the channel. Using a function to request the channel that doesn't > > allow you to handle probe deferral is IMHO a bug and should be fixed, instead > > of building even more assumptions on top of it. > > > > > > > - When dma device binds with power-domains, the power will be > > > > > enabled when we request dma channel. If the request of dma channel > > > > > happen on probe, then the power-domains will be always enabled > > > > > after kernel boot up, which is not good for power saving, so we > > > > > need to move the request of dma channel to .open(); > > > > > > > > This is certainly something which could be fixed in the dmaengine > > > > driver. > > > > > > Dma driver always call the pm_runtime_get_sync in > > > device_alloc_chan_resources, the device_alloc_chan_resources is called > > > when channel is requested. so power is enabled on channel request. > > > > So why can't you fix the dmaengine driver to do that RPM call at a later time > > when the channel is actually going to be used? This will allow further power > > savings with other slave devices than the audio PCM. > Hi Lucas, >   Thanks for your suggestion. I have tried to implement runtime autosuspend in > fsl-edma driver on i.mx8qm/qxp with delay time (2 sec) for this feature as below > (or you can refer to drivers/dma/qcom/hidma.c), and pm_runtime_get_sync/ > pm_runtime_put_autosuspend in all dmaengine driver interface like > device_alloc_chan_resources/device_prep_slave_sg/device_prep_dma_cyclic/ > device_tx_status... > > >                 pm_runtime_use_autosuspend(fsl_chan->dev); >                 pm_runtime_set_autosuspend_delay(fsl_chan->dev, 2000); > > That could resolve this audio case since the autosuspend could suspend runtime after > 2 seconds if there is no further dma transfer but only channel request(device_alloc_chan_resources). > But unfortunately, it cause another issue. As you know, on our i.mx8qm/qxp, > power domain done by scfw (drivers/firmware/imx/scu-pd.c) over mailbox: >  imx_sc_pd_power()->imx_scu_call_rpc()-> imx_scu_ipc_write()->mbox_send_message() > which means have to 'waits for completion', meanwhile, some driver like tty will call dmaengine > interfaces in non-atomic case as below, > > static int uart_write(struct tty_struct *tty, const unsigned char *buf, int count) > { >    ....... > port = uart_port_lock(state, flags); >    ...... >         __uart_start(tty); //call start_tx()->dmaengine_prep_slave_sg... >         uart_port_unlock(port, flags); >         return ret; > } > > Thus dma runtime resume may happen in that timing window and cause kernel alarm. > I'm not sure whether there are similar limitations on other driver subsystem. But for me, > It looks like the only way to resolve the contradiction between tty and scu-pd (hardware > limitation on i.mx8qm/qxp) is to give up autosuspend and keep pm_runtime_get_sync > only in device_alloc_chan_resources because request channel is a safe non-atomic phase. > Do you have any idea? Thanks in advance. If you look closely at the driver you used as an example (hidma.c) it looks like there is already something in there, which looks very much like what you need here: In hidma_issue_pending() the driver tries to get the device to runtime resume. If this doesn't work, maybe due to the power domain code not being able to be called in atomic context, the actual work of waking up the dma hardware and issuing the descriptor is shunted to a tasklet. If I'm reading this right, this is exactly what you need here to be able to call the dmaengine code from atomic context: try the rpm get and issue immediately when possible, otherwise shunt the work to a non- atomic context where you can deal with the requirements of scu-pd. Also you don't need the runtime resume in all of the functions you mentioned. From a quick look into the edma driver it looks like for example the prep_slave_dma() function only touches data structures in memory, so you don't actually need the device to be awake at that point. Only later in the flow when you write registers in the dma hardware and actually issue the transfer you need to wake the device from sleep. Regards, Lucas >    > > > > > > > > > > > - With FE-BE case, if the dma channel is requested in probe, then > > > > > there will be below issue, which is caused by that the dma channel > > > > > will be requested duplicately > > > > > > > > Why is this requested a second time? Is this just some missing > > > > cleanup on a deferred probe path? > > > > > > Not relate with deferred probe. With DMA1->ASRC->DMA2->ESAI case, the > > > DMA1->ASRC->DMA2 is in FE, ESAI is in BE. When ESAI drvier probe, > > > DMA3 channel is created with ESAI's "dma:tx" (DMA3 channel > > > is not used in this FE-BE case). When FE-BE startup, DMA2 > > > channel is created, it needs the ESAI's "dma:tx", so below warning > > > comes out. > > > > > > > Regards, > > > > Lucas > > > > > > > > > [ 638.906268] sysfs: cannot create duplicate filename > > '/devices/soc0/soc/2000000.bus/2000000.spba-bus/2024000.esai/dma:tx' > > > > > [ 638.919061] CPU: 1 PID: 673 Comm: aplay Not tainted > > > > > 5.7.0-rc1-12956-gfc64b2585593 #287 [ 638.927113] Hardware name: > > > > > Freescale i.MX6 Quad/DualLite (Device Tree) [ 638.933690] > > > > > [] (unwind_backtrace) from [] > > > > > (show_stack+0x10/0x14) [ 638.941464] [] (show_stack) > > > > > from [] (dump_stack+0xe4/0x118) [ 638.948808] > > > > > [] (dump_stack) from [] > > > > > (sysfs_warn_dup+0x50/0x64) [ 638.956406] [] > > > > > (sysfs_warn_dup) from [] > > > > > (sysfs_do_create_link_sd+0xc8/0xd4) > > > > > [ 638.965134] [] (sysfs_do_create_link_sd) from > > > > > [] (dma_request_chan+0xb0/0x210) [ 638.974120] > > > > > [] (dma_request_chan) from [] > > > > > (dma_request_slave_channel+0x8/0x14) > > > > > [ 638.983111] [] (dma_request_slave_channel) from > > > > > [] (fsl_asrc_dma_hw_params+0x1e0/0x438) > > > > > [ 638.992881] [] (fsl_asrc_dma_hw_params) from > > > > > [] (soc_pcm_hw_params+0x4a0/0x6a8) [ 639.001952] > > > > > [] (soc_pcm_hw_params) from [] > > > > > (dpcm_fe_dai_hw_params+0x70/0xe4) [ 639.010765] [] > > > > > (dpcm_fe_dai_hw_params) from [] > > > > > (snd_pcm_hw_params+0x158/0x418) [ 639.019750] [] > > > > > (snd_pcm_hw_params) from [] > > (snd_pcm_ioctl+0x734/0x183c) [ 639.028129] [] (snd_pcm_ioctl) > > from [] (ksys_ioctl+0x2ac/0xb98) [ 639.035812] [] > > (ksys_ioctl) from [] (ret_fast_syscall+0x0/0x28) [ 639.043490] > > Exception stack(0xec529fa8 to 0xec529ff0) > > > > > [ 639.048565] 9fa0: bee84650 01321870 > > 00000004 c25c4111 bee84650 0002000f > > > > > [ 639.056766] 9fc0: bee84650 01321870 01321820 00000036 > > 00001f40 > > > > > 00000000 0002c2f8 00000003 [ 639.064964] 9fe0: b6f483fc bee8451c > > > > > b6ee2655 b6e1dcf8 [ 639.070339] fsl-esai-dai 2024000.esai: Cannot > > > > > create DMA dma:tx symlink > > > > > > > > > > Signed-off-by: Shengjiu Wang > > > > > --- > > > > >  sound/soc/fsl/imx-pcm-dma.c | 173 > > > > > +++++++++++++++++++++++++++++++++--- > > > > >  1 file changed, 159 insertions(+), 14 deletions(-) > > > > > > > > > > diff --git a/sound/soc/fsl/imx-pcm-dma.c > > > > > b/sound/soc/fsl/imx-pcm-dma.c index 04a9bc749016..dae53b384df4 > > > > > 100644 > > > > > --- a/sound/soc/fsl/imx-pcm-dma.c > > > > > +++ b/sound/soc/fsl/imx-pcm-dma.c > > > > > @@ -11,6 +11,7 @@ > > > > >  #include > > > > >  #include > > > > >  #include > > > > > +#include > > > > > > > > > >  #include > > > > >  #include > > > > > @@ -29,24 +30,168 @@ static bool filter(struct dma_chan *chan, void > > *param) > > > > >       return true; > > > > >  } > > > > > > > > > > -static const struct snd_dmaengine_pcm_config > > imx_dmaengine_pcm_config = { > > > > > - .prepare_slave_config = > > snd_dmaengine_pcm_prepare_slave_config, > > > > > - .compat_filter_fn = filter, > > > > > -}; > > > > > +static int imx_pcm_hw_params(struct snd_soc_component > > *component, > > > > > + struct snd_pcm_substream *substream, > > > > > + struct snd_pcm_hw_params *params) { > > > > > + struct snd_pcm_runtime *runtime = substream->runtime; > > > > > + struct snd_soc_pcm_runtime *rtd = substream->private_data; > > > > > + struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0); > > > > > + struct snd_dmaengine_dai_dma_data *dma_data; > > > > > + struct dma_slave_config config; > > > > > + struct dma_chan *chan; > > > > > + int ret = 0; > > > > > > > > > > -int imx_pcm_dma_init(struct platform_device *pdev, size_t size) > > > > > + snd_pcm_set_runtime_buffer(substream, > > &substream->dma_buffer); > > > > > + runtime->dma_bytes = params_buffer_bytes(params); > > > > > + > > > > > + chan = snd_dmaengine_pcm_get_chan(substream); > > > > > + if (!chan) > > > > > + return -EINVAL; > > > > > + > > > > > + ret = snd_hwparams_to_dma_slave_config(substream, params, > > &config); > > > > > + if (ret) > > > > > + return ret; > > > > > + > > > > > + dma_data = snd_soc_dai_get_dma_data(cpu_dai, substream); > > > > > + if (!dma_data) > > > > > + return -EINVAL; > > > > > + > > > > > + snd_dmaengine_pcm_set_config_from_dai_data(substream, > > > > > + dma_data, > > > > > + &config); > > > > > + return dmaengine_slave_config(chan, &config); } > > > > > + > > > > > +static int imx_pcm_hw_free(struct snd_soc_component *component, > > > > > + struct snd_pcm_substream *substream) > > > > >  { > > > > > - struct snd_dmaengine_pcm_config *config; > > > > > + snd_pcm_set_runtime_buffer(substream, NULL); > > > > > + return 0; > > > > > +} > > > > > + > > > > > +static snd_pcm_uframes_t imx_pcm_pointer(struct snd_soc_component > > *component, > > > > > + struct snd_pcm_substream > > > > > +*substream) { > > > > > + return snd_dmaengine_pcm_pointer(substream); > > > > > +} > > > > > + > > > > > +static int imx_pcm_trigger(struct snd_soc_component *component, > > > > > + struct snd_pcm_substream *substream, int > > > > > +cmd) { > > > > > + return snd_dmaengine_pcm_trigger(substream, cmd); } > > > > > + > > > > > +static int imx_pcm_open(struct snd_soc_component *component, > > > > > + struct snd_pcm_substream *substream) { > > > > > + struct snd_soc_pcm_runtime *rtd = substream->private_data; > > > > > + bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; > > > > > + struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0); > > > > > + struct snd_dmaengine_dai_dma_data *dma_data; > > > > > + struct device *dev = component->dev; > > > > > + struct snd_pcm_hardware hw; > > > > > + struct dma_chan *chan; > > > > > + int ret; > > > > > + > > > > > + ret = snd_pcm_hw_constraint_integer(substream->runtime, > > > > > + > > SNDRV_PCM_HW_PARAM_PERIODS); > > > > > + if (ret < 0) { > > > > > + dev_err(dev, "failed to set pcm hw params periods\n"); > > > > > + return ret; > > > > > + } > > > > > + > > > > > + dma_data = snd_soc_dai_get_dma_data(cpu_dai, substream); > > > > > + if (!dma_data) > > > > > + return -EINVAL; > > > > > + > > > > > + chan = dma_request_slave_channel(cpu_dai->dev, tx ? "tx" : "rx"); > > > > > + if (!chan) { > > > > > + /* Try to request channel using compat_filter_fn */ > > > > > + chan = snd_dmaengine_pcm_request_channel(filter, > > > > > + > > dma_data->filter_data); > > > > > + if (!chan) > > > > > + return -ENXIO; > > > > > + } > > > > > > > > > > - config = devm_kzalloc(&pdev->dev, > > > > > - sizeof(struct snd_dmaengine_pcm_config), > > GFP_KERNEL); > > > > > - if (!config) > > > > > - return -ENOMEM; > > > > > - *config = imx_dmaengine_pcm_config; > > > > > + ret = snd_dmaengine_pcm_open(substream, chan); > > > > > + if (ret) > > > > > + goto pcm_open_fail; > > > > > > > > > > - return devm_snd_dmaengine_pcm_register(&pdev->dev, > > > > > - config, > > > > > - SND_DMAENGINE_PCM_FLAG_COMPAT); > > > > > + memset(&hw, 0, sizeof(hw)); > > > > > + hw.info = SNDRV_PCM_INFO_MMAP | > > SNDRV_PCM_INFO_MMAP_VALID | > > > > > + SNDRV_PCM_INFO_INTERLEAVED; > > > > > + hw.periods_min = 2; > > > > > + hw.periods_max = UINT_MAX; > > > > > + hw.period_bytes_min = 256; > > > > > + hw.period_bytes_max = > > dma_get_max_seg_size(chan->device->dev); > > > > > + hw.buffer_bytes_max = IMX_DEFAULT_DMABUF_SIZE; > > > > > + hw.fifo_size = dma_data->fifo_size; > > > > > + > > > > > + /* Refine the hw according to caps of DMA. */ > > > > > + ret = snd_dmaengine_pcm_refine_runtime_hwparams(substream, > > > > > + > > dma_data, > > > > > + &hw, > > > > > + chan); > > > > > + if (ret < 0) > > > > > + goto refine_runtime_hwparams_fail; > > > > > + > > > > > + snd_soc_set_runtime_hwparams(substream, &hw); > > > > > + > > > > > + /* Support allocate memory from IRAM */ > > > > > + ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_IRAM, > > > > > + chan->device->dev, > > > > > + hw.buffer_bytes_max, > > > > > + &substream->dma_buffer); > > > > > + if (ret < 0) > > > > > + goto alloc_pagas_fail; > > > > > + > > > > > + return 0; > > > > > + > > > > > +alloc_pagas_fail: > > > > > +refine_runtime_hwparams_fail: > > > > > + snd_dmaengine_pcm_close(substream); > > > > > +pcm_open_fail: > > > > > + dma_release_channel(chan); > > > > > + > > > > > + return ret; > > > > > +} > > > > > + > > > > > +static int imx_pcm_close(struct snd_soc_component *component, > > > > > + struct snd_pcm_substream *substream) { > > > > > + if (substream) { > > > > > + snd_dma_free_pages(&substream->dma_buffer); > > > > > + substream->dma_buffer.area = NULL; > > > > > + substream->dma_buffer.addr = 0; > > > > > + } > > > > > + > > > > > + return snd_dmaengine_pcm_close_release_chan(substream); > > > > > +} > > > > > + > > > > > +static int imx_pcm_new(struct snd_soc_component *component, > > > > > + struct snd_soc_pcm_runtime *rtd) { > > > > > + struct snd_card *card = rtd->card->snd_card; > > > > > + > > > > > + return dma_coerce_mask_and_coherent(card->dev, > > > > > +DMA_BIT_MASK(32)); } > > > > > + > > > > > +static const struct snd_soc_component_driver imx_pcm_component = { > > > > > + .name = "imx-pcm-dma", > > > > > + .pcm_construct = imx_pcm_new, > > > > > + .open = imx_pcm_open, > > > > > + .close = imx_pcm_close, > > > > > + .hw_params = imx_pcm_hw_params, > > > > > + .hw_free = imx_pcm_hw_free, > > > > > + .trigger = imx_pcm_trigger, > > > > > + .pointer = imx_pcm_pointer, > > > > > +}; > > > > > + > > > > > +int imx_pcm_dma_init(struct platform_device *pdev, size_t size) { > > > > > + return devm_snd_soc_register_component(&pdev->dev, > > > > > + > > &imx_pcm_component, > > > > > +NULL, 0); > > > > >  } > > > > >  EXPORT_SYMBOL_GPL(imx_pcm_dma_init); > > > > > > 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=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable 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 2E20DC43460 for ; Wed, 14 Apr 2021 15:49:49 +0000 (UTC) Received: from lists.ozlabs.org (lists.ozlabs.org [112.213.38.117]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id EE061611B0 for ; Wed, 14 Apr 2021 15:49:47 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EE061611B0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4FL6Np1hY0z3c17 for ; Thu, 15 Apr 2021 01:49:46 +1000 (AEST) Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=pengutronix.de (client-ip=2001:67c:670:201:290:27ff:fe1d:cc33; helo=metis.ext.pengutronix.de; envelope-from=l.stach@pengutronix.de; receiver=) X-Greylist: delayed 962 seconds by postgrey-1.36 at boromir; Thu, 15 Apr 2021 01:49:26 AEST Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4FL6NQ5zBDz2yxx for ; Thu, 15 Apr 2021 01:49:25 +1000 (AEST) Received: from gallifrey.ext.pengutronix.de ([2001:67c:670:201:5054:ff:fe8d:eefb] helo=[IPv6:::1]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lWhVq-0004Hr-0V; Wed, 14 Apr 2021 17:33:06 +0200 Message-ID: <50ef17a2d57b022c48bbca71fd4e074cc3ca9be5.camel@pengutronix.de> Subject: Re: [PATCH] ASoC: fsl: imx-pcm-dma: Don't request dma channel in probe From: Lucas Stach To: Robin Gong , Shengjiu Wang Date: Wed, 14 Apr 2021 17:33:03 +0200 In-Reply-To: References: <1589881301-4143-1-git-send-email-shengjiu.wang@nxp.com> <0866cd8cdb0c22f0b2a6814c4dafa29202aad5f3.camel@pengutronix.de> <53258cd99caaf1199036737f8fad6cc097939567.camel@pengutronix.de> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.4 (3.38.4-1.fc33) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 2001:67c:670:201:5054:ff:fe8d:eefb X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linuxppc-dev@lists.ozlabs.org X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nicolin Chen , Linux-ALSA , Liam Girdwood , "s.hauer@pengutronix.de" , Timur Tabi , Xiubo Li , "shawnguo@kernel.org" , "S.j. Wang" , linux-kernel , "dri-devel@lists.freedesktop.org" , Takashi Iwai , "linaro-mm-sig@lists.linaro.org" , Mark Brown , dl-linux-imx , "kernel@pengutronix.de" , Fabio Estevam , "perex@perex.cz" , "linuxppc-dev@lists.ozlabs.org" , "sumit.semwal@linaro.org" , "linux-arm-kernel@lists.infradead.org" , "linux-media@vger.kernel.org" Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev" Hi Robin, Am Mittwoch, dem 14.04.2021 um 14:33 +0000 schrieb Robin Gong: > On 2020/05/20 17:43 Lucas Stach wrote: > > Am Mittwoch, den 20.05.2020, 16:20 +0800 schrieb Shengjiu Wang: > > > Hi > > > > > > On Tue, May 19, 2020 at 6:04 PM Lucas Stach > > wrote: > > > > Am Dienstag, den 19.05.2020, 17:41 +0800 schrieb Shengjiu Wang: > > > > > There are two requirements that we need to move the request of dma > > > > > channel from probe to open. > > > > > > > > How do you handle -EPROBE_DEFER return code from the channel request > > > > if you don't do it in probe? > > > > > > I use the dma_request_slave_channel or dma_request_channel instead of > > > dmaengine_pcm_request_chan_of. so there should be not -EPROBE_DEFER > > > return code. > > > > This is a pretty weak argument. The dmaengine device might probe after you > > try to get the channel. Using a function to request the channel that doesn't > > allow you to handle probe deferral is IMHO a bug and should be fixed, instead > > of building even more assumptions on top of it. > > > > > > > - When dma device binds with power-domains, the power will be > > > > > enabled when we request dma channel. If the request of dma channel > > > > > happen on probe, then the power-domains will be always enabled > > > > > after kernel boot up, which is not good for power saving, so we > > > > > need to move the request of dma channel to .open(); > > > > > > > > This is certainly something which could be fixed in the dmaengine > > > > driver. > > > > > > Dma driver always call the pm_runtime_get_sync in > > > device_alloc_chan_resources, the device_alloc_chan_resources is called > > > when channel is requested. so power is enabled on channel request. > > > > So why can't you fix the dmaengine driver to do that RPM call at a later time > > when the channel is actually going to be used? This will allow further power > > savings with other slave devices than the audio PCM. > Hi Lucas, >   Thanks for your suggestion. I have tried to implement runtime autosuspend in > fsl-edma driver on i.mx8qm/qxp with delay time (2 sec) for this feature as below > (or you can refer to drivers/dma/qcom/hidma.c), and pm_runtime_get_sync/ > pm_runtime_put_autosuspend in all dmaengine driver interface like > device_alloc_chan_resources/device_prep_slave_sg/device_prep_dma_cyclic/ > device_tx_status... > > >                 pm_runtime_use_autosuspend(fsl_chan->dev); >                 pm_runtime_set_autosuspend_delay(fsl_chan->dev, 2000); > > That could resolve this audio case since the autosuspend could suspend runtime after > 2 seconds if there is no further dma transfer but only channel request(device_alloc_chan_resources). > But unfortunately, it cause another issue. As you know, on our i.mx8qm/qxp, > power domain done by scfw (drivers/firmware/imx/scu-pd.c) over mailbox: >  imx_sc_pd_power()->imx_scu_call_rpc()-> imx_scu_ipc_write()->mbox_send_message() > which means have to 'waits for completion', meanwhile, some driver like tty will call dmaengine > interfaces in non-atomic case as below, > > static int uart_write(struct tty_struct *tty, const unsigned char *buf, int count) > { >    ....... > port = uart_port_lock(state, flags); >    ...... >         __uart_start(tty); //call start_tx()->dmaengine_prep_slave_sg... >         uart_port_unlock(port, flags); >         return ret; > } > > Thus dma runtime resume may happen in that timing window and cause kernel alarm. > I'm not sure whether there are similar limitations on other driver subsystem. But for me, > It looks like the only way to resolve the contradiction between tty and scu-pd (hardware > limitation on i.mx8qm/qxp) is to give up autosuspend and keep pm_runtime_get_sync > only in device_alloc_chan_resources because request channel is a safe non-atomic phase. > Do you have any idea? Thanks in advance. If you look closely at the driver you used as an example (hidma.c) it looks like there is already something in there, which looks very much like what you need here: In hidma_issue_pending() the driver tries to get the device to runtime resume. If this doesn't work, maybe due to the power domain code not being able to be called in atomic context, the actual work of waking up the dma hardware and issuing the descriptor is shunted to a tasklet. If I'm reading this right, this is exactly what you need here to be able to call the dmaengine code from atomic context: try the rpm get and issue immediately when possible, otherwise shunt the work to a non- atomic context where you can deal with the requirements of scu-pd. Also you don't need the runtime resume in all of the functions you mentioned. From a quick look into the edma driver it looks like for example the prep_slave_dma() function only touches data structures in memory, so you don't actually need the device to be awake at that point. Only later in the flow when you write registers in the dma hardware and actually issue the transfer you need to wake the device from sleep. Regards, Lucas >    > > > > > > > > > > > - With FE-BE case, if the dma channel is requested in probe, then > > > > > there will be below issue, which is caused by that the dma channel > > > > > will be requested duplicately > > > > > > > > Why is this requested a second time? Is this just some missing > > > > cleanup on a deferred probe path? > > > > > > Not relate with deferred probe. With DMA1->ASRC->DMA2->ESAI case, the > > > DMA1->ASRC->DMA2 is in FE, ESAI is in BE. When ESAI drvier probe, > > > DMA3 channel is created with ESAI's "dma:tx" (DMA3 channel > > > is not used in this FE-BE case). When FE-BE startup, DMA2 > > > channel is created, it needs the ESAI's "dma:tx", so below warning > > > comes out. > > > > > > > Regards, > > > > Lucas > > > > > > > > > [ 638.906268] sysfs: cannot create duplicate filename > > '/devices/soc0/soc/2000000.bus/2000000.spba-bus/2024000.esai/dma:tx' > > > > > [ 638.919061] CPU: 1 PID: 673 Comm: aplay Not tainted > > > > > 5.7.0-rc1-12956-gfc64b2585593 #287 [ 638.927113] Hardware name: > > > > > Freescale i.MX6 Quad/DualLite (Device Tree) [ 638.933690] > > > > > [] (unwind_backtrace) from [] > > > > > (show_stack+0x10/0x14) [ 638.941464] [] (show_stack) > > > > > from [] (dump_stack+0xe4/0x118) [ 638.948808] > > > > > [] (dump_stack) from [] > > > > > (sysfs_warn_dup+0x50/0x64) [ 638.956406] [] > > > > > (sysfs_warn_dup) from [] > > > > > (sysfs_do_create_link_sd+0xc8/0xd4) > > > > > [ 638.965134] [] (sysfs_do_create_link_sd) from > > > > > [] (dma_request_chan+0xb0/0x210) [ 638.974120] > > > > > [] (dma_request_chan) from [] > > > > > (dma_request_slave_channel+0x8/0x14) > > > > > [ 638.983111] [] (dma_request_slave_channel) from > > > > > [] (fsl_asrc_dma_hw_params+0x1e0/0x438) > > > > > [ 638.992881] [] (fsl_asrc_dma_hw_params) from > > > > > [] (soc_pcm_hw_params+0x4a0/0x6a8) [ 639.001952] > > > > > [] (soc_pcm_hw_params) from [] > > > > > (dpcm_fe_dai_hw_params+0x70/0xe4) [ 639.010765] [] > > > > > (dpcm_fe_dai_hw_params) from [] > > > > > (snd_pcm_hw_params+0x158/0x418) [ 639.019750] [] > > > > > (snd_pcm_hw_params) from [] > > (snd_pcm_ioctl+0x734/0x183c) [ 639.028129] [] (snd_pcm_ioctl) > > from [] (ksys_ioctl+0x2ac/0xb98) [ 639.035812] [] > > (ksys_ioctl) from [] (ret_fast_syscall+0x0/0x28) [ 639.043490] > > Exception stack(0xec529fa8 to 0xec529ff0) > > > > > [ 639.048565] 9fa0: bee84650 01321870 > > 00000004 c25c4111 bee84650 0002000f > > > > > [ 639.056766] 9fc0: bee84650 01321870 01321820 00000036 > > 00001f40 > > > > > 00000000 0002c2f8 00000003 [ 639.064964] 9fe0: b6f483fc bee8451c > > > > > b6ee2655 b6e1dcf8 [ 639.070339] fsl-esai-dai 2024000.esai: Cannot > > > > > create DMA dma:tx symlink > > > > > > > > > > Signed-off-by: Shengjiu Wang > > > > > --- > > > > >  sound/soc/fsl/imx-pcm-dma.c | 173 > > > > > +++++++++++++++++++++++++++++++++--- > > > > >  1 file changed, 159 insertions(+), 14 deletions(-) > > > > > > > > > > diff --git a/sound/soc/fsl/imx-pcm-dma.c > > > > > b/sound/soc/fsl/imx-pcm-dma.c index 04a9bc749016..dae53b384df4 > > > > > 100644 > > > > > --- a/sound/soc/fsl/imx-pcm-dma.c > > > > > +++ b/sound/soc/fsl/imx-pcm-dma.c > > > > > @@ -11,6 +11,7 @@ > > > > >  #include > > > > >  #include > > > > >  #include > > > > > +#include > > > > > > > > > >  #include > > > > >  #include > > > > > @@ -29,24 +30,168 @@ static bool filter(struct dma_chan *chan, void > > *param) > > > > >       return true; > > > > >  } > > > > > > > > > > -static const struct snd_dmaengine_pcm_config > > imx_dmaengine_pcm_config = { > > > > > - .prepare_slave_config = > > snd_dmaengine_pcm_prepare_slave_config, > > > > > - .compat_filter_fn = filter, > > > > > -}; > > > > > +static int imx_pcm_hw_params(struct snd_soc_component > > *component, > > > > > + struct snd_pcm_substream *substream, > > > > > + struct snd_pcm_hw_params *params) { > > > > > + struct snd_pcm_runtime *runtime = substream->runtime; > > > > > + struct snd_soc_pcm_runtime *rtd = substream->private_data; > > > > > + struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0); > > > > > + struct snd_dmaengine_dai_dma_data *dma_data; > > > > > + struct dma_slave_config config; > > > > > + struct dma_chan *chan; > > > > > + int ret = 0; > > > > > > > > > > -int imx_pcm_dma_init(struct platform_device *pdev, size_t size) > > > > > + snd_pcm_set_runtime_buffer(substream, > > &substream->dma_buffer); > > > > > + runtime->dma_bytes = params_buffer_bytes(params); > > > > > + > > > > > + chan = snd_dmaengine_pcm_get_chan(substream); > > > > > + if (!chan) > > > > > + return -EINVAL; > > > > > + > > > > > + ret = snd_hwparams_to_dma_slave_config(substream, params, > > &config); > > > > > + if (ret) > > > > > + return ret; > > > > > + > > > > > + dma_data = snd_soc_dai_get_dma_data(cpu_dai, substream); > > > > > + if (!dma_data) > > > > > + return -EINVAL; > > > > > + > > > > > + snd_dmaengine_pcm_set_config_from_dai_data(substream, > > > > > + dma_data, > > > > > + &config); > > > > > + return dmaengine_slave_config(chan, &config); } > > > > > + > > > > > +static int imx_pcm_hw_free(struct snd_soc_component *component, > > > > > + struct snd_pcm_substream *substream) > > > > >  { > > > > > - struct snd_dmaengine_pcm_config *config; > > > > > + snd_pcm_set_runtime_buffer(substream, NULL); > > > > > + return 0; > > > > > +} > > > > > + > > > > > +static snd_pcm_uframes_t imx_pcm_pointer(struct snd_soc_component > > *component, > > > > > + struct snd_pcm_substream > > > > > +*substream) { > > > > > + return snd_dmaengine_pcm_pointer(substream); > > > > > +} > > > > > + > > > > > +static int imx_pcm_trigger(struct snd_soc_component *component, > > > > > + struct snd_pcm_substream *substream, int > > > > > +cmd) { > > > > > + return snd_dmaengine_pcm_trigger(substream, cmd); } > > > > > + > > > > > +static int imx_pcm_open(struct snd_soc_component *component, > > > > > + struct snd_pcm_substream *substream) { > > > > > + struct snd_soc_pcm_runtime *rtd = substream->private_data; > > > > > + bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; > > > > > + struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0); > > > > > + struct snd_dmaengine_dai_dma_data *dma_data; > > > > > + struct device *dev = component->dev; > > > > > + struct snd_pcm_hardware hw; > > > > > + struct dma_chan *chan; > > > > > + int ret; > > > > > + > > > > > + ret = snd_pcm_hw_constraint_integer(substream->runtime, > > > > > + > > SNDRV_PCM_HW_PARAM_PERIODS); > > > > > + if (ret < 0) { > > > > > + dev_err(dev, "failed to set pcm hw params periods\n"); > > > > > + return ret; > > > > > + } > > > > > + > > > > > + dma_data = snd_soc_dai_get_dma_data(cpu_dai, substream); > > > > > + if (!dma_data) > > > > > + return -EINVAL; > > > > > + > > > > > + chan = dma_request_slave_channel(cpu_dai->dev, tx ? "tx" : "rx"); > > > > > + if (!chan) { > > > > > + /* Try to request channel using compat_filter_fn */ > > > > > + chan = snd_dmaengine_pcm_request_channel(filter, > > > > > + > > dma_data->filter_data); > > > > > + if (!chan) > > > > > + return -ENXIO; > > > > > + } > > > > > > > > > > - config = devm_kzalloc(&pdev->dev, > > > > > - sizeof(struct snd_dmaengine_pcm_config), > > GFP_KERNEL); > > > > > - if (!config) > > > > > - return -ENOMEM; > > > > > - *config = imx_dmaengine_pcm_config; > > > > > + ret = snd_dmaengine_pcm_open(substream, chan); > > > > > + if (ret) > > > > > + goto pcm_open_fail; > > > > > > > > > > - return devm_snd_dmaengine_pcm_register(&pdev->dev, > > > > > - config, > > > > > - SND_DMAENGINE_PCM_FLAG_COMPAT); > > > > > + memset(&hw, 0, sizeof(hw)); > > > > > + hw.info = SNDRV_PCM_INFO_MMAP | > > SNDRV_PCM_INFO_MMAP_VALID | > > > > > + SNDRV_PCM_INFO_INTERLEAVED; > > > > > + hw.periods_min = 2; > > > > > + hw.periods_max = UINT_MAX; > > > > > + hw.period_bytes_min = 256; > > > > > + hw.period_bytes_max = > > dma_get_max_seg_size(chan->device->dev); > > > > > + hw.buffer_bytes_max = IMX_DEFAULT_DMABUF_SIZE; > > > > > + hw.fifo_size = dma_data->fifo_size; > > > > > + > > > > > + /* Refine the hw according to caps of DMA. */ > > > > > + ret = snd_dmaengine_pcm_refine_runtime_hwparams(substream, > > > > > + > > dma_data, > > > > > + &hw, > > > > > + chan); > > > > > + if (ret < 0) > > > > > + goto refine_runtime_hwparams_fail; > > > > > + > > > > > + snd_soc_set_runtime_hwparams(substream, &hw); > > > > > + > > > > > + /* Support allocate memory from IRAM */ > > > > > + ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_IRAM, > > > > > + chan->device->dev, > > > > > + hw.buffer_bytes_max, > > > > > + &substream->dma_buffer); > > > > > + if (ret < 0) > > > > > + goto alloc_pagas_fail; > > > > > + > > > > > + return 0; > > > > > + > > > > > +alloc_pagas_fail: > > > > > +refine_runtime_hwparams_fail: > > > > > + snd_dmaengine_pcm_close(substream); > > > > > +pcm_open_fail: > > > > > + dma_release_channel(chan); > > > > > + > > > > > + return ret; > > > > > +} > > > > > + > > > > > +static int imx_pcm_close(struct snd_soc_component *component, > > > > > + struct snd_pcm_substream *substream) { > > > > > + if (substream) { > > > > > + snd_dma_free_pages(&substream->dma_buffer); > > > > > + substream->dma_buffer.area = NULL; > > > > > + substream->dma_buffer.addr = 0; > > > > > + } > > > > > + > > > > > + return snd_dmaengine_pcm_close_release_chan(substream); > > > > > +} > > > > > + > > > > > +static int imx_pcm_new(struct snd_soc_component *component, > > > > > + struct snd_soc_pcm_runtime *rtd) { > > > > > + struct snd_card *card = rtd->card->snd_card; > > > > > + > > > > > + return dma_coerce_mask_and_coherent(card->dev, > > > > > +DMA_BIT_MASK(32)); } > > > > > + > > > > > +static const struct snd_soc_component_driver imx_pcm_component = { > > > > > + .name = "imx-pcm-dma", > > > > > + .pcm_construct = imx_pcm_new, > > > > > + .open = imx_pcm_open, > > > > > + .close = imx_pcm_close, > > > > > + .hw_params = imx_pcm_hw_params, > > > > > + .hw_free = imx_pcm_hw_free, > > > > > + .trigger = imx_pcm_trigger, > > > > > + .pointer = imx_pcm_pointer, > > > > > +}; > > > > > + > > > > > +int imx_pcm_dma_init(struct platform_device *pdev, size_t size) { > > > > > + return devm_snd_soc_register_component(&pdev->dev, > > > > > + > > &imx_pcm_component, > > > > > +NULL, 0); > > > > >  } > > > > >  EXPORT_SYMBOL_GPL(imx_pcm_dma_init); > > > > > > 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=-13.8 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable 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 B5D03C433B4 for ; Wed, 14 Apr 2021 15:35:50 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1457E6112F for ; Wed, 14 Apr 2021 15:35:50 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1457E6112F Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Date:Cc:To:From: Subject:Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=tXa2EIW0ZTaQ91xCugiwDbvwRJvpeHQUrhx8gyzn/Hw=; b=AapHIt+6n/1msUYrzSfoY5V2T zkwrhS6mUtcqzFLFUqTXqxeXX6Ol1IxCmi7krYDnckkHDLhuEE/NS2yK+sW1BMpO1EDxd7K3FyroB b9KsPJwyKh+8rvLdll9yc0wSUS+zJUpB6PW/zibnSUv+1vwgV8qmzvopAXUvfJk/dfw/YjJ48BpWX Luk9EY/9X1cM4PfjO/2HC3mhMjkzlmX1lnNaSNgcfrq4DKEMUnRAXzYGjFZzha+zfIp4mnjin1Cjw tBOpxx8OR69RBYkCiCedvbw9QnjKvQ+hFLCpSZuBPY8pxrOXgYJd2741ClrUQOYtqvQzWuZcEdfFz wvkVcNGlw==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lWhWS-00D1qa-Ro; Wed, 14 Apr 2021 15:33:45 +0000 Received: from bombadil.infradead.org ([2607:7c80:54:e::133]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lWhWO-00D1px-RO for linux-arm-kernel@desiato.infradead.org; Wed, 14 Apr 2021 15:33:41 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: MIME-Version:Content-Type:References:In-Reply-To:Date:Cc:To:From:Subject: Message-ID:Sender:Reply-To:Content-ID:Content-Description; bh=f7HoaKps0NYtPMCifC57kG96Hv1GwnfLouU1rnJiqAo=; b=xp3Z9Fx74/h4GcU3vGE2cq+fe3 IxbrEQZUctZ5XCovfVOAiMOwqU1dluCkpfulwb50C8ckSJXkK7C/m/13fZCnTPvZ33wC3EdM82fxN ciQgH4c/AQWb4EADSDzyy2U05ZFv+oJYd2tOx02kmSUbdHCe3+GFfbeUYAfOHhJ1YE0ucSGmDdCK2 g3bTz1wr4naqdOn/0bgl4wIpuBuLgzkfrd/io/tr6VcxTwszNy8bTV6PrOVI8xFGYB57p6ohs1g9h mmv1kCrZVDPiZOk8XvIoUyPyz4Kz2Wbp1gFLEL7fCreuuUwaRFis290W4f7sFQNUiqZtC+haJJJKp iUwDedxg==; Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by bombadil.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lWhWK-007u8e-U0 for linux-arm-kernel@lists.infradead.org; Wed, 14 Apr 2021 15:33:39 +0000 Received: from gallifrey.ext.pengutronix.de ([2001:67c:670:201:5054:ff:fe8d:eefb] helo=[IPv6:::1]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lWhVq-0004Hr-0V; Wed, 14 Apr 2021 17:33:06 +0200 Message-ID: <50ef17a2d57b022c48bbca71fd4e074cc3ca9be5.camel@pengutronix.de> Subject: Re: [PATCH] ASoC: fsl: imx-pcm-dma: Don't request dma channel in probe From: Lucas Stach To: Robin Gong , Shengjiu Wang Cc: "sumit.semwal@linaro.org" , "linaro-mm-sig@lists.linaro.org" , Linux-ALSA , "linuxppc-dev@lists.ozlabs.org" , linux-kernel , Timur Tabi , Xiubo Li , "shawnguo@kernel.org" , "S.j. Wang" , Takashi Iwai , Liam Girdwood , "dri-devel@lists.freedesktop.org" , "perex@perex.cz" , Nicolin Chen , Mark Brown , dl-linux-imx , "kernel@pengutronix.de" , Fabio Estevam , "s.hauer@pengutronix.de" , "linux-arm-kernel@lists.infradead.org" , "linux-media@vger.kernel.org" Date: Wed, 14 Apr 2021 17:33:03 +0200 In-Reply-To: References: <1589881301-4143-1-git-send-email-shengjiu.wang@nxp.com> <0866cd8cdb0c22f0b2a6814c4dafa29202aad5f3.camel@pengutronix.de> <53258cd99caaf1199036737f8fad6cc097939567.camel@pengutronix.de> User-Agent: Evolution 3.38.4 (3.38.4-1.fc33) MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2001:67c:670:201:5054:ff:fe8d:eefb X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-arm-kernel@lists.infradead.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210414_083337_321333_A0EDE997 X-CRM114-Status: GOOD ( 61.85 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgUm9iaW4sCgpBbSBNaXR0d29jaCwgZGVtIDE0LjA0LjIwMjEgdW0gMTQ6MzMgKzAwMDAgc2No cmllYiBSb2JpbiBHb25nOgo+IE9uIDIwMjAvMDUvMjAgMTc6NDMgTHVjYXMgU3RhY2ggPGwuc3Rh Y2hAcGVuZ3V0cm9uaXguZGU+IHdyb3RlOgo+ID4gQW0gTWl0dHdvY2gsIGRlbiAyMC4wNS4yMDIw LCAxNjoyMCArMDgwMCBzY2hyaWViIFNoZW5naml1IFdhbmc6Cj4gPiA+IEhpCj4gPiA+IAo+ID4g PiBPbiBUdWUsIE1heSAxOSwgMjAyMCBhdCA2OjA0IFBNIEx1Y2FzIFN0YWNoIDxsLnN0YWNoQHBl bmd1dHJvbml4LmRlPgo+ID4gd3JvdGU6Cj4gPiA+ID4gQW0gRGllbnN0YWcsIGRlbiAxOS4wNS4y MDIwLCAxNzo0MSArMDgwMCBzY2hyaWViIFNoZW5naml1IFdhbmc6Cj4gPiA+ID4gPiBUaGVyZSBh cmUgdHdvIHJlcXVpcmVtZW50cyB0aGF0IHdlIG5lZWQgdG8gbW92ZSB0aGUgcmVxdWVzdCBvZiBk bWEKPiA+ID4gPiA+IGNoYW5uZWwgZnJvbSBwcm9iZSB0byBvcGVuLgo+ID4gPiA+IAo+ID4gPiA+ IEhvdyBkbyB5b3UgaGFuZGxlIC1FUFJPQkVfREVGRVIgcmV0dXJuIGNvZGUgZnJvbSB0aGUgY2hh bm5lbCByZXF1ZXN0Cj4gPiA+ID4gaWYgeW91IGRvbid0IGRvIGl0IGluIHByb2JlPwo+ID4gPiAK PiA+ID4gSSB1c2UgdGhlIGRtYV9yZXF1ZXN0X3NsYXZlX2NoYW5uZWwgb3IgZG1hX3JlcXVlc3Rf Y2hhbm5lbCBpbnN0ZWFkIG9mCj4gPiA+IGRtYWVuZ2luZV9wY21fcmVxdWVzdF9jaGFuX29mLiBz byB0aGVyZSBzaG91bGQgYmUgbm90IC1FUFJPQkVfREVGRVIKPiA+ID4gcmV0dXJuIGNvZGUuCj4g PiAKPiA+IFRoaXMgaXMgYSBwcmV0dHkgd2VhayBhcmd1bWVudC4gVGhlIGRtYWVuZ2luZSBkZXZp Y2UgbWlnaHQgcHJvYmUgYWZ0ZXIgeW91Cj4gPiB0cnkgdG8gZ2V0IHRoZSBjaGFubmVsLiBVc2lu ZyBhIGZ1bmN0aW9uIHRvIHJlcXVlc3QgdGhlIGNoYW5uZWwgdGhhdCBkb2Vzbid0Cj4gPiBhbGxv dyB5b3UgdG8gaGFuZGxlIHByb2JlIGRlZmVycmFsIGlzIElNSE8gYSBidWcgYW5kIHNob3VsZCBi ZSBmaXhlZCwgaW5zdGVhZAo+ID4gb2YgYnVpbGRpbmcgZXZlbiBtb3JlIGFzc3VtcHRpb25zIG9u IHRvcCBvZiBpdC4KPiA+IAo+ID4gPiA+ID4gLSBXaGVuIGRtYSBkZXZpY2UgYmluZHMgd2l0aCBw b3dlci1kb21haW5zLCB0aGUgcG93ZXIgd2lsbCBiZQo+ID4gPiA+ID4gZW5hYmxlZCB3aGVuIHdl IHJlcXVlc3QgZG1hIGNoYW5uZWwuIElmIHRoZSByZXF1ZXN0IG9mIGRtYSBjaGFubmVsCj4gPiA+ ID4gPiBoYXBwZW4gb24gcHJvYmUsIHRoZW4gdGhlIHBvd2VyLWRvbWFpbnMgd2lsbCBiZSBhbHdh eXMgZW5hYmxlZAo+ID4gPiA+ID4gYWZ0ZXIga2VybmVsIGJvb3QgdXAsICB3aGljaCBpcyBub3Qg Z29vZCBmb3IgcG93ZXIgc2F2aW5nLCAgc28gd2UKPiA+ID4gPiA+IG5lZWQgdG8gbW92ZSB0aGUg cmVxdWVzdCBvZiBkbWEgY2hhbm5lbCB0byAub3BlbigpOwo+ID4gPiA+IAo+ID4gPiA+IFRoaXMg aXMgY2VydGFpbmx5IHNvbWV0aGluZyB3aGljaCBjb3VsZCBiZSBmaXhlZCBpbiB0aGUgZG1hZW5n aW5lCj4gPiA+ID4gZHJpdmVyLgo+ID4gPiAKPiA+ID4gRG1hIGRyaXZlciBhbHdheXMgY2FsbCB0 aGUgcG1fcnVudGltZV9nZXRfc3luYyBpbgo+ID4gPiBkZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJj ZXMsIHRoZSBkZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMgaXMgY2FsbGVkCj4gPiA+IHdoZW4g Y2hhbm5lbCBpcyByZXF1ZXN0ZWQuIHNvIHBvd2VyIGlzIGVuYWJsZWQgb24gY2hhbm5lbCByZXF1 ZXN0Lgo+ID4gCj4gPiBTbyB3aHkgY2FuJ3QgeW91IGZpeCB0aGUgZG1hZW5naW5lIGRyaXZlciB0 byBkbyB0aGF0IFJQTSBjYWxsIGF0IGEgbGF0ZXIgdGltZQo+ID4gd2hlbiB0aGUgY2hhbm5lbCBp cyBhY3R1YWxseSBnb2luZyB0byBiZSB1c2VkPyBUaGlzIHdpbGwgYWxsb3cgZnVydGhlciBwb3dl cgo+ID4gc2F2aW5ncyB3aXRoIG90aGVyIHNsYXZlIGRldmljZXMgdGhhbiB0aGUgYXVkaW8gUENN Lgo+IEhpIEx1Y2FzLAo+IMKgwqBUaGFua3MgZm9yIHlvdXIgc3VnZ2VzdGlvbi4gSSBoYXZlIHRy aWVkIHRvIGltcGxlbWVudCBydW50aW1lIGF1dG9zdXNwZW5kIGluCj4gZnNsLWVkbWEgZHJpdmVy IG9uIGkubXg4cW0vcXhwIHdpdGggZGVsYXkgdGltZSAoMiBzZWMpIGZvciB0aGlzIGZlYXR1cmUg YXMgYmVsb3cKPiAob3IgeW91IGNhbiByZWZlciB0byBkcml2ZXJzL2RtYS9xY29tL2hpZG1hLmMp LCBhbmQgcG1fcnVudGltZV9nZXRfc3luYy8KPiBwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZCBp biBhbGwgZG1hZW5naW5lIGRyaXZlciBpbnRlcmZhY2UgbGlrZQo+IGRldmljZV9hbGxvY19jaGFu X3Jlc291cmNlcy9kZXZpY2VfcHJlcF9zbGF2ZV9zZy9kZXZpY2VfcHJlcF9kbWFfY3ljbGljLwo+ IGRldmljZV90eF9zdGF0dXMuLi4KPiAKPiAKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKGZzbF9jaGFuLT5kZXYpOwo+IMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXko ZnNsX2NoYW4tPmRldiwgMjAwMCk7Cj4gCj4gVGhhdCBjb3VsZCByZXNvbHZlIHRoaXMgYXVkaW8g Y2FzZSBzaW5jZSB0aGUgYXV0b3N1c3BlbmQgY291bGQgc3VzcGVuZCBydW50aW1lIGFmdGVyCj4g MiBzZWNvbmRzIGlmIHRoZXJlIGlzIG5vIGZ1cnRoZXIgZG1hIHRyYW5zZmVyIGJ1dCBvbmx5IGNo YW5uZWwgcmVxdWVzdChkZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMpLgo+IEJ1dCB1bmZvcnR1 bmF0ZWx5LCBpdCBjYXVzZSBhbm90aGVyIGlzc3VlLiBBcyB5b3Uga25vdywgb24gb3VyIGkubXg4 cW0vcXhwLCAKPiBwb3dlciBkb21haW4gZG9uZSBieSBzY2Z3IChkcml2ZXJzL2Zpcm13YXJlL2lt eC9zY3UtcGQuYykgb3ZlciBtYWlsYm94Ogo+IMKgaW14X3NjX3BkX3Bvd2VyKCktPmlteF9zY3Vf Y2FsbF9ycGMoKS0+IGlteF9zY3VfaXBjX3dyaXRlKCktPm1ib3hfc2VuZF9tZXNzYWdlKCkKPiB3 aGljaCBtZWFucyBoYXZlIHRvICd3YWl0cyBmb3IgY29tcGxldGlvbicsIG1lYW53aGlsZSwgc29t ZSBkcml2ZXIgbGlrZSB0dHkgd2lsbCBjYWxsIGRtYWVuZ2luZQo+IGludGVyZmFjZXMgaW4gbm9u LWF0b21pYyBjYXNlIGFzIGJlbG93LCAKPiAKPiBzdGF0aWMgaW50IHVhcnRfd3JpdGUoc3RydWN0 IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCj4g ewo+IMKgwqDCoC4uLi4uLi4KPiAJICAgIHBvcnQgPSB1YXJ0X3BvcnRfbG9jayhzdGF0ZSwgZmxh Z3MpOwo+IMKgwqDCoC4uLi4uLgo+IMKgwqDCoMKgwqDCoMKgwqBfX3VhcnRfc3RhcnQodHR5KTsg IC8vY2FsbCBzdGFydF90eCgpLT5kbWFlbmdpbmVfcHJlcF9zbGF2ZV9zZy4uLgo+IMKgwqDCoMKg wqDCoMKgwqB1YXJ0X3BvcnRfdW5sb2NrKHBvcnQsIGZsYWdzKTsKPiDCoMKgwqDCoMKgwqDCoMKg cmV0dXJuIHJldDsKPiB9Cj4gCj4gVGh1cyBkbWEgcnVudGltZSByZXN1bWUgbWF5IGhhcHBlbiBp biB0aGF0IHRpbWluZyB3aW5kb3cgYW5kIGNhdXNlIGtlcm5lbCBhbGFybS4gCj4gSSdtIG5vdCBz dXJlIHdoZXRoZXIgdGhlcmUgYXJlIHNpbWlsYXIgbGltaXRhdGlvbnMgb24gb3RoZXIgZHJpdmVy IHN1YnN5c3RlbS4gQnV0IGZvciBtZSwKPiBJdCBsb29rcyBsaWtlIHRoZSBvbmx5IHdheSB0byBy ZXNvbHZlIHRoZSBjb250cmFkaWN0aW9uIGJldHdlZW4gdHR5IGFuZCBzY3UtcGQgKGhhcmR3YXJl Cj4gbGltaXRhdGlvbiBvbiBpLm14OHFtL3F4cCkgaXMgdG8gZ2l2ZSB1cCBhdXRvc3VzcGVuZCBh bmQga2VlcCBwbV9ydW50aW1lX2dldF9zeW5jCj4gb25seSBpbiBkZXZpY2VfYWxsb2NfY2hhbl9y ZXNvdXJjZXMgYmVjYXVzZSByZXF1ZXN0IGNoYW5uZWwgaXMgYSBzYWZlIG5vbi1hdG9taWMgcGhh c2UuIAo+IERvIHlvdSBoYXZlIGFueSBpZGVhPyBUaGFua3MgaW4gYWR2YW5jZS4gCgpJZiB5b3Ug bG9vayBjbG9zZWx5IGF0IHRoZSBkcml2ZXIgeW91IHVzZWQgYXMgYW4gZXhhbXBsZSAoaGlkbWEu YykgaXQKbG9va3MgbGlrZSB0aGVyZSBpcyBhbHJlYWR5IHNvbWV0aGluZyBpbiB0aGVyZSwgd2hp Y2ggbG9va3MgdmVyeSBtdWNoCmxpa2Ugd2hhdCB5b3UgbmVlZCBoZXJlOgoKSW4gaGlkbWFfaXNz dWVfcGVuZGluZygpIHRoZSBkcml2ZXIgdHJpZXMgdG8gZ2V0IHRoZSBkZXZpY2UgdG8gcnVudGlt ZQpyZXN1bWUuIElmIHRoaXMgZG9lc24ndCB3b3JrLCBtYXliZSBkdWUgdG8gdGhlIHBvd2VyIGRv bWFpbiBjb2RlIG5vdApiZWluZyBhYmxlIHRvIGJlIGNhbGxlZCBpbiBhdG9taWMgY29udGV4dCwg dGhlIGFjdHVhbCB3b3JrIG9mIHdha2luZyB1cAp0aGUgZG1hIGhhcmR3YXJlIGFuZCBpc3N1aW5n IHRoZSBkZXNjcmlwdG9yIGlzIHNodW50ZWQgdG8gYSB0YXNrbGV0LgoKSWYgSSdtIHJlYWRpbmcg dGhpcyByaWdodCwgdGhpcyBpcyBleGFjdGx5IHdoYXQgeW91IG5lZWQgaGVyZSB0byBiZQphYmxl IHRvIGNhbGwgdGhlIGRtYWVuZ2luZSBjb2RlIGZyb20gYXRvbWljIGNvbnRleHQ6IHRyeSB0aGUg cnBtIGdldAphbmQgaXNzdWUgaW1tZWRpYXRlbHkgd2hlbiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHNo dW50IHRoZSB3b3JrIHRvIGEgbm9uLQphdG9taWMgY29udGV4dCB3aGVyZSB5b3UgY2FuIGRlYWwg d2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mIHNjdS1wZC4KCkFsc28geW91IGRvbid0IG5lZWQgdGhl IHJ1bnRpbWUgcmVzdW1lIGluIGFsbCBvZiB0aGUgZnVuY3Rpb25zIHlvdQptZW50aW9uZWQuIEZy b20gYSBxdWljayBsb29rIGludG8gdGhlIGVkbWEgZHJpdmVyIGl0IGxvb2tzIGxpa2UgZm9yCmV4 YW1wbGUgdGhlIHByZXBfc2xhdmVfZG1hKCkgZnVuY3Rpb24gb25seSB0b3VjaGVzIGRhdGEgc3Ry dWN0dXJlcyBpbgptZW1vcnksIHNvIHlvdSBkb24ndCBhY3R1YWxseSBuZWVkIHRoZSBkZXZpY2Ug dG8gYmUgYXdha2UgYXQgdGhhdApwb2ludC4gT25seSBsYXRlciBpbiB0aGUgZmxvdyB3aGVuIHlv dSB3cml0ZSByZWdpc3RlcnMgaW4gdGhlIGRtYQpoYXJkd2FyZSBhbmQgYWN0dWFsbHkgaXNzdWUg dGhlIHRyYW5zZmVyIHlvdSBuZWVkIHRvIHdha2UgdGhlIGRldmljZQpmcm9tIHNsZWVwLgoKUmVn YXJkcywKTHVjYXMKCj4gwqDCoAo+IAo+IAo+IAo+IAo+ID4gCj4gPiA+ID4gPiAtIFdpdGggRkUt QkUgY2FzZSwgaWYgdGhlIGRtYSBjaGFubmVsIGlzIHJlcXVlc3RlZCBpbiBwcm9iZSwgdGhlbgo+ ID4gPiA+ID4gdGhlcmUgd2lsbCBiZSBiZWxvdyBpc3N1ZSwgd2hpY2ggaXMgY2F1c2VkIGJ5IHRo YXQgdGhlIGRtYSBjaGFubmVsCj4gPiA+ID4gPiB3aWxsIGJlIHJlcXVlc3RlZCBkdXBsaWNhdGVs eQo+ID4gPiA+IAo+ID4gPiA+IFdoeSBpcyB0aGlzIHJlcXVlc3RlZCBhIHNlY29uZCB0aW1lPyBJ cyB0aGlzIGp1c3Qgc29tZSBtaXNzaW5nCj4gPiA+ID4gY2xlYW51cCBvbiBhIGRlZmVycmVkIHBy b2JlIHBhdGg/Cj4gPiA+IAo+ID4gPiBOb3QgcmVsYXRlIHdpdGggZGVmZXJyZWQgcHJvYmUuICBX aXRoIERNQTEtPkFTUkMtPkRNQTItPkVTQUkgY2FzZSwgdGhlCj4gPiA+IERNQTEtPkFTUkMtPkRN QTIgaXMgaW4gRkUsICBFU0FJIGlzIGluIEJFLiAgV2hlbiBFU0FJIGRydmllciBwcm9iZSwKPiA+ ID4gRE1BMyBjaGFubmVsIGlzIGNyZWF0ZWQgd2l0aCBFU0FJJ3MgImRtYTp0eCIgKERNQTMgY2hh bm5lbAo+ID4gPiBpcyBub3QgdXNlZCBpbiB0aGlzIEZFLUJFIGNhc2UpLiAgICBXaGVuIEZFLUJF IHN0YXJ0dXAsIERNQTIKPiA+ID4gY2hhbm5lbCBpcyBjcmVhdGVkLCBpdCBuZWVkcyB0aGUgRVNB SSdzICJkbWE6dHgiLCBzbyBiZWxvdyB3YXJuaW5nCj4gPiA+IGNvbWVzIG91dC4KPiA+ID4gCj4g PiA+ID4gUmVnYXJkcywKPiA+ID4gPiBMdWNhcwo+ID4gPiA+IAo+ID4gPiA+ID4gWyAgNjM4Ljkw NjI2OF0gc3lzZnM6IGNhbm5vdCBjcmVhdGUgZHVwbGljYXRlIGZpbGVuYW1lCj4gPiAnL2Rldmlj ZXMvc29jMC9zb2MvMjAwMDAwMC5idXMvMjAwMDAwMC5zcGJhLWJ1cy8yMDI0MDAwLmVzYWkvZG1h OnR4Jwo+ID4gPiA+ID4gWyAgNjM4LjkxOTA2MV0gQ1BVOiAxIFBJRDogNjczIENvbW06IGFwbGF5 IE5vdCB0YWludGVkCj4gPiA+ID4gPiA1LjcuMC1yYzEtMTI5NTYtZ2ZjNjRiMjU4NTU5MyAjMjg3 IFsgIDYzOC45MjcxMTNdIEhhcmR3YXJlIG5hbWU6Cj4gPiA+ID4gPiBGcmVlc2NhbGUgaS5NWDYg UXVhZC9EdWFsTGl0ZSAoRGV2aWNlIFRyZWUpIFsgIDYzOC45MzM2OTBdCj4gPiA+ID4gPiBbPGMw MTEwZGQ4Pl0gKHVud2luZF9iYWNrdHJhY2UpIGZyb20gWzxjMDEwYjhlYz5dCj4gPiA+ID4gPiAo c2hvd19zdGFjaysweDEwLzB4MTQpIFsgIDYzOC45NDE0NjRdIFs8YzAxMGI4ZWM+XSAoc2hvd19z dGFjaykKPiA+ID4gPiA+IGZyb20gWzxjMDU1N2ZjMD5dIChkdW1wX3N0YWNrKzB4ZTQvMHgxMTgp IFsgIDYzOC45NDg4MDhdCj4gPiA+ID4gPiBbPGMwNTU3ZmMwPl0gKGR1bXBfc3RhY2spIGZyb20g WzxjMDMyYWViND5dCj4gPiA+ID4gPiAoc3lzZnNfd2Fybl9kdXArMHg1MC8weDY0KSBbICA2Mzgu OTU2NDA2XSBbPGMwMzJhZWI0Pl0KPiA+ID4gPiA+IChzeXNmc193YXJuX2R1cCkgZnJvbSBbPGMw MzJiMWE4Pl0KPiA+ID4gPiA+IChzeXNmc19kb19jcmVhdGVfbGlua19zZCsweGM4LzB4ZDQpCj4g PiA+ID4gPiBbICA2MzguOTY1MTM0XSBbPGMwMzJiMWE4Pl0gKHN5c2ZzX2RvX2NyZWF0ZV9saW5r X3NkKSBmcm9tCj4gPiA+ID4gPiBbPGMwNWRjNjY4Pl0gKGRtYV9yZXF1ZXN0X2NoYW4rMHhiMC8w eDIxMCkgWyAgNjM4Ljk3NDEyMF0KPiA+ID4gPiA+IFs8YzA1ZGM2Njg+XSAoZG1hX3JlcXVlc3Rf Y2hhbikgZnJvbSBbPGMwNWRjN2QwPl0KPiA+ID4gPiA+IChkbWFfcmVxdWVzdF9zbGF2ZV9jaGFu bmVsKzB4OC8weDE0KQo+ID4gPiA+ID4gWyAgNjM4Ljk4MzExMV0gWzxjMDVkYzdkMD5dIChkbWFf cmVxdWVzdF9zbGF2ZV9jaGFubmVsKSBmcm9tCj4gPiA+ID4gPiBbPGMwOWQ1NTQ4Pl0gKGZzbF9h c3JjX2RtYV9od19wYXJhbXMrMHgxZTAvMHg0MzgpCj4gPiA+ID4gPiBbICA2MzguOTkyODgxXSBb PGMwOWQ1NTQ4Pl0gKGZzbF9hc3JjX2RtYV9od19wYXJhbXMpIGZyb20KPiA+ID4gPiA+IFs8YzA5 YzE2NTQ+XSAoc29jX3BjbV9od19wYXJhbXMrMHg0YTAvMHg2YTgpIFsgIDYzOS4wMDE5NTJdCj4g PiA+ID4gPiBbPGMwOWMxNjU0Pl0gKHNvY19wY21faHdfcGFyYW1zKSBmcm9tIFs8YzA5YzM5ZDQ+ XQo+ID4gPiA+ID4gKGRwY21fZmVfZGFpX2h3X3BhcmFtcysweDcwLzB4ZTQpIFsgIDYzOS4wMTA3 NjVdIFs8YzA5YzM5ZDQ+XQo+ID4gPiA+ID4gKGRwY21fZmVfZGFpX2h3X3BhcmFtcykgZnJvbSBb PGMwOTliMjc0Pl0KPiA+ID4gPiA+IChzbmRfcGNtX2h3X3BhcmFtcysweDE1OC8weDQxOCkgWyAg NjM5LjAxOTc1MF0gWzxjMDk5YjI3ND5dCj4gPiA+ID4gPiAoc25kX3BjbV9od19wYXJhbXMpIGZy b20gWzxjMDk5YzVhMD5dCj4gPiAoc25kX3BjbV9pb2N0bCsweDczNC8weDE4M2MpIFsgIDYzOS4w MjgxMjldIFs8YzA5OWM1YTA+XSAoc25kX3BjbV9pb2N0bCkKPiA+IGZyb20gWzxjMDI5ZmY5ND5d IChrc3lzX2lvY3RsKzB4MmFjLzB4Yjk4KSBbICA2MzkuMDM1ODEyXSBbPGMwMjlmZjk0Pl0KPiA+ IChrc3lzX2lvY3RsKSBmcm9tIFs8YzAxMDAwODA+XSAocmV0X2Zhc3Rfc3lzY2FsbCsweDAvMHgy OCkgWyAgNjM5LjA0MzQ5MF0KPiA+IEV4Y2VwdGlvbiBzdGFjaygweGVjNTI5ZmE4IHRvIDB4ZWM1 MjlmZjApCj4gPiA+ID4gPiBbICA2MzkuMDQ4NTY1XSA5ZmEwOiAgICAgICAgICAgICAgICAgICBi ZWU4NDY1MCAwMTMyMTg3MAo+ID4gMDAwMDAwMDQgYzI1YzQxMTEgYmVlODQ2NTAgMDAwMjAwMGYK PiA+ID4gPiA+IFsgIDYzOS4wNTY3NjZdIDlmYzA6IGJlZTg0NjUwIDAxMzIxODcwIDAxMzIxODIw IDAwMDAwMDM2Cj4gPiAwMDAwMWY0MAo+ID4gPiA+ID4gMDAwMDAwMDAgMDAwMmMyZjggMDAwMDAw MDMgWyAgNjM5LjA2NDk2NF0gOWZlMDogYjZmNDgzZmMgYmVlODQ1MWMKPiA+ID4gPiA+IGI2ZWUy NjU1IGI2ZTFkY2Y4IFsgIDYzOS4wNzAzMzldIGZzbC1lc2FpLWRhaSAyMDI0MDAwLmVzYWk6IENh bm5vdAo+ID4gPiA+ID4gY3JlYXRlIERNQSBkbWE6dHggc3ltbGluawo+ID4gPiA+ID4gCj4gPiA+ ID4gPiBTaWduZWQtb2ZmLWJ5OiBTaGVuZ2ppdSBXYW5nIDxzaGVuZ2ppdS53YW5nQG54cC5jb20+ Cj4gPiA+ID4gPiAtLS0KPiA+ID4gPiA+IMKgc291bmQvc29jL2ZzbC9pbXgtcGNtLWRtYS5jIHwg MTczCj4gPiA+ID4gPiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0KPiA+ID4g PiA+IMKgMSBmaWxlIGNoYW5nZWQsIDE1OSBpbnNlcnRpb25zKCspLCAxNCBkZWxldGlvbnMoLSkK PiA+ID4gPiA+IAo+ID4gPiA+ID4gZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvaW14LXBjbS1k bWEuYwo+ID4gPiA+ID4gYi9zb3VuZC9zb2MvZnNsL2lteC1wY20tZG1hLmMgaW5kZXggMDRhOWJj NzQ5MDE2Li5kYWU1M2IzODRkZjQKPiA+ID4gPiA+IDEwMDY0NAo+ID4gPiA+ID4gLS0tIGEvc291 bmQvc29jL2ZzbC9pbXgtcGNtLWRtYS5jCj4gPiA+ID4gPiArKysgYi9zb3VuZC9zb2MvZnNsL2lt eC1wY20tZG1hLmMKPiA+ID4gPiA+IEBAIC0xMSw2ICsxMSw3IEBACj4gPiA+ID4gPiDCoCNpbmNs dWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KPiA+ID4gPiA+IMKgI2luY2x1ZGUgPGxpbnV4L3R5cGVz Lmg+Cj4gPiA+ID4gPiDCoCNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiA+ID4gPiA+ICsjaW5j bHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KPiA+ID4gPiA+IAo+ID4gPiA+ID4gwqAjaW5jbHVk ZSA8c291bmQvY29yZS5oPgo+ID4gPiA+ID4gwqAjaW5jbHVkZSA8c291bmQvcGNtLmg+Cj4gPiA+ ID4gPiBAQCAtMjksMjQgKzMwLDE2OCBAQCBzdGF0aWMgYm9vbCBmaWx0ZXIoc3RydWN0IGRtYV9j aGFuICpjaGFuLCB2b2lkCj4gPiAqcGFyYW0pCj4gPiA+ID4gPiDCoMKgwqDCoMKgwqByZXR1cm4g dHJ1ZTsKPiA+ID4gPiA+IMKgfQo+ID4gPiA+ID4gCj4gPiA+ID4gPiAtc3RhdGljIGNvbnN0IHN0 cnVjdCBzbmRfZG1hZW5naW5lX3BjbV9jb25maWcKPiA+IGlteF9kbWFlbmdpbmVfcGNtX2NvbmZp ZyA9IHsKPiA+ID4gPiA+IC0gICAgIC5wcmVwYXJlX3NsYXZlX2NvbmZpZyA9Cj4gPiBzbmRfZG1h ZW5naW5lX3BjbV9wcmVwYXJlX3NsYXZlX2NvbmZpZywKPiA+ID4gPiA+IC0gICAgIC5jb21wYXRf ZmlsdGVyX2ZuID0gZmlsdGVyLAo+ID4gPiA+ID4gLX07Cj4gPiA+ID4gPiArc3RhdGljIGludCBp bXhfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQKPiA+ICpjb21wb25lbnQs Cj4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJz dHJlYW0gKnN1YnN0cmVhbSwKPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIHN0 cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKSB7Cj4gPiA+ID4gPiArICAgICBzdHJ1Y3Qg c25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwo+ID4gPiA+ID4g KyAgICAgc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0 ZV9kYXRhOwo+ID4gPiA+ID4gKyAgICAgc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gYXNv Y19ydGRfdG9fY3B1KHJ0ZCwgMCk7Cj4gPiA+ID4gPiArICAgICBzdHJ1Y3Qgc25kX2RtYWVuZ2lu ZV9kYWlfZG1hX2RhdGEgKmRtYV9kYXRhOwo+ID4gPiA+ID4gKyAgICAgc3RydWN0IGRtYV9zbGF2 ZV9jb25maWcgY29uZmlnOwo+ID4gPiA+ID4gKyAgICAgc3RydWN0IGRtYV9jaGFuICpjaGFuOwo+ ID4gPiA+ID4gKyAgICAgaW50IHJldCA9IDA7Cj4gPiA+ID4gPiAKPiA+ID4gPiA+IC1pbnQgaW14 X3BjbV9kbWFfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzaXplX3Qgc2l6ZSkK PiA+ID4gPiA+ICsgICAgIHNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwKPiA+ ICZzdWJzdHJlYW0tPmRtYV9idWZmZXIpOwo+ID4gPiA+ID4gKyAgICAgcnVudGltZS0+ZG1hX2J5 dGVzID0gcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4g KyAgICAgY2hhbiA9IHNuZF9kbWFlbmdpbmVfcGNtX2dldF9jaGFuKHN1YnN0cmVhbSk7Cj4gPiA+ ID4gPiArICAgICBpZiAoIWNoYW4pCj4gPiA+ID4gPiArICAgICAgICAgICAgIHJldHVybiAtRUlO VkFMOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gKyAgICAgcmV0ID0gc25kX2h3cGFyYW1zX3RvX2Rt YV9zbGF2ZV9jb25maWcoc3Vic3RyZWFtLCBwYXJhbXMsCj4gPiAmY29uZmlnKTsKPiA+ID4gPiA+ ICsgICAgIGlmIChyZXQpCj4gPiA+ID4gPiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiA+ ID4gPiArCj4gPiA+ID4gPiArICAgICBkbWFfZGF0YSA9IHNuZF9zb2NfZGFpX2dldF9kbWFfZGF0 YShjcHVfZGFpLCBzdWJzdHJlYW0pOwo+ID4gPiA+ID4gKyAgICAgaWYgKCFkbWFfZGF0YSkKPiA+ ID4gPiA+ICsgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gPiA+ID4gPiArCj4gPiA+ID4g PiArICAgICBzbmRfZG1hZW5naW5lX3BjbV9zZXRfY29uZmlnX2Zyb21fZGFpX2RhdGEoc3Vic3Ry ZWFtLAo+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGRtYV9kYXRhLAo+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICZjb25maWcpOwo+ID4gPiA+ID4gKyAgICAgcmV0dXJuIGRtYWVu Z2luZV9zbGF2ZV9jb25maWcoY2hhbiwgJmNvbmZpZyk7IH0KPiA+ID4gPiA+ICsKPiA+ID4gPiA+ ICtzdGF0aWMgaW50IGlteF9wY21faHdfZnJlZShzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNv bXBvbmVudCwKPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25kX3Bj bV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKPiA+ID4gPiA+IMKgewo+ID4gPiA+ID4gLSAgICAgc3Ry dWN0IHNuZF9kbWFlbmdpbmVfcGNtX2NvbmZpZyAqY29uZmlnOwo+ID4gPiA+ID4gKyAgICAgc25k X3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCBOVUxMKTsKPiA+ID4gPiA+ICsgICAg IHJldHVybiAwOwo+ID4gPiA+ID4gK30KPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICtzdGF0aWMgc25k X3BjbV91ZnJhbWVzX3QgaW14X3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudAo+ ID4gKmNvbXBvbmVudCwKPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbQo+ID4gPiA+ID4gKypzdWJzdHJlYW0pIHsK PiA+ID4gPiA+ICsgICAgIHJldHVybiBzbmRfZG1hZW5naW5lX3BjbV9wb2ludGVyKHN1YnN0cmVh bSk7Cj4gPiA+ID4gPiArfQo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gK3N0YXRpYyBpbnQgaW14X3Bj bV90cmlnZ2VyKHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50LAo+ID4gPiA+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3Ry ZWFtLCBpbnQKPiA+ID4gPiA+ICtjbWQpIHsKPiA+ID4gPiA+ICsgICAgIHJldHVybiBzbmRfZG1h ZW5naW5lX3BjbV90cmlnZ2VyKHN1YnN0cmVhbSwgY21kKTsgfQo+ID4gPiA+ID4gKwo+ID4gPiA+ ID4gK3N0YXRpYyBpbnQgaW14X3BjbV9vcGVuKHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29t cG9uZW50LAo+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbmRfcGNtX3N1 YnN0cmVhbSAqc3Vic3RyZWFtKSB7Cj4gPiA+ID4gPiArICAgICBzdHJ1Y3Qgc25kX3NvY19wY21f cnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Cj4gPiA+ID4gPiArICAgICBi b29sIHR4ID0gc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsK PiA+ID4gPiA+ICsgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IGFzb2NfcnRkX3Rv X2NwdShydGQsIDApOwo+ID4gPiA+ID4gKyAgICAgc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2Rt YV9kYXRhICpkbWFfZGF0YTsKPiA+ID4gPiA+ICsgICAgIHN0cnVjdCBkZXZpY2UgKmRldiA9IGNv bXBvbmVudC0+ZGV2Owo+ID4gPiA+ID4gKyAgICAgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgaHc7 Cj4gPiA+ID4gPiArICAgICBzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47Cj4gPiA+ID4gPiArICAgICBp bnQgcmV0Owo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gKyAgICAgcmV0ID0gc25kX3BjbV9od19jb25z dHJhaW50X2ludGVnZXIoc3Vic3RyZWFtLT5ydW50aW1lLAo+ID4gPiA+ID4gKwo+ID4gU05EUlZf UENNX0hXX1BBUkFNX1BFUklPRFMpOwo+ID4gPiA+ID4gKyAgICAgaWYgKHJldCA8IDApIHsKPiA+ ID4gPiA+ICsgICAgICAgICAgICAgZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2V0IHBjbSBodyBw YXJhbXMgcGVyaW9kc1xuIik7Cj4gPiA+ID4gPiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4g PiA+ID4gPiArICAgICB9Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArICAgICBkbWFfZGF0YSA9IHNu ZF9zb2NfZGFpX2dldF9kbWFfZGF0YShjcHVfZGFpLCBzdWJzdHJlYW0pOwo+ID4gPiA+ID4gKyAg ICAgaWYgKCFkbWFfZGF0YSkKPiA+ID4gPiA+ICsgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7 Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArICAgICBjaGFuID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hh bm5lbChjcHVfZGFpLT5kZXYsIHR4ID8gInR4IiA6ICJyeCIpOwo+ID4gPiA+ID4gKyAgICAgaWYg KCFjaGFuKSB7Cj4gPiA+ID4gPiArICAgICAgICAgICAgIC8qIFRyeSB0byByZXF1ZXN0IGNoYW5u ZWwgdXNpbmcgY29tcGF0X2ZpbHRlcl9mbiAqLwo+ID4gPiA+ID4gKyAgICAgICAgICAgICBjaGFu ID0gc25kX2RtYWVuZ2luZV9wY21fcmVxdWVzdF9jaGFubmVsKGZpbHRlciwKPiA+ID4gPiA+ICsK PiA+IGRtYV9kYXRhLT5maWx0ZXJfZGF0YSk7Cj4gPiA+ID4gPiArICAgICAgICAgICAgIGlmICgh Y2hhbikKPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOWElPOwo+ID4g PiA+ID4gKyAgICAgfQo+ID4gPiA+ID4gCj4gPiA+ID4gPiAtICAgICBjb25maWcgPSBkZXZtX2t6 YWxsb2MoJnBkZXYtPmRldiwKPiA+ID4gPiA+IC0gICAgICAgICAgICAgICAgICAgICBzaXplb2Yo c3RydWN0IHNuZF9kbWFlbmdpbmVfcGNtX2NvbmZpZyksCj4gPiBHRlBfS0VSTkVMKTsKPiA+ID4g PiA+IC0gICAgIGlmICghY29uZmlnKQo+ID4gPiA+ID4gLSAgICAgICAgICAgICByZXR1cm4gLUVO T01FTTsKPiA+ID4gPiA+IC0gICAgICpjb25maWcgPSBpbXhfZG1hZW5naW5lX3BjbV9jb25maWc7 Cj4gPiA+ID4gPiArICAgICByZXQgPSBzbmRfZG1hZW5naW5lX3BjbV9vcGVuKHN1YnN0cmVhbSwg Y2hhbik7Cj4gPiA+ID4gPiArICAgICBpZiAocmV0KQo+ID4gPiA+ID4gKyAgICAgICAgICAgICBn b3RvIHBjbV9vcGVuX2ZhaWw7Cj4gPiA+ID4gPiAKPiA+ID4gPiA+IC0gICAgIHJldHVybiBkZXZt X3NuZF9kbWFlbmdpbmVfcGNtX3JlZ2lzdGVyKCZwZGV2LT5kZXYsCj4gPiA+ID4gPiAtICAgICAg ICAgICAgIGNvbmZpZywKPiA+ID4gPiA+IC0gICAgICAgICAgICAgU05EX0RNQUVOR0lORV9QQ01f RkxBR19DT01QQVQpOwo+ID4gPiA+ID4gKyAgICAgbWVtc2V0KCZodywgMCwgc2l6ZW9mKGh3KSk7 Cj4gPiA+ID4gPiArICAgICBody5pbmZvID0gU05EUlZfUENNX0lORk9fTU1BUCB8Cj4gPiBTTkRS Vl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICBT TkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRDsKPiA+ID4gPiA+ICsgICAgIGh3LnBlcmlvZHNfbWlu ID0gMjsKPiA+ID4gPiA+ICsgICAgIGh3LnBlcmlvZHNfbWF4ID0gVUlOVF9NQVg7Cj4gPiA+ID4g PiArICAgICBody5wZXJpb2RfYnl0ZXNfbWluID0gMjU2Owo+ID4gPiA+ID4gKyAgICAgaHcucGVy aW9kX2J5dGVzX21heCA9Cj4gPiBkbWFfZ2V0X21heF9zZWdfc2l6ZShjaGFuLT5kZXZpY2UtPmRl dik7Cj4gPiA+ID4gPiArICAgICBody5idWZmZXJfYnl0ZXNfbWF4ID0gSU1YX0RFRkFVTFRfRE1B QlVGX1NJWkU7Cj4gPiA+ID4gPiArICAgICBody5maWZvX3NpemUgPSBkbWFfZGF0YS0+Zmlmb19z aXplOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gKyAgICAgLyogUmVmaW5lIHRoZSBodyBhY2NvcmRp bmcgdG8gY2FwcyBvZiBETUEuICovCj4gPiA+ID4gPiArICAgICByZXQgPSBzbmRfZG1hZW5naW5l X3BjbV9yZWZpbmVfcnVudGltZV9od3BhcmFtcyhzdWJzdHJlYW0sCj4gPiA+ID4gPiArCj4gPiBk bWFfZGF0YSwKPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICZodywKPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4pOwo+ID4gPiA+ID4gKyAgICAgaWYgKHJl dCA8IDApCj4gPiA+ID4gPiArICAgICAgICAgICAgIGdvdG8gcmVmaW5lX3J1bnRpbWVfaHdwYXJh bXNfZmFpbDsKPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICsgICAgIHNuZF9zb2Nfc2V0X3J1bnRpbWVf aHdwYXJhbXMoc3Vic3RyZWFtLCAmaHcpOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gKyAgICAgLyog U3VwcG9ydCBhbGxvY2F0ZSBtZW1vcnkgZnJvbSBJUkFNICovCj4gPiA+ID4gPiArICAgICByZXQg PSBzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFVl9JUkFNLAo+ID4gPiA+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLT5kZXZpY2UtPmRldiwKPiA+ID4g PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHcuYnVmZmVyX2J5dGVzX21heCwK PiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YnN0cmVhbS0+ZG1h X2J1ZmZlcik7Cj4gPiA+ID4gPiArICAgICBpZiAocmV0IDwgMCkKPiA+ID4gPiA+ICsgICAgICAg ICAgICAgZ290byBhbGxvY19wYWdhc19mYWlsOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gKyAgICAg cmV0dXJuIDA7Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArYWxsb2NfcGFnYXNfZmFpbDoKPiA+ID4g PiA+ICtyZWZpbmVfcnVudGltZV9od3BhcmFtc19mYWlsOgo+ID4gPiA+ID4gKyAgICAgc25kX2Rt YWVuZ2luZV9wY21fY2xvc2Uoc3Vic3RyZWFtKTsKPiA+ID4gPiA+ICtwY21fb3Blbl9mYWlsOgo+ ID4gPiA+ID4gKyAgICAgZG1hX3JlbGVhc2VfY2hhbm5lbChjaGFuKTsKPiA+ID4gPiA+ICsKPiA+ ID4gPiA+ICsgICAgIHJldHVybiByZXQ7Cj4gPiA+ID4gPiArfQo+ID4gPiA+ID4gKwo+ID4gPiA+ ID4gK3N0YXRpYyBpbnQgaW14X3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNv bXBvbmVudCwKPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuZF9wY21f c3Vic3RyZWFtICpzdWJzdHJlYW0pIHsKPiA+ID4gPiA+ICsgICAgIGlmIChzdWJzdHJlYW0pIHsK PiA+ID4gPiA+ICsgICAgICAgICAgICAgc25kX2RtYV9mcmVlX3BhZ2VzKCZzdWJzdHJlYW0tPmRt YV9idWZmZXIpOwo+ID4gPiA+ID4gKyAgICAgICAgICAgICBzdWJzdHJlYW0tPmRtYV9idWZmZXIu YXJlYSA9IE5VTEw7Cj4gPiA+ID4gPiArICAgICAgICAgICAgIHN1YnN0cmVhbS0+ZG1hX2J1ZmZl ci5hZGRyID0gMDsKPiA+ID4gPiA+ICsgICAgIH0KPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICsgICAg IHJldHVybiBzbmRfZG1hZW5naW5lX3BjbV9jbG9zZV9yZWxlYXNlX2NoYW4oc3Vic3RyZWFtKTsK PiA+ID4gPiA+ICt9Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArc3RhdGljIGludCBpbXhfcGNtX25l dyhzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCwKPiA+ID4gPiA+ICsgICAgICAg ICAgICAgICAgICAgIHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpIHsKPiA+ID4gPiA+ ICsgICAgIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7Cj4gPiA+ ID4gPiArCj4gPiA+ID4gPiArICAgICByZXR1cm4gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVu dChjYXJkLT5kZXYsCj4gPiA+ID4gPiArRE1BX0JJVF9NQVNLKDMyKSk7IH0KPiA+ID4gPiA+ICsK PiA+ID4gPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlciBp bXhfcGNtX2NvbXBvbmVudCA9IHsKPiA+ID4gPiA+ICsgICAgIC5uYW1lICAgICAgICAgICA9ICJp bXgtcGNtLWRtYSIsCj4gPiA+ID4gPiArICAgICAucGNtX2NvbnN0cnVjdCAgPSBpbXhfcGNtX25l dywKPiA+ID4gPiA+ICsgICAgIC5vcGVuICAgICAgICAgICA9IGlteF9wY21fb3BlbiwKPiA+ID4g PiA+ICsgICAgIC5jbG9zZSAgICAgICAgICA9IGlteF9wY21fY2xvc2UsCj4gPiA+ID4gPiArICAg ICAuaHdfcGFyYW1zICAgICAgPSBpbXhfcGNtX2h3X3BhcmFtcywKPiA+ID4gPiA+ICsgICAgIC5o d19mcmVlICAgICAgICA9IGlteF9wY21faHdfZnJlZSwKPiA+ID4gPiA+ICsgICAgIC50cmlnZ2Vy ICAgICAgICA9IGlteF9wY21fdHJpZ2dlciwKPiA+ID4gPiA+ICsgICAgIC5wb2ludGVyICAgICAg ICA9IGlteF9wY21fcG9pbnRlciwKPiA+ID4gPiA+ICt9Owo+ID4gPiA+ID4gKwo+ID4gPiA+ID4g K2ludCBpbXhfcGNtX2RtYV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHNpemVf dCBzaXplKSB7Cj4gPiA+ID4gPiArICAgICByZXR1cm4gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2Nv bXBvbmVudCgmcGRldi0+ZGV2LAo+ID4gPiA+ID4gKwo+ID4gJmlteF9wY21fY29tcG9uZW50LAo+ ID4gPiA+ID4gK05VTEwsIDApOwo+ID4gPiA+ID4gwqB9Cj4gPiA+ID4gPiDCoEVYUE9SVF9TWU1C T0xfR1BMKGlteF9wY21fZG1hX2luaXQpOwo+ID4gPiA+ID4gCj4gCgoKCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGlu ZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMu aW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK 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=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS 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 79FE1C433B4 for ; Wed, 14 Apr 2021 15:33:28 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3A32D6112F for ; Wed, 14 Apr 2021 15:33:28 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3A32D6112F Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id A807989F53; Wed, 14 Apr 2021 15:33:27 +0000 (UTC) Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by gabe.freedesktop.org (Postfix) with ESMTPS id D84E589F53 for ; Wed, 14 Apr 2021 15:33:25 +0000 (UTC) Received: from gallifrey.ext.pengutronix.de ([2001:67c:670:201:5054:ff:fe8d:eefb] helo=[IPv6:::1]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lWhVq-0004Hr-0V; Wed, 14 Apr 2021 17:33:06 +0200 Message-ID: <50ef17a2d57b022c48bbca71fd4e074cc3ca9be5.camel@pengutronix.de> Subject: Re: [PATCH] ASoC: fsl: imx-pcm-dma: Don't request dma channel in probe From: Lucas Stach To: Robin Gong , Shengjiu Wang Date: Wed, 14 Apr 2021 17:33:03 +0200 In-Reply-To: References: <1589881301-4143-1-git-send-email-shengjiu.wang@nxp.com> <0866cd8cdb0c22f0b2a6814c4dafa29202aad5f3.camel@pengutronix.de> <53258cd99caaf1199036737f8fad6cc097939567.camel@pengutronix.de> User-Agent: Evolution 3.38.4 (3.38.4-1.fc33) MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2001:67c:670:201:5054:ff:fe8d:eefb X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: dri-devel@lists.freedesktop.org X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nicolin Chen , Linux-ALSA , Liam Girdwood , "s.hauer@pengutronix.de" , Timur Tabi , Xiubo Li , "shawnguo@kernel.org" , "S.j. Wang" , linux-kernel , "dri-devel@lists.freedesktop.org" , Takashi Iwai , "linaro-mm-sig@lists.linaro.org" , Mark Brown , dl-linux-imx , "kernel@pengutronix.de" , "perex@perex.cz" , "linuxppc-dev@lists.ozlabs.org" , "linux-arm-kernel@lists.infradead.org" , "linux-media@vger.kernel.org" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" SGkgUm9iaW4sCgpBbSBNaXR0d29jaCwgZGVtIDE0LjA0LjIwMjEgdW0gMTQ6MzMgKzAwMDAgc2No cmllYiBSb2JpbiBHb25nOgo+IE9uIDIwMjAvMDUvMjAgMTc6NDMgTHVjYXMgU3RhY2ggPGwuc3Rh Y2hAcGVuZ3V0cm9uaXguZGU+IHdyb3RlOgo+ID4gQW0gTWl0dHdvY2gsIGRlbiAyMC4wNS4yMDIw LCAxNjoyMCArMDgwMCBzY2hyaWViIFNoZW5naml1IFdhbmc6Cj4gPiA+IEhpCj4gPiA+IAo+ID4g PiBPbiBUdWUsIE1heSAxOSwgMjAyMCBhdCA2OjA0IFBNIEx1Y2FzIFN0YWNoIDxsLnN0YWNoQHBl bmd1dHJvbml4LmRlPgo+ID4gd3JvdGU6Cj4gPiA+ID4gQW0gRGllbnN0YWcsIGRlbiAxOS4wNS4y MDIwLCAxNzo0MSArMDgwMCBzY2hyaWViIFNoZW5naml1IFdhbmc6Cj4gPiA+ID4gPiBUaGVyZSBh cmUgdHdvIHJlcXVpcmVtZW50cyB0aGF0IHdlIG5lZWQgdG8gbW92ZSB0aGUgcmVxdWVzdCBvZiBk bWEKPiA+ID4gPiA+IGNoYW5uZWwgZnJvbSBwcm9iZSB0byBvcGVuLgo+ID4gPiA+IAo+ID4gPiA+ IEhvdyBkbyB5b3UgaGFuZGxlIC1FUFJPQkVfREVGRVIgcmV0dXJuIGNvZGUgZnJvbSB0aGUgY2hh bm5lbCByZXF1ZXN0Cj4gPiA+ID4gaWYgeW91IGRvbid0IGRvIGl0IGluIHByb2JlPwo+ID4gPiAK PiA+ID4gSSB1c2UgdGhlIGRtYV9yZXF1ZXN0X3NsYXZlX2NoYW5uZWwgb3IgZG1hX3JlcXVlc3Rf Y2hhbm5lbCBpbnN0ZWFkIG9mCj4gPiA+IGRtYWVuZ2luZV9wY21fcmVxdWVzdF9jaGFuX29mLiBz byB0aGVyZSBzaG91bGQgYmUgbm90IC1FUFJPQkVfREVGRVIKPiA+ID4gcmV0dXJuIGNvZGUuCj4g PiAKPiA+IFRoaXMgaXMgYSBwcmV0dHkgd2VhayBhcmd1bWVudC4gVGhlIGRtYWVuZ2luZSBkZXZp Y2UgbWlnaHQgcHJvYmUgYWZ0ZXIgeW91Cj4gPiB0cnkgdG8gZ2V0IHRoZSBjaGFubmVsLiBVc2lu ZyBhIGZ1bmN0aW9uIHRvIHJlcXVlc3QgdGhlIGNoYW5uZWwgdGhhdCBkb2Vzbid0Cj4gPiBhbGxv dyB5b3UgdG8gaGFuZGxlIHByb2JlIGRlZmVycmFsIGlzIElNSE8gYSBidWcgYW5kIHNob3VsZCBi ZSBmaXhlZCwgaW5zdGVhZAo+ID4gb2YgYnVpbGRpbmcgZXZlbiBtb3JlIGFzc3VtcHRpb25zIG9u IHRvcCBvZiBpdC4KPiA+IAo+ID4gPiA+ID4gLSBXaGVuIGRtYSBkZXZpY2UgYmluZHMgd2l0aCBw b3dlci1kb21haW5zLCB0aGUgcG93ZXIgd2lsbCBiZQo+ID4gPiA+ID4gZW5hYmxlZCB3aGVuIHdl IHJlcXVlc3QgZG1hIGNoYW5uZWwuIElmIHRoZSByZXF1ZXN0IG9mIGRtYSBjaGFubmVsCj4gPiA+ ID4gPiBoYXBwZW4gb24gcHJvYmUsIHRoZW4gdGhlIHBvd2VyLWRvbWFpbnMgd2lsbCBiZSBhbHdh eXMgZW5hYmxlZAo+ID4gPiA+ID4gYWZ0ZXIga2VybmVsIGJvb3QgdXAsICB3aGljaCBpcyBub3Qg Z29vZCBmb3IgcG93ZXIgc2F2aW5nLCAgc28gd2UKPiA+ID4gPiA+IG5lZWQgdG8gbW92ZSB0aGUg cmVxdWVzdCBvZiBkbWEgY2hhbm5lbCB0byAub3BlbigpOwo+ID4gPiA+IAo+ID4gPiA+IFRoaXMg aXMgY2VydGFpbmx5IHNvbWV0aGluZyB3aGljaCBjb3VsZCBiZSBmaXhlZCBpbiB0aGUgZG1hZW5n aW5lCj4gPiA+ID4gZHJpdmVyLgo+ID4gPiAKPiA+ID4gRG1hIGRyaXZlciBhbHdheXMgY2FsbCB0 aGUgcG1fcnVudGltZV9nZXRfc3luYyBpbgo+ID4gPiBkZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJj ZXMsIHRoZSBkZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMgaXMgY2FsbGVkCj4gPiA+IHdoZW4g Y2hhbm5lbCBpcyByZXF1ZXN0ZWQuIHNvIHBvd2VyIGlzIGVuYWJsZWQgb24gY2hhbm5lbCByZXF1 ZXN0Lgo+ID4gCj4gPiBTbyB3aHkgY2FuJ3QgeW91IGZpeCB0aGUgZG1hZW5naW5lIGRyaXZlciB0 byBkbyB0aGF0IFJQTSBjYWxsIGF0IGEgbGF0ZXIgdGltZQo+ID4gd2hlbiB0aGUgY2hhbm5lbCBp cyBhY3R1YWxseSBnb2luZyB0byBiZSB1c2VkPyBUaGlzIHdpbGwgYWxsb3cgZnVydGhlciBwb3dl cgo+ID4gc2F2aW5ncyB3aXRoIG90aGVyIHNsYXZlIGRldmljZXMgdGhhbiB0aGUgYXVkaW8gUENN Lgo+IEhpIEx1Y2FzLAo+IMKgwqBUaGFua3MgZm9yIHlvdXIgc3VnZ2VzdGlvbi4gSSBoYXZlIHRy aWVkIHRvIGltcGxlbWVudCBydW50aW1lIGF1dG9zdXNwZW5kIGluCj4gZnNsLWVkbWEgZHJpdmVy IG9uIGkubXg4cW0vcXhwIHdpdGggZGVsYXkgdGltZSAoMiBzZWMpIGZvciB0aGlzIGZlYXR1cmUg YXMgYmVsb3cKPiAob3IgeW91IGNhbiByZWZlciB0byBkcml2ZXJzL2RtYS9xY29tL2hpZG1hLmMp LCBhbmQgcG1fcnVudGltZV9nZXRfc3luYy8KPiBwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZCBp biBhbGwgZG1hZW5naW5lIGRyaXZlciBpbnRlcmZhY2UgbGlrZQo+IGRldmljZV9hbGxvY19jaGFu X3Jlc291cmNlcy9kZXZpY2VfcHJlcF9zbGF2ZV9zZy9kZXZpY2VfcHJlcF9kbWFfY3ljbGljLwo+ IGRldmljZV90eF9zdGF0dXMuLi4KPiAKPiAKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKGZzbF9jaGFuLT5kZXYpOwo+IMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXko ZnNsX2NoYW4tPmRldiwgMjAwMCk7Cj4gCj4gVGhhdCBjb3VsZCByZXNvbHZlIHRoaXMgYXVkaW8g Y2FzZSBzaW5jZSB0aGUgYXV0b3N1c3BlbmQgY291bGQgc3VzcGVuZCBydW50aW1lIGFmdGVyCj4g MiBzZWNvbmRzIGlmIHRoZXJlIGlzIG5vIGZ1cnRoZXIgZG1hIHRyYW5zZmVyIGJ1dCBvbmx5IGNo YW5uZWwgcmVxdWVzdChkZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMpLgo+IEJ1dCB1bmZvcnR1 bmF0ZWx5LCBpdCBjYXVzZSBhbm90aGVyIGlzc3VlLiBBcyB5b3Uga25vdywgb24gb3VyIGkubXg4 cW0vcXhwLCAKPiBwb3dlciBkb21haW4gZG9uZSBieSBzY2Z3IChkcml2ZXJzL2Zpcm13YXJlL2lt eC9zY3UtcGQuYykgb3ZlciBtYWlsYm94Ogo+IMKgaW14X3NjX3BkX3Bvd2VyKCktPmlteF9zY3Vf Y2FsbF9ycGMoKS0+IGlteF9zY3VfaXBjX3dyaXRlKCktPm1ib3hfc2VuZF9tZXNzYWdlKCkKPiB3 aGljaCBtZWFucyBoYXZlIHRvICd3YWl0cyBmb3IgY29tcGxldGlvbicsIG1lYW53aGlsZSwgc29t ZSBkcml2ZXIgbGlrZSB0dHkgd2lsbCBjYWxsIGRtYWVuZ2luZQo+IGludGVyZmFjZXMgaW4gbm9u LWF0b21pYyBjYXNlIGFzIGJlbG93LCAKPiAKPiBzdGF0aWMgaW50IHVhcnRfd3JpdGUoc3RydWN0 IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCj4g ewo+IMKgwqDCoC4uLi4uLi4KPiAJICAgIHBvcnQgPSB1YXJ0X3BvcnRfbG9jayhzdGF0ZSwgZmxh Z3MpOwo+IMKgwqDCoC4uLi4uLgo+IMKgwqDCoMKgwqDCoMKgwqBfX3VhcnRfc3RhcnQodHR5KTsg IC8vY2FsbCBzdGFydF90eCgpLT5kbWFlbmdpbmVfcHJlcF9zbGF2ZV9zZy4uLgo+IMKgwqDCoMKg wqDCoMKgwqB1YXJ0X3BvcnRfdW5sb2NrKHBvcnQsIGZsYWdzKTsKPiDCoMKgwqDCoMKgwqDCoMKg cmV0dXJuIHJldDsKPiB9Cj4gCj4gVGh1cyBkbWEgcnVudGltZSByZXN1bWUgbWF5IGhhcHBlbiBp biB0aGF0IHRpbWluZyB3aW5kb3cgYW5kIGNhdXNlIGtlcm5lbCBhbGFybS4gCj4gSSdtIG5vdCBz dXJlIHdoZXRoZXIgdGhlcmUgYXJlIHNpbWlsYXIgbGltaXRhdGlvbnMgb24gb3RoZXIgZHJpdmVy IHN1YnN5c3RlbS4gQnV0IGZvciBtZSwKPiBJdCBsb29rcyBsaWtlIHRoZSBvbmx5IHdheSB0byBy ZXNvbHZlIHRoZSBjb250cmFkaWN0aW9uIGJldHdlZW4gdHR5IGFuZCBzY3UtcGQgKGhhcmR3YXJl Cj4gbGltaXRhdGlvbiBvbiBpLm14OHFtL3F4cCkgaXMgdG8gZ2l2ZSB1cCBhdXRvc3VzcGVuZCBh bmQga2VlcCBwbV9ydW50aW1lX2dldF9zeW5jCj4gb25seSBpbiBkZXZpY2VfYWxsb2NfY2hhbl9y ZXNvdXJjZXMgYmVjYXVzZSByZXF1ZXN0IGNoYW5uZWwgaXMgYSBzYWZlIG5vbi1hdG9taWMgcGhh c2UuIAo+IERvIHlvdSBoYXZlIGFueSBpZGVhPyBUaGFua3MgaW4gYWR2YW5jZS4gCgpJZiB5b3Ug bG9vayBjbG9zZWx5IGF0IHRoZSBkcml2ZXIgeW91IHVzZWQgYXMgYW4gZXhhbXBsZSAoaGlkbWEu YykgaXQKbG9va3MgbGlrZSB0aGVyZSBpcyBhbHJlYWR5IHNvbWV0aGluZyBpbiB0aGVyZSwgd2hp Y2ggbG9va3MgdmVyeSBtdWNoCmxpa2Ugd2hhdCB5b3UgbmVlZCBoZXJlOgoKSW4gaGlkbWFfaXNz dWVfcGVuZGluZygpIHRoZSBkcml2ZXIgdHJpZXMgdG8gZ2V0IHRoZSBkZXZpY2UgdG8gcnVudGlt ZQpyZXN1bWUuIElmIHRoaXMgZG9lc24ndCB3b3JrLCBtYXliZSBkdWUgdG8gdGhlIHBvd2VyIGRv bWFpbiBjb2RlIG5vdApiZWluZyBhYmxlIHRvIGJlIGNhbGxlZCBpbiBhdG9taWMgY29udGV4dCwg dGhlIGFjdHVhbCB3b3JrIG9mIHdha2luZyB1cAp0aGUgZG1hIGhhcmR3YXJlIGFuZCBpc3N1aW5n IHRoZSBkZXNjcmlwdG9yIGlzIHNodW50ZWQgdG8gYSB0YXNrbGV0LgoKSWYgSSdtIHJlYWRpbmcg dGhpcyByaWdodCwgdGhpcyBpcyBleGFjdGx5IHdoYXQgeW91IG5lZWQgaGVyZSB0byBiZQphYmxl IHRvIGNhbGwgdGhlIGRtYWVuZ2luZSBjb2RlIGZyb20gYXRvbWljIGNvbnRleHQ6IHRyeSB0aGUg cnBtIGdldAphbmQgaXNzdWUgaW1tZWRpYXRlbHkgd2hlbiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHNo dW50IHRoZSB3b3JrIHRvIGEgbm9uLQphdG9taWMgY29udGV4dCB3aGVyZSB5b3UgY2FuIGRlYWwg d2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mIHNjdS1wZC4KCkFsc28geW91IGRvbid0IG5lZWQgdGhl IHJ1bnRpbWUgcmVzdW1lIGluIGFsbCBvZiB0aGUgZnVuY3Rpb25zIHlvdQptZW50aW9uZWQuIEZy b20gYSBxdWljayBsb29rIGludG8gdGhlIGVkbWEgZHJpdmVyIGl0IGxvb2tzIGxpa2UgZm9yCmV4 YW1wbGUgdGhlIHByZXBfc2xhdmVfZG1hKCkgZnVuY3Rpb24gb25seSB0b3VjaGVzIGRhdGEgc3Ry dWN0dXJlcyBpbgptZW1vcnksIHNvIHlvdSBkb24ndCBhY3R1YWxseSBuZWVkIHRoZSBkZXZpY2Ug dG8gYmUgYXdha2UgYXQgdGhhdApwb2ludC4gT25seSBsYXRlciBpbiB0aGUgZmxvdyB3aGVuIHlv dSB3cml0ZSByZWdpc3RlcnMgaW4gdGhlIGRtYQpoYXJkd2FyZSBhbmQgYWN0dWFsbHkgaXNzdWUg dGhlIHRyYW5zZmVyIHlvdSBuZWVkIHRvIHdha2UgdGhlIGRldmljZQpmcm9tIHNsZWVwLgoKUmVn YXJkcywKTHVjYXMKCj4gwqDCoAo+IAo+IAo+IAo+IAo+ID4gCj4gPiA+ID4gPiAtIFdpdGggRkUt QkUgY2FzZSwgaWYgdGhlIGRtYSBjaGFubmVsIGlzIHJlcXVlc3RlZCBpbiBwcm9iZSwgdGhlbgo+ ID4gPiA+ID4gdGhlcmUgd2lsbCBiZSBiZWxvdyBpc3N1ZSwgd2hpY2ggaXMgY2F1c2VkIGJ5IHRo YXQgdGhlIGRtYSBjaGFubmVsCj4gPiA+ID4gPiB3aWxsIGJlIHJlcXVlc3RlZCBkdXBsaWNhdGVs eQo+ID4gPiA+IAo+ID4gPiA+IFdoeSBpcyB0aGlzIHJlcXVlc3RlZCBhIHNlY29uZCB0aW1lPyBJ cyB0aGlzIGp1c3Qgc29tZSBtaXNzaW5nCj4gPiA+ID4gY2xlYW51cCBvbiBhIGRlZmVycmVkIHBy b2JlIHBhdGg/Cj4gPiA+IAo+ID4gPiBOb3QgcmVsYXRlIHdpdGggZGVmZXJyZWQgcHJvYmUuICBX aXRoIERNQTEtPkFTUkMtPkRNQTItPkVTQUkgY2FzZSwgdGhlCj4gPiA+IERNQTEtPkFTUkMtPkRN QTIgaXMgaW4gRkUsICBFU0FJIGlzIGluIEJFLiAgV2hlbiBFU0FJIGRydmllciBwcm9iZSwKPiA+ ID4gRE1BMyBjaGFubmVsIGlzIGNyZWF0ZWQgd2l0aCBFU0FJJ3MgImRtYTp0eCIgKERNQTMgY2hh bm5lbAo+ID4gPiBpcyBub3QgdXNlZCBpbiB0aGlzIEZFLUJFIGNhc2UpLiAgICBXaGVuIEZFLUJF IHN0YXJ0dXAsIERNQTIKPiA+ID4gY2hhbm5lbCBpcyBjcmVhdGVkLCBpdCBuZWVkcyB0aGUgRVNB SSdzICJkbWE6dHgiLCBzbyBiZWxvdyB3YXJuaW5nCj4gPiA+IGNvbWVzIG91dC4KPiA+ID4gCj4g PiA+ID4gUmVnYXJkcywKPiA+ID4gPiBMdWNhcwo+ID4gPiA+IAo+ID4gPiA+ID4gWyAgNjM4Ljkw NjI2OF0gc3lzZnM6IGNhbm5vdCBjcmVhdGUgZHVwbGljYXRlIGZpbGVuYW1lCj4gPiAnL2Rldmlj ZXMvc29jMC9zb2MvMjAwMDAwMC5idXMvMjAwMDAwMC5zcGJhLWJ1cy8yMDI0MDAwLmVzYWkvZG1h OnR4Jwo+ID4gPiA+ID4gWyAgNjM4LjkxOTA2MV0gQ1BVOiAxIFBJRDogNjczIENvbW06IGFwbGF5 IE5vdCB0YWludGVkCj4gPiA+ID4gPiA1LjcuMC1yYzEtMTI5NTYtZ2ZjNjRiMjU4NTU5MyAjMjg3 IFsgIDYzOC45MjcxMTNdIEhhcmR3YXJlIG5hbWU6Cj4gPiA+ID4gPiBGcmVlc2NhbGUgaS5NWDYg UXVhZC9EdWFsTGl0ZSAoRGV2aWNlIFRyZWUpIFsgIDYzOC45MzM2OTBdCj4gPiA+ID4gPiBbPGMw MTEwZGQ4Pl0gKHVud2luZF9iYWNrdHJhY2UpIGZyb20gWzxjMDEwYjhlYz5dCj4gPiA+ID4gPiAo c2hvd19zdGFjaysweDEwLzB4MTQpIFsgIDYzOC45NDE0NjRdIFs8YzAxMGI4ZWM+XSAoc2hvd19z dGFjaykKPiA+ID4gPiA+IGZyb20gWzxjMDU1N2ZjMD5dIChkdW1wX3N0YWNrKzB4ZTQvMHgxMTgp IFsgIDYzOC45NDg4MDhdCj4gPiA+ID4gPiBbPGMwNTU3ZmMwPl0gKGR1bXBfc3RhY2spIGZyb20g WzxjMDMyYWViND5dCj4gPiA+ID4gPiAoc3lzZnNfd2Fybl9kdXArMHg1MC8weDY0KSBbICA2Mzgu OTU2NDA2XSBbPGMwMzJhZWI0Pl0KPiA+ID4gPiA+IChzeXNmc193YXJuX2R1cCkgZnJvbSBbPGMw MzJiMWE4Pl0KPiA+ID4gPiA+IChzeXNmc19kb19jcmVhdGVfbGlua19zZCsweGM4LzB4ZDQpCj4g PiA+ID4gPiBbICA2MzguOTY1MTM0XSBbPGMwMzJiMWE4Pl0gKHN5c2ZzX2RvX2NyZWF0ZV9saW5r X3NkKSBmcm9tCj4gPiA+ID4gPiBbPGMwNWRjNjY4Pl0gKGRtYV9yZXF1ZXN0X2NoYW4rMHhiMC8w eDIxMCkgWyAgNjM4Ljk3NDEyMF0KPiA+ID4gPiA+IFs8YzA1ZGM2Njg+XSAoZG1hX3JlcXVlc3Rf Y2hhbikgZnJvbSBbPGMwNWRjN2QwPl0KPiA+ID4gPiA+IChkbWFfcmVxdWVzdF9zbGF2ZV9jaGFu bmVsKzB4OC8weDE0KQo+ID4gPiA+ID4gWyAgNjM4Ljk4MzExMV0gWzxjMDVkYzdkMD5dIChkbWFf cmVxdWVzdF9zbGF2ZV9jaGFubmVsKSBmcm9tCj4gPiA+ID4gPiBbPGMwOWQ1NTQ4Pl0gKGZzbF9h c3JjX2RtYV9od19wYXJhbXMrMHgxZTAvMHg0MzgpCj4gPiA+ID4gPiBbICA2MzguOTkyODgxXSBb PGMwOWQ1NTQ4Pl0gKGZzbF9hc3JjX2RtYV9od19wYXJhbXMpIGZyb20KPiA+ID4gPiA+IFs8YzA5 YzE2NTQ+XSAoc29jX3BjbV9od19wYXJhbXMrMHg0YTAvMHg2YTgpIFsgIDYzOS4wMDE5NTJdCj4g PiA+ID4gPiBbPGMwOWMxNjU0Pl0gKHNvY19wY21faHdfcGFyYW1zKSBmcm9tIFs8YzA5YzM5ZDQ+ XQo+ID4gPiA+ID4gKGRwY21fZmVfZGFpX2h3X3BhcmFtcysweDcwLzB4ZTQpIFsgIDYzOS4wMTA3 NjVdIFs8YzA5YzM5ZDQ+XQo+ID4gPiA+ID4gKGRwY21fZmVfZGFpX2h3X3BhcmFtcykgZnJvbSBb PGMwOTliMjc0Pl0KPiA+ID4gPiA+IChzbmRfcGNtX2h3X3BhcmFtcysweDE1OC8weDQxOCkgWyAg NjM5LjAxOTc1MF0gWzxjMDk5YjI3ND5dCj4gPiA+ID4gPiAoc25kX3BjbV9od19wYXJhbXMpIGZy b20gWzxjMDk5YzVhMD5dCj4gPiAoc25kX3BjbV9pb2N0bCsweDczNC8weDE4M2MpIFsgIDYzOS4w MjgxMjldIFs8YzA5OWM1YTA+XSAoc25kX3BjbV9pb2N0bCkKPiA+IGZyb20gWzxjMDI5ZmY5ND5d IChrc3lzX2lvY3RsKzB4MmFjLzB4Yjk4KSBbICA2MzkuMDM1ODEyXSBbPGMwMjlmZjk0Pl0KPiA+ IChrc3lzX2lvY3RsKSBmcm9tIFs8YzAxMDAwODA+XSAocmV0X2Zhc3Rfc3lzY2FsbCsweDAvMHgy OCkgWyAgNjM5LjA0MzQ5MF0KPiA+IEV4Y2VwdGlvbiBzdGFjaygweGVjNTI5ZmE4IHRvIDB4ZWM1 MjlmZjApCj4gPiA+ID4gPiBbICA2MzkuMDQ4NTY1XSA5ZmEwOiAgICAgICAgICAgICAgICAgICBi ZWU4NDY1MCAwMTMyMTg3MAo+ID4gMDAwMDAwMDQgYzI1YzQxMTEgYmVlODQ2NTAgMDAwMjAwMGYK PiA+ID4gPiA+IFsgIDYzOS4wNTY3NjZdIDlmYzA6IGJlZTg0NjUwIDAxMzIxODcwIDAxMzIxODIw IDAwMDAwMDM2Cj4gPiAwMDAwMWY0MAo+ID4gPiA+ID4gMDAwMDAwMDAgMDAwMmMyZjggMDAwMDAw MDMgWyAgNjM5LjA2NDk2NF0gOWZlMDogYjZmNDgzZmMgYmVlODQ1MWMKPiA+ID4gPiA+IGI2ZWUy NjU1IGI2ZTFkY2Y4IFsgIDYzOS4wNzAzMzldIGZzbC1lc2FpLWRhaSAyMDI0MDAwLmVzYWk6IENh bm5vdAo+ID4gPiA+ID4gY3JlYXRlIERNQSBkbWE6dHggc3ltbGluawo+ID4gPiA+ID4gCj4gPiA+ ID4gPiBTaWduZWQtb2ZmLWJ5OiBTaGVuZ2ppdSBXYW5nIDxzaGVuZ2ppdS53YW5nQG54cC5jb20+ Cj4gPiA+ID4gPiAtLS0KPiA+ID4gPiA+IMKgc291bmQvc29jL2ZzbC9pbXgtcGNtLWRtYS5jIHwg MTczCj4gPiA+ID4gPiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0KPiA+ID4g PiA+IMKgMSBmaWxlIGNoYW5nZWQsIDE1OSBpbnNlcnRpb25zKCspLCAxNCBkZWxldGlvbnMoLSkK PiA+ID4gPiA+IAo+ID4gPiA+ID4gZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvaW14LXBjbS1k bWEuYwo+ID4gPiA+ID4gYi9zb3VuZC9zb2MvZnNsL2lteC1wY20tZG1hLmMgaW5kZXggMDRhOWJj NzQ5MDE2Li5kYWU1M2IzODRkZjQKPiA+ID4gPiA+IDEwMDY0NAo+ID4gPiA+ID4gLS0tIGEvc291 bmQvc29jL2ZzbC9pbXgtcGNtLWRtYS5jCj4gPiA+ID4gPiArKysgYi9zb3VuZC9zb2MvZnNsL2lt eC1wY20tZG1hLmMKPiA+ID4gPiA+IEBAIC0xMSw2ICsxMSw3IEBACj4gPiA+ID4gPiDCoCNpbmNs dWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KPiA+ID4gPiA+IMKgI2luY2x1ZGUgPGxpbnV4L3R5cGVz Lmg+Cj4gPiA+ID4gPiDCoCNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiA+ID4gPiA+ICsjaW5j bHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KPiA+ID4gPiA+IAo+ID4gPiA+ID4gwqAjaW5jbHVk ZSA8c291bmQvY29yZS5oPgo+ID4gPiA+ID4gwqAjaW5jbHVkZSA8c291bmQvcGNtLmg+Cj4gPiA+ ID4gPiBAQCAtMjksMjQgKzMwLDE2OCBAQCBzdGF0aWMgYm9vbCBmaWx0ZXIoc3RydWN0IGRtYV9j aGFuICpjaGFuLCB2b2lkCj4gPiAqcGFyYW0pCj4gPiA+ID4gPiDCoMKgwqDCoMKgwqByZXR1cm4g dHJ1ZTsKPiA+ID4gPiA+IMKgfQo+ID4gPiA+ID4gCj4gPiA+ID4gPiAtc3RhdGljIGNvbnN0IHN0 cnVjdCBzbmRfZG1hZW5naW5lX3BjbV9jb25maWcKPiA+IGlteF9kbWFlbmdpbmVfcGNtX2NvbmZp ZyA9IHsKPiA+ID4gPiA+IC0gICAgIC5wcmVwYXJlX3NsYXZlX2NvbmZpZyA9Cj4gPiBzbmRfZG1h ZW5naW5lX3BjbV9wcmVwYXJlX3NsYXZlX2NvbmZpZywKPiA+ID4gPiA+IC0gICAgIC5jb21wYXRf ZmlsdGVyX2ZuID0gZmlsdGVyLAo+ID4gPiA+ID4gLX07Cj4gPiA+ID4gPiArc3RhdGljIGludCBp bXhfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQKPiA+ICpjb21wb25lbnQs Cj4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJz dHJlYW0gKnN1YnN0cmVhbSwKPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIHN0 cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKSB7Cj4gPiA+ID4gPiArICAgICBzdHJ1Y3Qg c25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwo+ID4gPiA+ID4g KyAgICAgc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0 ZV9kYXRhOwo+ID4gPiA+ID4gKyAgICAgc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gYXNv Y19ydGRfdG9fY3B1KHJ0ZCwgMCk7Cj4gPiA+ID4gPiArICAgICBzdHJ1Y3Qgc25kX2RtYWVuZ2lu ZV9kYWlfZG1hX2RhdGEgKmRtYV9kYXRhOwo+ID4gPiA+ID4gKyAgICAgc3RydWN0IGRtYV9zbGF2 ZV9jb25maWcgY29uZmlnOwo+ID4gPiA+ID4gKyAgICAgc3RydWN0IGRtYV9jaGFuICpjaGFuOwo+ ID4gPiA+ID4gKyAgICAgaW50IHJldCA9IDA7Cj4gPiA+ID4gPiAKPiA+ID4gPiA+IC1pbnQgaW14 X3BjbV9kbWFfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzaXplX3Qgc2l6ZSkK PiA+ID4gPiA+ICsgICAgIHNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwKPiA+ ICZzdWJzdHJlYW0tPmRtYV9idWZmZXIpOwo+ID4gPiA+ID4gKyAgICAgcnVudGltZS0+ZG1hX2J5 dGVzID0gcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4g KyAgICAgY2hhbiA9IHNuZF9kbWFlbmdpbmVfcGNtX2dldF9jaGFuKHN1YnN0cmVhbSk7Cj4gPiA+ ID4gPiArICAgICBpZiAoIWNoYW4pCj4gPiA+ID4gPiArICAgICAgICAgICAgIHJldHVybiAtRUlO VkFMOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gKyAgICAgcmV0ID0gc25kX2h3cGFyYW1zX3RvX2Rt YV9zbGF2ZV9jb25maWcoc3Vic3RyZWFtLCBwYXJhbXMsCj4gPiAmY29uZmlnKTsKPiA+ID4gPiA+ ICsgICAgIGlmIChyZXQpCj4gPiA+ID4gPiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiA+ ID4gPiArCj4gPiA+ID4gPiArICAgICBkbWFfZGF0YSA9IHNuZF9zb2NfZGFpX2dldF9kbWFfZGF0 YShjcHVfZGFpLCBzdWJzdHJlYW0pOwo+ID4gPiA+ID4gKyAgICAgaWYgKCFkbWFfZGF0YSkKPiA+ ID4gPiA+ICsgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gPiA+ID4gPiArCj4gPiA+ID4g PiArICAgICBzbmRfZG1hZW5naW5lX3BjbV9zZXRfY29uZmlnX2Zyb21fZGFpX2RhdGEoc3Vic3Ry ZWFtLAo+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGRtYV9kYXRhLAo+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICZjb25maWcpOwo+ID4gPiA+ID4gKyAgICAgcmV0dXJuIGRtYWVu Z2luZV9zbGF2ZV9jb25maWcoY2hhbiwgJmNvbmZpZyk7IH0KPiA+ID4gPiA+ICsKPiA+ID4gPiA+ ICtzdGF0aWMgaW50IGlteF9wY21faHdfZnJlZShzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNv bXBvbmVudCwKPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25kX3Bj bV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKPiA+ID4gPiA+IMKgewo+ID4gPiA+ID4gLSAgICAgc3Ry dWN0IHNuZF9kbWFlbmdpbmVfcGNtX2NvbmZpZyAqY29uZmlnOwo+ID4gPiA+ID4gKyAgICAgc25k X3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCBOVUxMKTsKPiA+ID4gPiA+ICsgICAg IHJldHVybiAwOwo+ID4gPiA+ID4gK30KPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICtzdGF0aWMgc25k X3BjbV91ZnJhbWVzX3QgaW14X3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudAo+ ID4gKmNvbXBvbmVudCwKPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbQo+ID4gPiA+ID4gKypzdWJzdHJlYW0pIHsK PiA+ID4gPiA+ICsgICAgIHJldHVybiBzbmRfZG1hZW5naW5lX3BjbV9wb2ludGVyKHN1YnN0cmVh bSk7Cj4gPiA+ID4gPiArfQo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gK3N0YXRpYyBpbnQgaW14X3Bj bV90cmlnZ2VyKHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50LAo+ID4gPiA+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3Ry ZWFtLCBpbnQKPiA+ID4gPiA+ICtjbWQpIHsKPiA+ID4gPiA+ICsgICAgIHJldHVybiBzbmRfZG1h ZW5naW5lX3BjbV90cmlnZ2VyKHN1YnN0cmVhbSwgY21kKTsgfQo+ID4gPiA+ID4gKwo+ID4gPiA+ ID4gK3N0YXRpYyBpbnQgaW14X3BjbV9vcGVuKHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29t cG9uZW50LAo+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbmRfcGNtX3N1 YnN0cmVhbSAqc3Vic3RyZWFtKSB7Cj4gPiA+ID4gPiArICAgICBzdHJ1Y3Qgc25kX3NvY19wY21f cnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Cj4gPiA+ID4gPiArICAgICBi b29sIHR4ID0gc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsK PiA+ID4gPiA+ICsgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IGFzb2NfcnRkX3Rv X2NwdShydGQsIDApOwo+ID4gPiA+ID4gKyAgICAgc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2Rt YV9kYXRhICpkbWFfZGF0YTsKPiA+ID4gPiA+ICsgICAgIHN0cnVjdCBkZXZpY2UgKmRldiA9IGNv bXBvbmVudC0+ZGV2Owo+ID4gPiA+ID4gKyAgICAgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgaHc7 Cj4gPiA+ID4gPiArICAgICBzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47Cj4gPiA+ID4gPiArICAgICBp bnQgcmV0Owo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gKyAgICAgcmV0ID0gc25kX3BjbV9od19jb25z dHJhaW50X2ludGVnZXIoc3Vic3RyZWFtLT5ydW50aW1lLAo+ID4gPiA+ID4gKwo+ID4gU05EUlZf UENNX0hXX1BBUkFNX1BFUklPRFMpOwo+ID4gPiA+ID4gKyAgICAgaWYgKHJldCA8IDApIHsKPiA+ ID4gPiA+ICsgICAgICAgICAgICAgZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2V0IHBjbSBodyBw YXJhbXMgcGVyaW9kc1xuIik7Cj4gPiA+ID4gPiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4g PiA+ID4gPiArICAgICB9Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArICAgICBkbWFfZGF0YSA9IHNu ZF9zb2NfZGFpX2dldF9kbWFfZGF0YShjcHVfZGFpLCBzdWJzdHJlYW0pOwo+ID4gPiA+ID4gKyAg ICAgaWYgKCFkbWFfZGF0YSkKPiA+ID4gPiA+ICsgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7 Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArICAgICBjaGFuID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hh bm5lbChjcHVfZGFpLT5kZXYsIHR4ID8gInR4IiA6ICJyeCIpOwo+ID4gPiA+ID4gKyAgICAgaWYg KCFjaGFuKSB7Cj4gPiA+ID4gPiArICAgICAgICAgICAgIC8qIFRyeSB0byByZXF1ZXN0IGNoYW5u ZWwgdXNpbmcgY29tcGF0X2ZpbHRlcl9mbiAqLwo+ID4gPiA+ID4gKyAgICAgICAgICAgICBjaGFu ID0gc25kX2RtYWVuZ2luZV9wY21fcmVxdWVzdF9jaGFubmVsKGZpbHRlciwKPiA+ID4gPiA+ICsK PiA+IGRtYV9kYXRhLT5maWx0ZXJfZGF0YSk7Cj4gPiA+ID4gPiArICAgICAgICAgICAgIGlmICgh Y2hhbikKPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOWElPOwo+ID4g PiA+ID4gKyAgICAgfQo+ID4gPiA+ID4gCj4gPiA+ID4gPiAtICAgICBjb25maWcgPSBkZXZtX2t6 YWxsb2MoJnBkZXYtPmRldiwKPiA+ID4gPiA+IC0gICAgICAgICAgICAgICAgICAgICBzaXplb2Yo c3RydWN0IHNuZF9kbWFlbmdpbmVfcGNtX2NvbmZpZyksCj4gPiBHRlBfS0VSTkVMKTsKPiA+ID4g PiA+IC0gICAgIGlmICghY29uZmlnKQo+ID4gPiA+ID4gLSAgICAgICAgICAgICByZXR1cm4gLUVO T01FTTsKPiA+ID4gPiA+IC0gICAgICpjb25maWcgPSBpbXhfZG1hZW5naW5lX3BjbV9jb25maWc7 Cj4gPiA+ID4gPiArICAgICByZXQgPSBzbmRfZG1hZW5naW5lX3BjbV9vcGVuKHN1YnN0cmVhbSwg Y2hhbik7Cj4gPiA+ID4gPiArICAgICBpZiAocmV0KQo+ID4gPiA+ID4gKyAgICAgICAgICAgICBn b3RvIHBjbV9vcGVuX2ZhaWw7Cj4gPiA+ID4gPiAKPiA+ID4gPiA+IC0gICAgIHJldHVybiBkZXZt X3NuZF9kbWFlbmdpbmVfcGNtX3JlZ2lzdGVyKCZwZGV2LT5kZXYsCj4gPiA+ID4gPiAtICAgICAg ICAgICAgIGNvbmZpZywKPiA+ID4gPiA+IC0gICAgICAgICAgICAgU05EX0RNQUVOR0lORV9QQ01f RkxBR19DT01QQVQpOwo+ID4gPiA+ID4gKyAgICAgbWVtc2V0KCZodywgMCwgc2l6ZW9mKGh3KSk7 Cj4gPiA+ID4gPiArICAgICBody5pbmZvID0gU05EUlZfUENNX0lORk9fTU1BUCB8Cj4gPiBTTkRS Vl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICBT TkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRDsKPiA+ID4gPiA+ICsgICAgIGh3LnBlcmlvZHNfbWlu ID0gMjsKPiA+ID4gPiA+ICsgICAgIGh3LnBlcmlvZHNfbWF4ID0gVUlOVF9NQVg7Cj4gPiA+ID4g PiArICAgICBody5wZXJpb2RfYnl0ZXNfbWluID0gMjU2Owo+ID4gPiA+ID4gKyAgICAgaHcucGVy aW9kX2J5dGVzX21heCA9Cj4gPiBkbWFfZ2V0X21heF9zZWdfc2l6ZShjaGFuLT5kZXZpY2UtPmRl dik7Cj4gPiA+ID4gPiArICAgICBody5idWZmZXJfYnl0ZXNfbWF4ID0gSU1YX0RFRkFVTFRfRE1B QlVGX1NJWkU7Cj4gPiA+ID4gPiArICAgICBody5maWZvX3NpemUgPSBkbWFfZGF0YS0+Zmlmb19z aXplOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gKyAgICAgLyogUmVmaW5lIHRoZSBodyBhY2NvcmRp bmcgdG8gY2FwcyBvZiBETUEuICovCj4gPiA+ID4gPiArICAgICByZXQgPSBzbmRfZG1hZW5naW5l X3BjbV9yZWZpbmVfcnVudGltZV9od3BhcmFtcyhzdWJzdHJlYW0sCj4gPiA+ID4gPiArCj4gPiBk bWFfZGF0YSwKPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICZodywKPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4pOwo+ID4gPiA+ID4gKyAgICAgaWYgKHJl dCA8IDApCj4gPiA+ID4gPiArICAgICAgICAgICAgIGdvdG8gcmVmaW5lX3J1bnRpbWVfaHdwYXJh bXNfZmFpbDsKPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICsgICAgIHNuZF9zb2Nfc2V0X3J1bnRpbWVf aHdwYXJhbXMoc3Vic3RyZWFtLCAmaHcpOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gKyAgICAgLyog U3VwcG9ydCBhbGxvY2F0ZSBtZW1vcnkgZnJvbSBJUkFNICovCj4gPiA+ID4gPiArICAgICByZXQg PSBzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFVl9JUkFNLAo+ID4gPiA+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLT5kZXZpY2UtPmRldiwKPiA+ID4g PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHcuYnVmZmVyX2J5dGVzX21heCwK PiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YnN0cmVhbS0+ZG1h X2J1ZmZlcik7Cj4gPiA+ID4gPiArICAgICBpZiAocmV0IDwgMCkKPiA+ID4gPiA+ICsgICAgICAg ICAgICAgZ290byBhbGxvY19wYWdhc19mYWlsOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gKyAgICAg cmV0dXJuIDA7Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArYWxsb2NfcGFnYXNfZmFpbDoKPiA+ID4g PiA+ICtyZWZpbmVfcnVudGltZV9od3BhcmFtc19mYWlsOgo+ID4gPiA+ID4gKyAgICAgc25kX2Rt YWVuZ2luZV9wY21fY2xvc2Uoc3Vic3RyZWFtKTsKPiA+ID4gPiA+ICtwY21fb3Blbl9mYWlsOgo+ ID4gPiA+ID4gKyAgICAgZG1hX3JlbGVhc2VfY2hhbm5lbChjaGFuKTsKPiA+ID4gPiA+ICsKPiA+ ID4gPiA+ICsgICAgIHJldHVybiByZXQ7Cj4gPiA+ID4gPiArfQo+ID4gPiA+ID4gKwo+ID4gPiA+ ID4gK3N0YXRpYyBpbnQgaW14X3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNv bXBvbmVudCwKPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuZF9wY21f c3Vic3RyZWFtICpzdWJzdHJlYW0pIHsKPiA+ID4gPiA+ICsgICAgIGlmIChzdWJzdHJlYW0pIHsK PiA+ID4gPiA+ICsgICAgICAgICAgICAgc25kX2RtYV9mcmVlX3BhZ2VzKCZzdWJzdHJlYW0tPmRt YV9idWZmZXIpOwo+ID4gPiA+ID4gKyAgICAgICAgICAgICBzdWJzdHJlYW0tPmRtYV9idWZmZXIu YXJlYSA9IE5VTEw7Cj4gPiA+ID4gPiArICAgICAgICAgICAgIHN1YnN0cmVhbS0+ZG1hX2J1ZmZl ci5hZGRyID0gMDsKPiA+ID4gPiA+ICsgICAgIH0KPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICsgICAg IHJldHVybiBzbmRfZG1hZW5naW5lX3BjbV9jbG9zZV9yZWxlYXNlX2NoYW4oc3Vic3RyZWFtKTsK PiA+ID4gPiA+ICt9Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArc3RhdGljIGludCBpbXhfcGNtX25l dyhzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCwKPiA+ID4gPiA+ICsgICAgICAg ICAgICAgICAgICAgIHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpIHsKPiA+ID4gPiA+ ICsgICAgIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7Cj4gPiA+ ID4gPiArCj4gPiA+ID4gPiArICAgICByZXR1cm4gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVu dChjYXJkLT5kZXYsCj4gPiA+ID4gPiArRE1BX0JJVF9NQVNLKDMyKSk7IH0KPiA+ID4gPiA+ICsK PiA+ID4gPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlciBp bXhfcGNtX2NvbXBvbmVudCA9IHsKPiA+ID4gPiA+ICsgICAgIC5uYW1lICAgICAgICAgICA9ICJp bXgtcGNtLWRtYSIsCj4gPiA+ID4gPiArICAgICAucGNtX2NvbnN0cnVjdCAgPSBpbXhfcGNtX25l dywKPiA+ID4gPiA+ICsgICAgIC5vcGVuICAgICAgICAgICA9IGlteF9wY21fb3BlbiwKPiA+ID4g PiA+ICsgICAgIC5jbG9zZSAgICAgICAgICA9IGlteF9wY21fY2xvc2UsCj4gPiA+ID4gPiArICAg ICAuaHdfcGFyYW1zICAgICAgPSBpbXhfcGNtX2h3X3BhcmFtcywKPiA+ID4gPiA+ICsgICAgIC5o d19mcmVlICAgICAgICA9IGlteF9wY21faHdfZnJlZSwKPiA+ID4gPiA+ICsgICAgIC50cmlnZ2Vy ICAgICAgICA9IGlteF9wY21fdHJpZ2dlciwKPiA+ID4gPiA+ICsgICAgIC5wb2ludGVyICAgICAg ICA9IGlteF9wY21fcG9pbnRlciwKPiA+ID4gPiA+ICt9Owo+ID4gPiA+ID4gKwo+ID4gPiA+ID4g K2ludCBpbXhfcGNtX2RtYV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHNpemVf dCBzaXplKSB7Cj4gPiA+ID4gPiArICAgICByZXR1cm4gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2Nv bXBvbmVudCgmcGRldi0+ZGV2LAo+ID4gPiA+ID4gKwo+ID4gJmlteF9wY21fY29tcG9uZW50LAo+ ID4gPiA+ID4gK05VTEwsIDApOwo+ID4gPiA+ID4gwqB9Cj4gPiA+ID4gPiDCoEVYUE9SVF9TWU1C T0xfR1BMKGlteF9wY21fZG1hX2luaXQpOwo+ID4gPiA+ID4gCj4gCgoKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApk cmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Au b3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==