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 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4ED23C433F5 for ; Thu, 14 Oct 2021 06:28:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3354861156 for ; Thu, 14 Oct 2021 06:28:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229746AbhJNGaa (ORCPT ); Thu, 14 Oct 2021 02:30:30 -0400 Received: from mx3.molgen.mpg.de ([141.14.17.11]:35031 "EHLO mx1.molgen.mpg.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S229530AbhJNGa3 (ORCPT ); Thu, 14 Oct 2021 02:30:29 -0400 Received: from [192.168.0.2] (ip5f5ae921.dynamic.kabel-deutschland.de [95.90.233.33]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pmenzel) by mx.molgen.mpg.de (Postfix) with ESMTPSA id 7177361E64760; Thu, 14 Oct 2021 08:28:21 +0200 (CEST) Subject: Re: [PATCH 2/6] media: aspeed: add dprintk for more detailed log control To: Jammy Huang References: <20211014034819.2283-1-jammy_huang@aspeedtech.com> <20211014034819.2283-3-jammy_huang@aspeedtech.com> Cc: eajames@linux.ibm.com, mchehab@kernel.org, joel@jms.id.au, andrew@aj.id.au, linux-media@vger.kernel.org, openbmc@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org, linux-aspeed@lists.ozlabs.org, linux-kernel@vger.kernel.org, Steven Rostedt , Ingo Molnar From: Paul Menzel Message-ID: <5b8f81aa-9d08-dc42-8bd5-e9e7560f37f6@molgen.mpg.de> Date: Thu, 14 Oct 2021 08:28:21 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.14.0 MIME-Version: 1.0 In-Reply-To: <20211014034819.2283-3-jammy_huang@aspeedtech.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org [Cc: +Steven, +Ingo for tracing questions] Dear Jammy, Am 14.10.21 um 05:48 schrieb Jammy Huang: > Add dprintk to categorize the log into NOTICE/INFO/TRACE/IRQ/REG. > The on/off is controlled by module_param, debug. Currently dev_dbg is dynamic debug, which can be controlled using the Linux kernel command line or debugfs already? From your patch: > +MODULE_PARM_DESC(debug, "set debugging level (0=reg,2=irq,4=trace,8=info(|-able))."); What does (|-able) mean? Maybe give some examples in the commit message as documentation? Lastly, instead of parameter name `debug`, I’d use `log_level`, which would be more accurate. Why is more granularity needed/useful, and not just debug and non-debug, where the existing Linux kernel levels `pr_info`, `pr_warn`, … are used? Looking at the amount of log messages, the granularity does not look needed. > Signed-off-by: Jammy Huang > --- > drivers/media/platform/aspeed-video.c | 73 ++++++++++++++++++++++----- > 1 file changed, 60 insertions(+), 13 deletions(-) > > diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c > index 6259cf17a7cc..7b8129b0ca5f 100644 > --- a/drivers/media/platform/aspeed-video.c > +++ b/drivers/media/platform/aspeed-video.c > @@ -31,6 +31,19 @@ > #include > #include > > + > +#define LOG_REG BIT(4) > +#define LOG_DEBUG BIT(3) > +#define LOG_TRACE BIT(2) Could ftrace be used for this? It looks like there are static functions. No idea, if there is already a “native” Linux kernel solution for this. > +#define LOG_INFO BIT(1) > +#define LOG_NOTICE BIT(0) > + > +#define dprintk(level, fmt, arg...) do { \ > + if (debug & level) \ > + pr_debug(pr_fmt("[%s]: " fmt), DEVICE_NAME, ##arg); \ > +} while (0) > + > + > #define DEVICE_NAME "aspeed-video" > > #define ASPEED_VIDEO_JPEG_NUM_QUALITIES 12 > @@ -390,6 +403,8 @@ static const struct v4l2_dv_timings_cap aspeed_video_timings_cap = { > }, > }; > > +static unsigned int debug; > + > static void aspeed_video_init_jpeg_table(u32 *table, bool yuv420) > { > int i; > @@ -437,7 +452,7 @@ static void aspeed_video_update(struct aspeed_video *video, u32 reg, u32 clear, > t &= ~clear; > t |= bits; > writel(t, video->base + reg); > - dev_dbg(video->dev, "update %03x[%08x -> %08x]\n", reg, before, > + dprintk(LOG_REG, "update %03x[%08x -> %08x]\n", reg, before, > readl(video->base + reg)); > } > > @@ -445,14 +460,14 @@ static u32 aspeed_video_read(struct aspeed_video *video, u32 reg) > { > u32 t = readl(video->base + reg); > > - dev_dbg(video->dev, "read %03x[%08x]\n", reg, t); > + dprintk(LOG_REG, "read %03x[%08x]\n", reg, t); > return t; > } > > static void aspeed_video_write(struct aspeed_video *video, u32 reg, u32 val) > { > writel(val, video->base + reg); > - dev_dbg(video->dev, "write %03x[%08x]\n", reg, > + dprintk(LOG_REG, "write %03x[%08x]\n", reg, > readl(video->base + reg)); > } > > @@ -474,13 +489,13 @@ static int aspeed_video_start_frame(struct aspeed_video *video) > u32 seq_ctrl = aspeed_video_read(video, VE_SEQ_CTRL); > > if (video->v4l2_input_status) { > - dev_dbg(video->dev, "No signal; don't start frame\n"); > + dprintk(LOG_NOTICE, "No signal; don't start frame\n"); > return 0; > } > > if (!(seq_ctrl & VE_SEQ_CTRL_COMP_BUSY) || > !(seq_ctrl & VE_SEQ_CTRL_CAP_BUSY)) { > - dev_dbg(video->dev, "Engine busy; don't start frame\n"); > + dprintk(LOG_NOTICE, "Engine busy; don't start frame\n"); > return -EBUSY; > } > > @@ -489,7 +504,7 @@ static int aspeed_video_start_frame(struct aspeed_video *video) > struct aspeed_video_buffer, link); > if (!buf) { > spin_unlock_irqrestore(&video->lock, flags); > - dev_dbg(video->dev, "No buffers; don't start frame\n"); > + dprintk(LOG_NOTICE, "No buffers; don't start frame\n"); > return -EPROTO; > } > > @@ -565,7 +580,7 @@ static void aspeed_video_bufs_done(struct aspeed_video *video, > > static void aspeed_video_irq_res_change(struct aspeed_video *video, ulong delay) > { > - dev_dbg(video->dev, "Resolution changed; resetting\n"); > + dprintk(LOG_INFO, "Resolution changed; resetting\n"); > > set_bit(VIDEO_RES_CHANGE, &video->flags); > clear_bit(VIDEO_FRAME_INPRG, &video->flags); > @@ -590,6 +605,12 @@ static irqreturn_t aspeed_video_irq(int irq, void *arg) > struct aspeed_video *video = arg; > u32 sts = aspeed_video_read(video, VE_INTERRUPT_STATUS); > > + dprintk(LOG_DEBUG, "irq sts=%#x %s%s%s%s\n", sts, > + sts & VE_INTERRUPT_MODE_DETECT_WD ? ", unlock" : "", > + sts & VE_INTERRUPT_MODE_DETECT ? ", lock" : "", > + sts & VE_INTERRUPT_CAPTURE_COMPLETE ? ", capture-done" : "", > + sts & VE_INTERRUPT_COMP_COMPLETE ? ", comp-done" : ""); > + Please split adding new log messages out into a separate commit. > /* > * Resolution changed or signal was lost; reset the engine and > * re-initialize > @@ -766,7 +787,7 @@ static void aspeed_video_calc_compressed_size(struct aspeed_video *video, > aspeed_video_write(video, VE_STREAM_BUF_SIZE, > compression_buffer_size_reg); > > - dev_dbg(video->dev, "Max compressed size: %x\n", > + dprintk(LOG_INFO, "Max compressed size: %#x\n", > video->max_compressed_size); > } > > @@ -804,7 +825,7 @@ static void aspeed_video_get_resolution(struct aspeed_video *video) > res_check(video), > MODE_DETECT_TIMEOUT); > if (!rc) { > - dev_dbg(video->dev, "Timed out; first mode detect\n"); > + dprintk(LOG_INFO, "Timed out; first mode detect\n"); > clear_bit(VIDEO_RES_DETECT, &video->flags); > return; > } > @@ -822,7 +843,7 @@ static void aspeed_video_get_resolution(struct aspeed_video *video) > MODE_DETECT_TIMEOUT); > clear_bit(VIDEO_RES_DETECT, &video->flags); > if (!rc) { > - dev_dbg(video->dev, "Timed out; second mode detect\n"); > + dprintk(LOG_INFO, "Timed out; second mode detect\n"); > return; > } > > @@ -856,7 +877,7 @@ static void aspeed_video_get_resolution(struct aspeed_video *video) > } while (invalid_resolution && (tries++ < INVALID_RESOLUTION_RETRIES)); > > if (invalid_resolution) { > - dev_dbg(video->dev, "Invalid resolution detected\n"); > + dprintk(LOG_NOTICE, "Invalid resolution detected\n"); > return; > } > > @@ -873,7 +894,7 @@ static void aspeed_video_get_resolution(struct aspeed_video *video) > aspeed_video_update(video, VE_SEQ_CTRL, 0, > VE_SEQ_CTRL_AUTO_COMP | VE_SEQ_CTRL_EN_WATCHDOG); > > - dev_dbg(video->dev, "Got resolution: %dx%d\n", det->width, > + dprintk(LOG_INFO, "Got resolution: %dx%d\n", det->width, > det->height); > } > > @@ -907,6 +928,7 @@ static void aspeed_video_set_resolution(struct aspeed_video *video) > > /* Don't use direct mode below 1024 x 768 (irqs don't fire) */ > if (size < DIRECT_FETCH_THRESHOLD) { > + dprintk(LOG_INFO, "Capture: Sync Mode\n"); > aspeed_video_write(video, VE_TGS_0, > FIELD_PREP(VE_TGS_FIRST, > video->frame_left - 1) | > @@ -918,6 +940,7 @@ static void aspeed_video_set_resolution(struct aspeed_video *video) > video->frame_bottom + 1)); > aspeed_video_update(video, VE_CTRL, 0, VE_CTRL_INT_DE); > } else { > + dprintk(LOG_INFO, "Capture: Direct Mode\n"); > aspeed_video_update(video, VE_CTRL, 0, VE_CTRL_DIRECT_FETCH); > } > > @@ -934,6 +957,10 @@ static void aspeed_video_set_resolution(struct aspeed_video *video) > if (!aspeed_video_alloc_buf(video, &video->srcs[1], size)) > goto err_mem; > > + dprintk(LOG_INFO, "src buf0 addr(%#x) size(%d)\n", > + video->srcs[0].dma, video->srcs[0].size); > + dprintk(LOG_INFO, "src buf1 addr(%#x) size(%d)\n", > + video->srcs[1].dma, video->srcs[1].size); > aspeed_video_write(video, VE_SRC0_ADDR, video->srcs[0].dma); > aspeed_video_write(video, VE_SRC1_ADDR, video->srcs[1].dma); > } > @@ -1010,6 +1037,8 @@ static void aspeed_video_start(struct aspeed_video *video) > > static void aspeed_video_stop(struct aspeed_video *video) > { > + dprintk(LOG_TRACE, "%s\n", __func__); > + > set_bit(VIDEO_STOPPED, &video->flags); > cancel_delayed_work_sync(&video->res_work); > > @@ -1198,6 +1227,9 @@ static int aspeed_video_set_dv_timings(struct file *file, void *fh, > > timings->type = V4L2_DV_BT_656_1120; > > + dprintk(LOG_INFO, "set new timings(%dx%d)\n", timings->bt.width, > + timings->bt.height); > + > return 0; > } > > @@ -1362,6 +1394,8 @@ static void aspeed_video_resolution_work(struct work_struct *work) > res_work); > u32 input_status = video->v4l2_input_status; > > + dprintk(LOG_TRACE, "%s+\n", __func__); > + > aspeed_video_on(video); > > /* Exit early in case no clients remain */ > @@ -1380,6 +1414,7 @@ static void aspeed_video_resolution_work(struct work_struct *work) > .u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION, > }; > > + dprintk(LOG_INFO, "fire source change event\n"); > v4l2_event_queue(&video->vdev, &ev); > } else if (test_bit(VIDEO_STREAMING, &video->flags)) { > /* No resolution change so just restart streaming */ > @@ -1389,6 +1424,8 @@ static void aspeed_video_resolution_work(struct work_struct *work) > done: > clear_bit(VIDEO_RES_CHANGE, &video->flags); > wake_up_interruptible_all(&video->wait); > + > + dprintk(LOG_TRACE, "%s-\n", __func__); > } > > static int aspeed_video_open(struct file *file) > @@ -1476,6 +1513,7 @@ static int aspeed_video_start_streaming(struct vb2_queue *q, > int rc; > struct aspeed_video *video = vb2_get_drv_priv(q); > > + dprintk(LOG_TRACE, "%s\n", __func__); > video->sequence = 0; > video->perf.duration_max = 0; > video->perf.duration_min = 0xffffffff; > @@ -1495,13 +1533,15 @@ static void aspeed_video_stop_streaming(struct vb2_queue *q) > int rc; > struct aspeed_video *video = vb2_get_drv_priv(q); > > + dprintk(LOG_TRACE, "%s+\n", __func__); > + > clear_bit(VIDEO_STREAMING, &video->flags); > > rc = wait_event_timeout(video->wait, > !test_bit(VIDEO_FRAME_INPRG, &video->flags), > STOP_TIMEOUT); > if (!rc) { > - dev_dbg(video->dev, "Timed out when stopping streaming\n"); > + dprintk(LOG_NOTICE, "Timed out when stopping streaming\n"); > > /* > * Need to force stop any DMA and try and get HW into a good > @@ -1516,6 +1556,7 @@ static void aspeed_video_stop_streaming(struct vb2_queue *q) > } > > aspeed_video_bufs_done(video, VB2_BUF_STATE_ERROR); > + dprintk(LOG_TRACE, "%s-\n", __func__); > } > > static void aspeed_video_buf_queue(struct vb2_buffer *vb) > @@ -1715,6 +1756,7 @@ static int aspeed_video_init(struct aspeed_video *video) > dev_err(dev, "Unable to request IRQ %d\n", irq); > return rc; > } > + dev_info(video->dev, "irq %d\n", irq); > > video->eclk = devm_clk_get(dev, "eclk"); > if (IS_ERR(video->eclk)) { > @@ -1751,6 +1793,8 @@ static int aspeed_video_init(struct aspeed_video *video) > rc = -ENOMEM; > goto err_release_reserved_mem; > } > + dev_info(video->dev, "alloc mem size(%d) at %#x for jpeg header\n", > + VE_JPEG_HEADER_SIZE, video->jpeg.dma); > > aspeed_video_init_jpeg_table(video->jpeg.virt, video->yuv420); > > @@ -1856,6 +1900,9 @@ static struct platform_driver aspeed_video_driver = { > > module_platform_driver(aspeed_video_driver); > > +module_param(debug, int, 0644); > +MODULE_PARM_DESC(debug, "set debugging level (0=reg,2=irq,4=trace,8=info(|-able))."); > + > MODULE_DESCRIPTION("ASPEED Video Engine Driver"); > MODULE_AUTHOR("Eddie James"); > MODULE_LICENSE("GPL v2"); Kind regards, Paul 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 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 56DFBC433F5 for ; Thu, 14 Oct 2021 06:30:42 +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 AD53261029 for ; Thu, 14 Oct 2021 06:30:41 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org AD53261029 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=molgen.mpg.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.ozlabs.org Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4HVKKD31JXz30HR for ; Thu, 14 Oct 2021 17:30:40 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=molgen.mpg.de (client-ip=141.14.17.11; helo=mx1.molgen.mpg.de; envelope-from=pmenzel@molgen.mpg.de; receiver=) Received: from mx1.molgen.mpg.de (mx3.molgen.mpg.de [141.14.17.11]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4HVKGm1nRLz3dsf; Thu, 14 Oct 2021 17:28:29 +1100 (AEDT) Received: from [192.168.0.2] (ip5f5ae921.dynamic.kabel-deutschland.de [95.90.233.33]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pmenzel) by mx.molgen.mpg.de (Postfix) with ESMTPSA id 7177361E64760; Thu, 14 Oct 2021 08:28:21 +0200 (CEST) Subject: Re: [PATCH 2/6] media: aspeed: add dprintk for more detailed log control To: Jammy Huang References: <20211014034819.2283-1-jammy_huang@aspeedtech.com> <20211014034819.2283-3-jammy_huang@aspeedtech.com> From: Paul Menzel Message-ID: <5b8f81aa-9d08-dc42-8bd5-e9e7560f37f6@molgen.mpg.de> Date: Thu, 14 Oct 2021 08:28:21 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.14.0 MIME-Version: 1.0 In-Reply-To: <20211014034819.2283-3-jammy_huang@aspeedtech.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-BeenThere: openbmc@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development list for OpenBMC List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-aspeed@lists.ozlabs.org, andrew@aj.id.au, openbmc@lists.ozlabs.org, eajames@linux.ibm.com, linux-kernel@vger.kernel.org, Steven Rostedt , Ingo Molnar , mchehab@kernel.org, linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org Errors-To: openbmc-bounces+openbmc=archiver.kernel.org@lists.ozlabs.org Sender: "openbmc" [Cc: +Steven, +Ingo for tracing questions] Dear Jammy, Am 14.10.21 um 05:48 schrieb Jammy Huang: > Add dprintk to categorize the log into NOTICE/INFO/TRACE/IRQ/REG. > The on/off is controlled by module_param, debug. Currently dev_dbg is dynamic debug, which can be controlled using the Linux kernel command line or debugfs already? From your patch: > +MODULE_PARM_DESC(debug, "set debugging level (0=reg,2=irq,4=trace,8=info(|-able))."); What does (|-able) mean? Maybe give some examples in the commit message as documentation? Lastly, instead of parameter name `debug`, I’d use `log_level`, which would be more accurate. Why is more granularity needed/useful, and not just debug and non-debug, where the existing Linux kernel levels `pr_info`, `pr_warn`, … are used? Looking at the amount of log messages, the granularity does not look needed. > Signed-off-by: Jammy Huang > --- > drivers/media/platform/aspeed-video.c | 73 ++++++++++++++++++++++----- > 1 file changed, 60 insertions(+), 13 deletions(-) > > diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c > index 6259cf17a7cc..7b8129b0ca5f 100644 > --- a/drivers/media/platform/aspeed-video.c > +++ b/drivers/media/platform/aspeed-video.c > @@ -31,6 +31,19 @@ > #include > #include > > + > +#define LOG_REG BIT(4) > +#define LOG_DEBUG BIT(3) > +#define LOG_TRACE BIT(2) Could ftrace be used for this? It looks like there are static functions. No idea, if there is already a “native” Linux kernel solution for this. > +#define LOG_INFO BIT(1) > +#define LOG_NOTICE BIT(0) > + > +#define dprintk(level, fmt, arg...) do { \ > + if (debug & level) \ > + pr_debug(pr_fmt("[%s]: " fmt), DEVICE_NAME, ##arg); \ > +} while (0) > + > + > #define DEVICE_NAME "aspeed-video" > > #define ASPEED_VIDEO_JPEG_NUM_QUALITIES 12 > @@ -390,6 +403,8 @@ static const struct v4l2_dv_timings_cap aspeed_video_timings_cap = { > }, > }; > > +static unsigned int debug; > + > static void aspeed_video_init_jpeg_table(u32 *table, bool yuv420) > { > int i; > @@ -437,7 +452,7 @@ static void aspeed_video_update(struct aspeed_video *video, u32 reg, u32 clear, > t &= ~clear; > t |= bits; > writel(t, video->base + reg); > - dev_dbg(video->dev, "update %03x[%08x -> %08x]\n", reg, before, > + dprintk(LOG_REG, "update %03x[%08x -> %08x]\n", reg, before, > readl(video->base + reg)); > } > > @@ -445,14 +460,14 @@ static u32 aspeed_video_read(struct aspeed_video *video, u32 reg) > { > u32 t = readl(video->base + reg); > > - dev_dbg(video->dev, "read %03x[%08x]\n", reg, t); > + dprintk(LOG_REG, "read %03x[%08x]\n", reg, t); > return t; > } > > static void aspeed_video_write(struct aspeed_video *video, u32 reg, u32 val) > { > writel(val, video->base + reg); > - dev_dbg(video->dev, "write %03x[%08x]\n", reg, > + dprintk(LOG_REG, "write %03x[%08x]\n", reg, > readl(video->base + reg)); > } > > @@ -474,13 +489,13 @@ static int aspeed_video_start_frame(struct aspeed_video *video) > u32 seq_ctrl = aspeed_video_read(video, VE_SEQ_CTRL); > > if (video->v4l2_input_status) { > - dev_dbg(video->dev, "No signal; don't start frame\n"); > + dprintk(LOG_NOTICE, "No signal; don't start frame\n"); > return 0; > } > > if (!(seq_ctrl & VE_SEQ_CTRL_COMP_BUSY) || > !(seq_ctrl & VE_SEQ_CTRL_CAP_BUSY)) { > - dev_dbg(video->dev, "Engine busy; don't start frame\n"); > + dprintk(LOG_NOTICE, "Engine busy; don't start frame\n"); > return -EBUSY; > } > > @@ -489,7 +504,7 @@ static int aspeed_video_start_frame(struct aspeed_video *video) > struct aspeed_video_buffer, link); > if (!buf) { > spin_unlock_irqrestore(&video->lock, flags); > - dev_dbg(video->dev, "No buffers; don't start frame\n"); > + dprintk(LOG_NOTICE, "No buffers; don't start frame\n"); > return -EPROTO; > } > > @@ -565,7 +580,7 @@ static void aspeed_video_bufs_done(struct aspeed_video *video, > > static void aspeed_video_irq_res_change(struct aspeed_video *video, ulong delay) > { > - dev_dbg(video->dev, "Resolution changed; resetting\n"); > + dprintk(LOG_INFO, "Resolution changed; resetting\n"); > > set_bit(VIDEO_RES_CHANGE, &video->flags); > clear_bit(VIDEO_FRAME_INPRG, &video->flags); > @@ -590,6 +605,12 @@ static irqreturn_t aspeed_video_irq(int irq, void *arg) > struct aspeed_video *video = arg; > u32 sts = aspeed_video_read(video, VE_INTERRUPT_STATUS); > > + dprintk(LOG_DEBUG, "irq sts=%#x %s%s%s%s\n", sts, > + sts & VE_INTERRUPT_MODE_DETECT_WD ? ", unlock" : "", > + sts & VE_INTERRUPT_MODE_DETECT ? ", lock" : "", > + sts & VE_INTERRUPT_CAPTURE_COMPLETE ? ", capture-done" : "", > + sts & VE_INTERRUPT_COMP_COMPLETE ? ", comp-done" : ""); > + Please split adding new log messages out into a separate commit. > /* > * Resolution changed or signal was lost; reset the engine and > * re-initialize > @@ -766,7 +787,7 @@ static void aspeed_video_calc_compressed_size(struct aspeed_video *video, > aspeed_video_write(video, VE_STREAM_BUF_SIZE, > compression_buffer_size_reg); > > - dev_dbg(video->dev, "Max compressed size: %x\n", > + dprintk(LOG_INFO, "Max compressed size: %#x\n", > video->max_compressed_size); > } > > @@ -804,7 +825,7 @@ static void aspeed_video_get_resolution(struct aspeed_video *video) > res_check(video), > MODE_DETECT_TIMEOUT); > if (!rc) { > - dev_dbg(video->dev, "Timed out; first mode detect\n"); > + dprintk(LOG_INFO, "Timed out; first mode detect\n"); > clear_bit(VIDEO_RES_DETECT, &video->flags); > return; > } > @@ -822,7 +843,7 @@ static void aspeed_video_get_resolution(struct aspeed_video *video) > MODE_DETECT_TIMEOUT); > clear_bit(VIDEO_RES_DETECT, &video->flags); > if (!rc) { > - dev_dbg(video->dev, "Timed out; second mode detect\n"); > + dprintk(LOG_INFO, "Timed out; second mode detect\n"); > return; > } > > @@ -856,7 +877,7 @@ static void aspeed_video_get_resolution(struct aspeed_video *video) > } while (invalid_resolution && (tries++ < INVALID_RESOLUTION_RETRIES)); > > if (invalid_resolution) { > - dev_dbg(video->dev, "Invalid resolution detected\n"); > + dprintk(LOG_NOTICE, "Invalid resolution detected\n"); > return; > } > > @@ -873,7 +894,7 @@ static void aspeed_video_get_resolution(struct aspeed_video *video) > aspeed_video_update(video, VE_SEQ_CTRL, 0, > VE_SEQ_CTRL_AUTO_COMP | VE_SEQ_CTRL_EN_WATCHDOG); > > - dev_dbg(video->dev, "Got resolution: %dx%d\n", det->width, > + dprintk(LOG_INFO, "Got resolution: %dx%d\n", det->width, > det->height); > } > > @@ -907,6 +928,7 @@ static void aspeed_video_set_resolution(struct aspeed_video *video) > > /* Don't use direct mode below 1024 x 768 (irqs don't fire) */ > if (size < DIRECT_FETCH_THRESHOLD) { > + dprintk(LOG_INFO, "Capture: Sync Mode\n"); > aspeed_video_write(video, VE_TGS_0, > FIELD_PREP(VE_TGS_FIRST, > video->frame_left - 1) | > @@ -918,6 +940,7 @@ static void aspeed_video_set_resolution(struct aspeed_video *video) > video->frame_bottom + 1)); > aspeed_video_update(video, VE_CTRL, 0, VE_CTRL_INT_DE); > } else { > + dprintk(LOG_INFO, "Capture: Direct Mode\n"); > aspeed_video_update(video, VE_CTRL, 0, VE_CTRL_DIRECT_FETCH); > } > > @@ -934,6 +957,10 @@ static void aspeed_video_set_resolution(struct aspeed_video *video) > if (!aspeed_video_alloc_buf(video, &video->srcs[1], size)) > goto err_mem; > > + dprintk(LOG_INFO, "src buf0 addr(%#x) size(%d)\n", > + video->srcs[0].dma, video->srcs[0].size); > + dprintk(LOG_INFO, "src buf1 addr(%#x) size(%d)\n", > + video->srcs[1].dma, video->srcs[1].size); > aspeed_video_write(video, VE_SRC0_ADDR, video->srcs[0].dma); > aspeed_video_write(video, VE_SRC1_ADDR, video->srcs[1].dma); > } > @@ -1010,6 +1037,8 @@ static void aspeed_video_start(struct aspeed_video *video) > > static void aspeed_video_stop(struct aspeed_video *video) > { > + dprintk(LOG_TRACE, "%s\n", __func__); > + > set_bit(VIDEO_STOPPED, &video->flags); > cancel_delayed_work_sync(&video->res_work); > > @@ -1198,6 +1227,9 @@ static int aspeed_video_set_dv_timings(struct file *file, void *fh, > > timings->type = V4L2_DV_BT_656_1120; > > + dprintk(LOG_INFO, "set new timings(%dx%d)\n", timings->bt.width, > + timings->bt.height); > + > return 0; > } > > @@ -1362,6 +1394,8 @@ static void aspeed_video_resolution_work(struct work_struct *work) > res_work); > u32 input_status = video->v4l2_input_status; > > + dprintk(LOG_TRACE, "%s+\n", __func__); > + > aspeed_video_on(video); > > /* Exit early in case no clients remain */ > @@ -1380,6 +1414,7 @@ static void aspeed_video_resolution_work(struct work_struct *work) > .u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION, > }; > > + dprintk(LOG_INFO, "fire source change event\n"); > v4l2_event_queue(&video->vdev, &ev); > } else if (test_bit(VIDEO_STREAMING, &video->flags)) { > /* No resolution change so just restart streaming */ > @@ -1389,6 +1424,8 @@ static void aspeed_video_resolution_work(struct work_struct *work) > done: > clear_bit(VIDEO_RES_CHANGE, &video->flags); > wake_up_interruptible_all(&video->wait); > + > + dprintk(LOG_TRACE, "%s-\n", __func__); > } > > static int aspeed_video_open(struct file *file) > @@ -1476,6 +1513,7 @@ static int aspeed_video_start_streaming(struct vb2_queue *q, > int rc; > struct aspeed_video *video = vb2_get_drv_priv(q); > > + dprintk(LOG_TRACE, "%s\n", __func__); > video->sequence = 0; > video->perf.duration_max = 0; > video->perf.duration_min = 0xffffffff; > @@ -1495,13 +1533,15 @@ static void aspeed_video_stop_streaming(struct vb2_queue *q) > int rc; > struct aspeed_video *video = vb2_get_drv_priv(q); > > + dprintk(LOG_TRACE, "%s+\n", __func__); > + > clear_bit(VIDEO_STREAMING, &video->flags); > > rc = wait_event_timeout(video->wait, > !test_bit(VIDEO_FRAME_INPRG, &video->flags), > STOP_TIMEOUT); > if (!rc) { > - dev_dbg(video->dev, "Timed out when stopping streaming\n"); > + dprintk(LOG_NOTICE, "Timed out when stopping streaming\n"); > > /* > * Need to force stop any DMA and try and get HW into a good > @@ -1516,6 +1556,7 @@ static void aspeed_video_stop_streaming(struct vb2_queue *q) > } > > aspeed_video_bufs_done(video, VB2_BUF_STATE_ERROR); > + dprintk(LOG_TRACE, "%s-\n", __func__); > } > > static void aspeed_video_buf_queue(struct vb2_buffer *vb) > @@ -1715,6 +1756,7 @@ static int aspeed_video_init(struct aspeed_video *video) > dev_err(dev, "Unable to request IRQ %d\n", irq); > return rc; > } > + dev_info(video->dev, "irq %d\n", irq); > > video->eclk = devm_clk_get(dev, "eclk"); > if (IS_ERR(video->eclk)) { > @@ -1751,6 +1793,8 @@ static int aspeed_video_init(struct aspeed_video *video) > rc = -ENOMEM; > goto err_release_reserved_mem; > } > + dev_info(video->dev, "alloc mem size(%d) at %#x for jpeg header\n", > + VE_JPEG_HEADER_SIZE, video->jpeg.dma); > > aspeed_video_init_jpeg_table(video->jpeg.virt, video->yuv420); > > @@ -1856,6 +1900,9 @@ static struct platform_driver aspeed_video_driver = { > > module_platform_driver(aspeed_video_driver); > > +module_param(debug, int, 0644); > +MODULE_PARM_DESC(debug, "set debugging level (0=reg,2=irq,4=trace,8=info(|-able))."); > + > MODULE_DESCRIPTION("ASPEED Video Engine Driver"); > MODULE_AUTHOR("Eddie James"); > MODULE_LICENSE("GPL v2"); Kind regards, Paul 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 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DD803C433F5 for ; Thu, 14 Oct 2021 06:30:20 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 3536561152 for ; Thu, 14 Oct 2021 06:30:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 3536561152 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=molgen.mpg.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From:Cc: References:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=edU+LPctztm1H3IKwb+s36FoMG64H+m3PBKHPKk45CM=; b=yMK7JsenYUPudKMaDMc5adQRX2 SzHnJQl4N+afNRPHNkgHAL+jdtFcV+81Sv5wA/tUHNRVrPgpsnWm2PYoYVJSurLjLzLBQtkbmczuX 0nrCzBAqDUPxMJYYCPpWUSWaVANs86KxvynRXLysJhhT9wctwb5O9wMO42SWO58qNtqq0bKWZab9S YN2VoQosn+x1wl/I3Rf8i5lGE29SR+2XdPYgxchDAaoTWFpfX/LUDWJJAtzMf0puWuEczwmD33U/0 LqXIYR9prMKzvJOnhC8ucp8WHEnNih7E8caHq9ChaolRI9/YvQ+39FirnzaDTIcI1uww4QKdiSaA7 iOct5LUw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mauEN-001h4L-RA; Thu, 14 Oct 2021 06:28:43 +0000 Received: from mx3.molgen.mpg.de ([141.14.17.11] helo=mx1.molgen.mpg.de) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mauEI-001h1t-By for linux-arm-kernel@lists.infradead.org; Thu, 14 Oct 2021 06:28:41 +0000 Received: from [192.168.0.2] (ip5f5ae921.dynamic.kabel-deutschland.de [95.90.233.33]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pmenzel) by mx.molgen.mpg.de (Postfix) with ESMTPSA id 7177361E64760; Thu, 14 Oct 2021 08:28:21 +0200 (CEST) Subject: Re: [PATCH 2/6] media: aspeed: add dprintk for more detailed log control To: Jammy Huang References: <20211014034819.2283-1-jammy_huang@aspeedtech.com> <20211014034819.2283-3-jammy_huang@aspeedtech.com> Cc: eajames@linux.ibm.com, mchehab@kernel.org, joel@jms.id.au, andrew@aj.id.au, linux-media@vger.kernel.org, openbmc@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org, linux-aspeed@lists.ozlabs.org, linux-kernel@vger.kernel.org, Steven Rostedt , Ingo Molnar From: Paul Menzel Message-ID: <5b8f81aa-9d08-dc42-8bd5-e9e7560f37f6@molgen.mpg.de> Date: Thu, 14 Oct 2021 08:28:21 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.14.0 MIME-Version: 1.0 In-Reply-To: <20211014034819.2283-3-jammy_huang@aspeedtech.com> Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211013_232838_593487_CDC32D6B X-CRM114-Status: GOOD ( 32.01 ) 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-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org W0NjOiArU3RldmVuLCArSW5nbyBmb3IgdHJhY2luZyBxdWVzdGlvbnNdCgpEZWFyIEphbW15LAoK CkFtIDE0LjEwLjIxIHVtIDA1OjQ4IHNjaHJpZWIgSmFtbXkgSHVhbmc6Cj4gQWRkIGRwcmludGsg dG8gY2F0ZWdvcml6ZSB0aGUgbG9nIGludG8gTk9USUNFL0lORk8vVFJBQ0UvSVJRL1JFRy4KPiBU aGUgb24vb2ZmIGlzIGNvbnRyb2xsZWQgYnkgbW9kdWxlX3BhcmFtLCBkZWJ1Zy4KCkN1cnJlbnRs eSBkZXZfZGJnIGlzIGR5bmFtaWMgZGVidWcsIHdoaWNoIGNhbiBiZSBjb250cm9sbGVkIHVzaW5n IHRoZSAKTGludXgga2VybmVsIGNvbW1hbmQgbGluZSBvciBkZWJ1Z2ZzIGFscmVhZHk/CgogRnJv bSB5b3VyIHBhdGNoOgoKPiArTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcg bGV2ZWwgKDA9cmVnLDI9aXJxLDQ9dHJhY2UsOD1pbmZvKHwtYWJsZSkpLiIpOwoKV2hhdCBkb2Vz ICh8LWFibGUpIG1lYW4/IE1heWJlIGdpdmUgc29tZSBleGFtcGxlcyBpbiB0aGUgY29tbWl0IG1l c3NhZ2UgCmFzIGRvY3VtZW50YXRpb24/CgpMYXN0bHksIGluc3RlYWQgb2YgcGFyYW1ldGVyIG5h bWUgYGRlYnVnYCwgSeKAmWQgdXNlIGBsb2dfbGV2ZWxgLCB3aGljaCAKd291bGQgYmUgbW9yZSBh Y2N1cmF0ZS4KCldoeSBpcyBtb3JlIGdyYW51bGFyaXR5IG5lZWRlZC91c2VmdWwsIGFuZCBub3Qg anVzdCBkZWJ1ZyBhbmQgbm9uLWRlYnVnLCAKd2hlcmUgdGhlIGV4aXN0aW5nIExpbnV4IGtlcm5l bCBsZXZlbHMgYHByX2luZm9gLCBgcHJfd2FybmAsIOKApiBhcmUgdXNlZD8gCkxvb2tpbmcgYXQg dGhlIGFtb3VudCBvZiBsb2cgbWVzc2FnZXMsIHRoZSBncmFudWxhcml0eSBkb2VzIG5vdCBsb29r IG5lZWRlZC4KCj4gU2lnbmVkLW9mZi1ieTogSmFtbXkgSHVhbmcgPGphbW15X2h1YW5nQGFzcGVl ZHRlY2guY29tPgo+IC0tLQo+ICAgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9hc3BlZWQtdmlkZW8u YyB8IDczICsrKysrKysrKysrKysrKysrKysrKystLS0tLQo+ICAgMSBmaWxlIGNoYW5nZWQsIDYw IGluc2VydGlvbnMoKyksIDEzIGRlbGV0aW9ucygtKQo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJz L21lZGlhL3BsYXRmb3JtL2FzcGVlZC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9h c3BlZWQtdmlkZW8uYwo+IGluZGV4IDYyNTljZjE3YTdjYy4uN2I4MTI5YjBjYTVmIDEwMDY0NAo+ IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vYXNwZWVkLXZpZGVvLmMKPiArKysgYi9kcml2 ZXJzL21lZGlhL3BsYXRmb3JtL2FzcGVlZC12aWRlby5jCj4gQEAgLTMxLDYgKzMxLDE5IEBACj4g ICAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgo+ICAgI2luY2x1ZGUgPG1lZGlhL3ZpZGVv YnVmMi1kbWEtY29udGlnLmg+Cj4gICAKPiArCj4gKyNkZWZpbmUgTE9HX1JFRwkJQklUKDQpCj4g KyNkZWZpbmUgTE9HX0RFQlVHCUJJVCgzKQo+ICsjZGVmaW5lIExPR19UUkFDRQlCSVQoMikKCkNv dWxkIGZ0cmFjZSBiZSB1c2VkIGZvciB0aGlzPyBJdCBsb29rcyBsaWtlIHRoZXJlIGFyZSBzdGF0 aWMgZnVuY3Rpb25zLiAKTm8gaWRlYSwgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIOKAnG5hdGl2ZeKA nSBMaW51eCBrZXJuZWwgc29sdXRpb24gZm9yIHRoaXMuCgo+ICsjZGVmaW5lIExPR19JTkZPCUJJ VCgxKQo+ICsjZGVmaW5lIExPR19OT1RJQ0UJQklUKDApCj4gKwo+ICsjZGVmaW5lIGRwcmludGso bGV2ZWwsIGZtdCwgYXJnLi4uKSBkbyB7CQkJCQlcCj4gKwlpZiAoZGVidWcgJiBsZXZlbCkJCQkJ CQkJXAo+ICsJCXByX2RlYnVnKHByX2ZtdCgiWyVzXTogIiBmbXQpLCBERVZJQ0VfTkFNRSwgIyNh cmcpOwkJXAo+ICt9IHdoaWxlICgwKQo+ICsKPiArCj4gICAjZGVmaW5lIERFVklDRV9OQU1FCQkJ ImFzcGVlZC12aWRlbyIKPiAgIAo+ICAgI2RlZmluZSBBU1BFRURfVklERU9fSlBFR19OVU1fUVVB TElUSUVTCTEyCj4gQEAgLTM5MCw2ICs0MDMsOCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJf ZHZfdGltaW5nc19jYXAgYXNwZWVkX3ZpZGVvX3RpbWluZ3NfY2FwID0gewo+ICAgCX0sCj4gICB9 Owo+ICAgCj4gK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWc7Cj4gKwo+ICAgc3RhdGljIHZvaWQg YXNwZWVkX3ZpZGVvX2luaXRfanBlZ190YWJsZSh1MzIgKnRhYmxlLCBib29sIHl1djQyMCkKPiAg IHsKPiAgIAlpbnQgaTsKPiBAQCAtNDM3LDcgKzQ1Miw3IEBAIHN0YXRpYyB2b2lkIGFzcGVlZF92 aWRlb191cGRhdGUoc3RydWN0IGFzcGVlZF92aWRlbyAqdmlkZW8sIHUzMiByZWcsIHUzMiBjbGVh ciwKPiAgIAl0ICY9IH5jbGVhcjsKPiAgIAl0IHw9IGJpdHM7Cj4gICAJd3JpdGVsKHQsIHZpZGVv LT5iYXNlICsgcmVnKTsKPiAtCWRldl9kYmcodmlkZW8tPmRldiwgInVwZGF0ZSAlMDN4WyUwOHgg LT4gJTA4eF1cbiIsIHJlZywgYmVmb3JlLAo+ICsJZHByaW50ayhMT0dfUkVHLCAidXBkYXRlICUw M3hbJTA4eCAtPiAlMDh4XVxuIiwgcmVnLCBiZWZvcmUsCj4gICAJCXJlYWRsKHZpZGVvLT5iYXNl ICsgcmVnKSk7Cj4gICB9Cj4gICAKPiBAQCAtNDQ1LDE0ICs0NjAsMTQgQEAgc3RhdGljIHUzMiBh c3BlZWRfdmlkZW9fcmVhZChzdHJ1Y3QgYXNwZWVkX3ZpZGVvICp2aWRlbywgdTMyIHJlZykKPiAg IHsKPiAgIAl1MzIgdCA9IHJlYWRsKHZpZGVvLT5iYXNlICsgcmVnKTsKPiAgIAo+IC0JZGV2X2Ri Zyh2aWRlby0+ZGV2LCAicmVhZCAlMDN4WyUwOHhdXG4iLCByZWcsIHQpOwo+ICsJZHByaW50ayhM T0dfUkVHLCAicmVhZCAlMDN4WyUwOHhdXG4iLCByZWcsIHQpOwo+ICAgCXJldHVybiB0Owo+ICAg fQo+ICAgCj4gICBzdGF0aWMgdm9pZCBhc3BlZWRfdmlkZW9fd3JpdGUoc3RydWN0IGFzcGVlZF92 aWRlbyAqdmlkZW8sIHUzMiByZWcsIHUzMiB2YWwpCj4gICB7Cj4gICAJd3JpdGVsKHZhbCwgdmlk ZW8tPmJhc2UgKyByZWcpOwo+IC0JZGV2X2RiZyh2aWRlby0+ZGV2LCAid3JpdGUgJTAzeFslMDh4 XVxuIiwgcmVnLAo+ICsJZHByaW50ayhMT0dfUkVHLCAid3JpdGUgJTAzeFslMDh4XVxuIiwgcmVn LAo+ICAgCQlyZWFkbCh2aWRlby0+YmFzZSArIHJlZykpOwo+ICAgfQo+ICAgCj4gQEAgLTQ3NCwx MyArNDg5LDEzIEBAIHN0YXRpYyBpbnQgYXNwZWVkX3ZpZGVvX3N0YXJ0X2ZyYW1lKHN0cnVjdCBh c3BlZWRfdmlkZW8gKnZpZGVvKQo+ICAgCXUzMiBzZXFfY3RybCA9IGFzcGVlZF92aWRlb19yZWFk KHZpZGVvLCBWRV9TRVFfQ1RSTCk7Cj4gICAKPiAgIAlpZiAodmlkZW8tPnY0bDJfaW5wdXRfc3Rh dHVzKSB7Cj4gLQkJZGV2X2RiZyh2aWRlby0+ZGV2LCAiTm8gc2lnbmFsOyBkb24ndCBzdGFydCBm cmFtZVxuIik7Cj4gKwkJZHByaW50ayhMT0dfTk9USUNFLCAiTm8gc2lnbmFsOyBkb24ndCBzdGFy dCBmcmFtZVxuIik7Cj4gICAJCXJldHVybiAwOwo+ICAgCX0KPiAgIAo+ICAgCWlmICghKHNlcV9j dHJsICYgVkVfU0VRX0NUUkxfQ09NUF9CVVNZKSB8fAo+ICAgCSAgICAhKHNlcV9jdHJsICYgVkVf U0VRX0NUUkxfQ0FQX0JVU1kpKSB7Cj4gLQkJZGV2X2RiZyh2aWRlby0+ZGV2LCAiRW5naW5lIGJ1 c3k7IGRvbid0IHN0YXJ0IGZyYW1lXG4iKTsKPiArCQlkcHJpbnRrKExPR19OT1RJQ0UsICJFbmdp bmUgYnVzeTsgZG9uJ3Qgc3RhcnQgZnJhbWVcbiIpOwo+ICAgCQlyZXR1cm4gLUVCVVNZOwo+ICAg CX0KPiAgIAo+IEBAIC00ODksNyArNTA0LDcgQEAgc3RhdGljIGludCBhc3BlZWRfdmlkZW9fc3Rh cnRfZnJhbWUoc3RydWN0IGFzcGVlZF92aWRlbyAqdmlkZW8pCj4gICAJCQkJICAgICAgIHN0cnVj dCBhc3BlZWRfdmlkZW9fYnVmZmVyLCBsaW5rKTsKPiAgIAlpZiAoIWJ1Zikgewo+ICAgCQlzcGlu X3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+bG9jaywgZmxhZ3MpOwo+IC0JCWRldl9kYmcodmlk ZW8tPmRldiwgIk5vIGJ1ZmZlcnM7IGRvbid0IHN0YXJ0IGZyYW1lXG4iKTsKPiArCQlkcHJpbnRr KExPR19OT1RJQ0UsICJObyBidWZmZXJzOyBkb24ndCBzdGFydCBmcmFtZVxuIik7Cj4gICAJCXJl dHVybiAtRVBST1RPOwo+ICAgCX0KPiAgIAo+IEBAIC01NjUsNyArNTgwLDcgQEAgc3RhdGljIHZv aWQgYXNwZWVkX3ZpZGVvX2J1ZnNfZG9uZShzdHJ1Y3QgYXNwZWVkX3ZpZGVvICp2aWRlbywKPiAg IAo+ICAgc3RhdGljIHZvaWQgYXNwZWVkX3ZpZGVvX2lycV9yZXNfY2hhbmdlKHN0cnVjdCBhc3Bl ZWRfdmlkZW8gKnZpZGVvLCB1bG9uZyBkZWxheSkKPiAgIHsKPiAtCWRldl9kYmcodmlkZW8tPmRl diwgIlJlc29sdXRpb24gY2hhbmdlZDsgcmVzZXR0aW5nXG4iKTsKPiArCWRwcmludGsoTE9HX0lO Rk8sICJSZXNvbHV0aW9uIGNoYW5nZWQ7IHJlc2V0dGluZ1xuIik7Cj4gICAKPiAgIAlzZXRfYml0 KFZJREVPX1JFU19DSEFOR0UsICZ2aWRlby0+ZmxhZ3MpOwo+ICAgCWNsZWFyX2JpdChWSURFT19G UkFNRV9JTlBSRywgJnZpZGVvLT5mbGFncyk7Cj4gQEAgLTU5MCw2ICs2MDUsMTIgQEAgc3RhdGlj IGlycXJldHVybl90IGFzcGVlZF92aWRlb19pcnEoaW50IGlycSwgdm9pZCAqYXJnKQo+ICAgCXN0 cnVjdCBhc3BlZWRfdmlkZW8gKnZpZGVvID0gYXJnOwo+ICAgCXUzMiBzdHMgPSBhc3BlZWRfdmlk ZW9fcmVhZCh2aWRlbywgVkVfSU5URVJSVVBUX1NUQVRVUyk7Cj4gICAKPiArCWRwcmludGsoTE9H X0RFQlVHLCAiaXJxIHN0cz0lI3ggJXMlcyVzJXNcbiIsIHN0cywKPiArCQlzdHMgJiBWRV9JTlRF UlJVUFRfTU9ERV9ERVRFQ1RfV0QgPyAiLCB1bmxvY2siIDogIiIsCj4gKwkJc3RzICYgVkVfSU5U RVJSVVBUX01PREVfREVURUNUID8gIiwgbG9jayIgOiAiIiwKPiArCQlzdHMgJiBWRV9JTlRFUlJV UFRfQ0FQVFVSRV9DT01QTEVURSA/ICIsIGNhcHR1cmUtZG9uZSIgOiAiIiwKPiArCQlzdHMgJiBW RV9JTlRFUlJVUFRfQ09NUF9DT01QTEVURSA/ICIsIGNvbXAtZG9uZSIgOiAiIik7Cj4gKwoKUGxl YXNlIHNwbGl0IGFkZGluZyBuZXcgbG9nIG1lc3NhZ2VzIG91dCBpbnRvIGEgc2VwYXJhdGUgY29t bWl0LgoKPiAgIAkvKgo+ICAgCSAqIFJlc29sdXRpb24gY2hhbmdlZCBvciBzaWduYWwgd2FzIGxv c3Q7IHJlc2V0IHRoZSBlbmdpbmUgYW5kCj4gICAJICogcmUtaW5pdGlhbGl6ZQo+IEBAIC03NjYs NyArNzg3LDcgQEAgc3RhdGljIHZvaWQgYXNwZWVkX3ZpZGVvX2NhbGNfY29tcHJlc3NlZF9zaXpl KHN0cnVjdCBhc3BlZWRfdmlkZW8gKnZpZGVvLAo+ICAgCWFzcGVlZF92aWRlb193cml0ZSh2aWRl bywgVkVfU1RSRUFNX0JVRl9TSVpFLAo+ICAgCQkJICAgY29tcHJlc3Npb25fYnVmZmVyX3NpemVf cmVnKTsKPiAgIAo+IC0JZGV2X2RiZyh2aWRlby0+ZGV2LCAiTWF4IGNvbXByZXNzZWQgc2l6ZTog JXhcbiIsCj4gKwlkcHJpbnRrKExPR19JTkZPLCAiTWF4IGNvbXByZXNzZWQgc2l6ZTogJSN4XG4i LAo+ICAgCQl2aWRlby0+bWF4X2NvbXByZXNzZWRfc2l6ZSk7Cj4gICB9Cj4gICAKPiBAQCAtODA0 LDcgKzgyNSw3IEBAIHN0YXRpYyB2b2lkIGFzcGVlZF92aWRlb19nZXRfcmVzb2x1dGlvbihzdHJ1 Y3QgYXNwZWVkX3ZpZGVvICp2aWRlbykKPiAgIAkJCQkJCSAgICAgIHJlc19jaGVjayh2aWRlbyks Cj4gICAJCQkJCQkgICAgICBNT0RFX0RFVEVDVF9USU1FT1VUKTsKPiAgIAkJaWYgKCFyYykgewo+ IC0JCQlkZXZfZGJnKHZpZGVvLT5kZXYsICJUaW1lZCBvdXQ7IGZpcnN0IG1vZGUgZGV0ZWN0XG4i KTsKPiArCQkJZHByaW50ayhMT0dfSU5GTywgIlRpbWVkIG91dDsgZmlyc3QgbW9kZSBkZXRlY3Rc biIpOwo+ICAgCQkJY2xlYXJfYml0KFZJREVPX1JFU19ERVRFQ1QsICZ2aWRlby0+ZmxhZ3MpOwo+ ICAgCQkJcmV0dXJuOwo+ICAgCQl9Cj4gQEAgLTgyMiw3ICs4NDMsNyBAQCBzdGF0aWMgdm9pZCBh c3BlZWRfdmlkZW9fZ2V0X3Jlc29sdXRpb24oc3RydWN0IGFzcGVlZF92aWRlbyAqdmlkZW8pCj4g ICAJCQkJCQkgICAgICBNT0RFX0RFVEVDVF9USU1FT1VUKTsKPiAgIAkJY2xlYXJfYml0KFZJREVP X1JFU19ERVRFQ1QsICZ2aWRlby0+ZmxhZ3MpOwo+ICAgCQlpZiAoIXJjKSB7Cj4gLQkJCWRldl9k YmcodmlkZW8tPmRldiwgIlRpbWVkIG91dDsgc2Vjb25kIG1vZGUgZGV0ZWN0XG4iKTsKPiArCQkJ ZHByaW50ayhMT0dfSU5GTywgIlRpbWVkIG91dDsgc2Vjb25kIG1vZGUgZGV0ZWN0XG4iKTsKPiAg IAkJCXJldHVybjsKPiAgIAkJfQo+ICAgCj4gQEAgLTg1Niw3ICs4NzcsNyBAQCBzdGF0aWMgdm9p ZCBhc3BlZWRfdmlkZW9fZ2V0X3Jlc29sdXRpb24oc3RydWN0IGFzcGVlZF92aWRlbyAqdmlkZW8p Cj4gICAJfSB3aGlsZSAoaW52YWxpZF9yZXNvbHV0aW9uICYmICh0cmllcysrIDwgSU5WQUxJRF9S RVNPTFVUSU9OX1JFVFJJRVMpKTsKPiAgIAo+ICAgCWlmIChpbnZhbGlkX3Jlc29sdXRpb24pIHsK PiAtCQlkZXZfZGJnKHZpZGVvLT5kZXYsICJJbnZhbGlkIHJlc29sdXRpb24gZGV0ZWN0ZWRcbiIp Owo+ICsJCWRwcmludGsoTE9HX05PVElDRSwgIkludmFsaWQgcmVzb2x1dGlvbiBkZXRlY3RlZFxu Iik7Cj4gICAJCXJldHVybjsKPiAgIAl9Cj4gICAKPiBAQCAtODczLDcgKzg5NCw3IEBAIHN0YXRp YyB2b2lkIGFzcGVlZF92aWRlb19nZXRfcmVzb2x1dGlvbihzdHJ1Y3QgYXNwZWVkX3ZpZGVvICp2 aWRlbykKPiAgIAlhc3BlZWRfdmlkZW9fdXBkYXRlKHZpZGVvLCBWRV9TRVFfQ1RSTCwgMCwKPiAg IAkJCSAgICBWRV9TRVFfQ1RSTF9BVVRPX0NPTVAgfCBWRV9TRVFfQ1RSTF9FTl9XQVRDSERPRyk7 Cj4gICAKPiAtCWRldl9kYmcodmlkZW8tPmRldiwgIkdvdCByZXNvbHV0aW9uOiAlZHglZFxuIiwg ZGV0LT53aWR0aCwKPiArCWRwcmludGsoTE9HX0lORk8sICJHb3QgcmVzb2x1dGlvbjogJWR4JWRc biIsIGRldC0+d2lkdGgsCj4gICAJCWRldC0+aGVpZ2h0KTsKPiAgIH0KPiAgIAo+IEBAIC05MDcs NiArOTI4LDcgQEAgc3RhdGljIHZvaWQgYXNwZWVkX3ZpZGVvX3NldF9yZXNvbHV0aW9uKHN0cnVj dCBhc3BlZWRfdmlkZW8gKnZpZGVvKQo+ICAgCj4gICAJLyogRG9uJ3QgdXNlIGRpcmVjdCBtb2Rl IGJlbG93IDEwMjQgeCA3NjggKGlycXMgZG9uJ3QgZmlyZSkgKi8KPiAgIAlpZiAoc2l6ZSA8IERJ UkVDVF9GRVRDSF9USFJFU0hPTEQpIHsKPiArCQlkcHJpbnRrKExPR19JTkZPLCAiQ2FwdHVyZTog U3luYyBNb2RlXG4iKTsKPiAgIAkJYXNwZWVkX3ZpZGVvX3dyaXRlKHZpZGVvLCBWRV9UR1NfMCwK PiAgIAkJCQkgICBGSUVMRF9QUkVQKFZFX1RHU19GSVJTVCwKPiAgIAkJCQkJICAgICAgdmlkZW8t PmZyYW1lX2xlZnQgLSAxKSB8Cj4gQEAgLTkxOCw2ICs5NDAsNyBAQCBzdGF0aWMgdm9pZCBhc3Bl ZWRfdmlkZW9fc2V0X3Jlc29sdXRpb24oc3RydWN0IGFzcGVlZF92aWRlbyAqdmlkZW8pCj4gICAJ CQkJCSAgICAgIHZpZGVvLT5mcmFtZV9ib3R0b20gKyAxKSk7Cj4gICAJCWFzcGVlZF92aWRlb191 cGRhdGUodmlkZW8sIFZFX0NUUkwsIDAsIFZFX0NUUkxfSU5UX0RFKTsKPiAgIAl9IGVsc2Ugewo+ ICsJCWRwcmludGsoTE9HX0lORk8sICJDYXB0dXJlOiBEaXJlY3QgTW9kZVxuIik7Cj4gICAJCWFz cGVlZF92aWRlb191cGRhdGUodmlkZW8sIFZFX0NUUkwsIDAsIFZFX0NUUkxfRElSRUNUX0ZFVENI KTsKPiAgIAl9Cj4gICAKPiBAQCAtOTM0LDYgKzk1NywxMCBAQCBzdGF0aWMgdm9pZCBhc3BlZWRf dmlkZW9fc2V0X3Jlc29sdXRpb24oc3RydWN0IGFzcGVlZF92aWRlbyAqdmlkZW8pCj4gICAJCWlm ICghYXNwZWVkX3ZpZGVvX2FsbG9jX2J1Zih2aWRlbywgJnZpZGVvLT5zcmNzWzFdLCBzaXplKSkK PiAgIAkJCWdvdG8gZXJyX21lbTsKPiAgIAo+ICsJCWRwcmludGsoTE9HX0lORk8sICJzcmMgYnVm MCBhZGRyKCUjeCkgc2l6ZSglZClcbiIsCj4gKwkJCXZpZGVvLT5zcmNzWzBdLmRtYSwgdmlkZW8t PnNyY3NbMF0uc2l6ZSk7Cj4gKwkJZHByaW50ayhMT0dfSU5GTywgInNyYyBidWYxIGFkZHIoJSN4 KSBzaXplKCVkKVxuIiwKPiArCQkJdmlkZW8tPnNyY3NbMV0uZG1hLCB2aWRlby0+c3Jjc1sxXS5z aXplKTsKPiAgIAkJYXNwZWVkX3ZpZGVvX3dyaXRlKHZpZGVvLCBWRV9TUkMwX0FERFIsIHZpZGVv LT5zcmNzWzBdLmRtYSk7Cj4gICAJCWFzcGVlZF92aWRlb193cml0ZSh2aWRlbywgVkVfU1JDMV9B RERSLCB2aWRlby0+c3Jjc1sxXS5kbWEpOwo+ICAgCX0KPiBAQCAtMTAxMCw2ICsxMDM3LDggQEAg c3RhdGljIHZvaWQgYXNwZWVkX3ZpZGVvX3N0YXJ0KHN0cnVjdCBhc3BlZWRfdmlkZW8gKnZpZGVv KQo+ICAgCj4gICBzdGF0aWMgdm9pZCBhc3BlZWRfdmlkZW9fc3RvcChzdHJ1Y3QgYXNwZWVkX3Zp ZGVvICp2aWRlbykKPiAgIHsKPiArCWRwcmludGsoTE9HX1RSQUNFLCAiJXNcbiIsIF9fZnVuY19f KTsKPiArCj4gICAJc2V0X2JpdChWSURFT19TVE9QUEVELCAmdmlkZW8tPmZsYWdzKTsKPiAgIAlj YW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnZpZGVvLT5yZXNfd29yayk7Cj4gICAKPiBAQCAtMTE5 OCw2ICsxMjI3LDkgQEAgc3RhdGljIGludCBhc3BlZWRfdmlkZW9fc2V0X2R2X3RpbWluZ3Moc3Ry dWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAo+ICAgCj4gICAJdGltaW5ncy0+dHlwZSA9IFY0TDJf RFZfQlRfNjU2XzExMjA7Cj4gICAKPiArCWRwcmludGsoTE9HX0lORk8sICJzZXQgbmV3IHRpbWlu Z3MoJWR4JWQpXG4iLCB0aW1pbmdzLT5idC53aWR0aCwKPiArCQl0aW1pbmdzLT5idC5oZWlnaHQp Owo+ICsKPiAgIAlyZXR1cm4gMDsKPiAgIH0KPiAgIAo+IEBAIC0xMzYyLDYgKzEzOTQsOCBAQCBz dGF0aWMgdm9pZCBhc3BlZWRfdmlkZW9fcmVzb2x1dGlvbl93b3JrKHN0cnVjdCB3b3JrX3N0cnVj dCAqd29yaykKPiAgIAkJCQkJCSAgcmVzX3dvcmspOwo+ICAgCXUzMiBpbnB1dF9zdGF0dXMgPSB2 aWRlby0+djRsMl9pbnB1dF9zdGF0dXM7Cj4gICAKPiArCWRwcmludGsoTE9HX1RSQUNFLCAiJXMr XG4iLCBfX2Z1bmNfXyk7Cj4gKwo+ICAgCWFzcGVlZF92aWRlb19vbih2aWRlbyk7Cj4gICAKPiAg IAkvKiBFeGl0IGVhcmx5IGluIGNhc2Ugbm8gY2xpZW50cyByZW1haW4gKi8KPiBAQCAtMTM4MCw2 ICsxNDE0LDcgQEAgc3RhdGljIHZvaWQgYXNwZWVkX3ZpZGVvX3Jlc29sdXRpb25fd29yayhzdHJ1 Y3Qgd29ya19zdHJ1Y3QgKndvcmspCj4gICAJCQkudS5zcmNfY2hhbmdlLmNoYW5nZXMgPSBWNEwy X0VWRU5UX1NSQ19DSF9SRVNPTFVUSU9OLAo+ICAgCQl9Owo+ICAgCj4gKwkJZHByaW50ayhMT0df SU5GTywgImZpcmUgc291cmNlIGNoYW5nZSBldmVudFxuIik7Cj4gICAJCXY0bDJfZXZlbnRfcXVl dWUoJnZpZGVvLT52ZGV2LCAmZXYpOwo+ICAgCX0gZWxzZSBpZiAodGVzdF9iaXQoVklERU9fU1RS RUFNSU5HLCAmdmlkZW8tPmZsYWdzKSkgewo+ICAgCQkvKiBObyByZXNvbHV0aW9uIGNoYW5nZSBz byBqdXN0IHJlc3RhcnQgc3RyZWFtaW5nICovCj4gQEAgLTEzODksNiArMTQyNCw4IEBAIHN0YXRp YyB2b2lkIGFzcGVlZF92aWRlb19yZXNvbHV0aW9uX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3 b3JrKQo+ICAgZG9uZToKPiAgIAljbGVhcl9iaXQoVklERU9fUkVTX0NIQU5HRSwgJnZpZGVvLT5m bGFncyk7Cj4gICAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmdmlkZW8tPndhaXQpOwo+ICsK PiArCWRwcmludGsoTE9HX1RSQUNFLCAiJXMtXG4iLCBfX2Z1bmNfXyk7Cj4gICB9Cj4gICAKPiAg IHN0YXRpYyBpbnQgYXNwZWVkX3ZpZGVvX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCj4gQEAgLTE0 NzYsNiArMTUxMyw3IEBAIHN0YXRpYyBpbnQgYXNwZWVkX3ZpZGVvX3N0YXJ0X3N0cmVhbWluZyhz dHJ1Y3QgdmIyX3F1ZXVlICpxLAo+ICAgCWludCByYzsKPiAgIAlzdHJ1Y3QgYXNwZWVkX3ZpZGVv ICp2aWRlbyA9IHZiMl9nZXRfZHJ2X3ByaXYocSk7Cj4gICAKPiArCWRwcmludGsoTE9HX1RSQUNF LCAiJXNcbiIsIF9fZnVuY19fKTsKPiAgIAl2aWRlby0+c2VxdWVuY2UgPSAwOwo+ICAgCXZpZGVv LT5wZXJmLmR1cmF0aW9uX21heCA9IDA7Cj4gICAJdmlkZW8tPnBlcmYuZHVyYXRpb25fbWluID0g MHhmZmZmZmZmZjsKPiBAQCAtMTQ5NSwxMyArMTUzMywxNSBAQCBzdGF0aWMgdm9pZCBhc3BlZWRf dmlkZW9fc3RvcF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSkKPiAgIAlpbnQgcmM7Cj4g ICAJc3RydWN0IGFzcGVlZF92aWRlbyAqdmlkZW8gPSB2YjJfZ2V0X2Rydl9wcml2KHEpOwo+ICAg Cj4gKwlkcHJpbnRrKExPR19UUkFDRSwgIiVzK1xuIiwgX19mdW5jX18pOwo+ICsKPiAgIAljbGVh cl9iaXQoVklERU9fU1RSRUFNSU5HLCAmdmlkZW8tPmZsYWdzKTsKPiAgIAo+ICAgCXJjID0gd2Fp dF9ldmVudF90aW1lb3V0KHZpZGVvLT53YWl0LAo+ICAgCQkJCSF0ZXN0X2JpdChWSURFT19GUkFN RV9JTlBSRywgJnZpZGVvLT5mbGFncyksCj4gICAJCQkJU1RPUF9USU1FT1VUKTsKPiAgIAlpZiAo IXJjKSB7Cj4gLQkJZGV2X2RiZyh2aWRlby0+ZGV2LCAiVGltZWQgb3V0IHdoZW4gc3RvcHBpbmcg c3RyZWFtaW5nXG4iKTsKPiArCQlkcHJpbnRrKExPR19OT1RJQ0UsICJUaW1lZCBvdXQgd2hlbiBz dG9wcGluZyBzdHJlYW1pbmdcbiIpOwo+ICAgCj4gICAJCS8qCj4gICAJCSAqIE5lZWQgdG8gZm9y Y2Ugc3RvcCBhbnkgRE1BIGFuZCB0cnkgYW5kIGdldCBIVyBpbnRvIGEgZ29vZAo+IEBAIC0xNTE2 LDYgKzE1NTYsNyBAQCBzdGF0aWMgdm9pZCBhc3BlZWRfdmlkZW9fc3RvcF9zdHJlYW1pbmcoc3Ry dWN0IHZiMl9xdWV1ZSAqcSkKPiAgIAl9Cj4gICAKPiAgIAlhc3BlZWRfdmlkZW9fYnVmc19kb25l KHZpZGVvLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKPiArCWRwcmludGsoTE9HX1RSQUNFLCAiJXMt XG4iLCBfX2Z1bmNfXyk7Cj4gICB9Cj4gICAKPiAgIHN0YXRpYyB2b2lkIGFzcGVlZF92aWRlb19i dWZfcXVldWUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQo+IEBAIC0xNzE1LDYgKzE3NTYsNyBAQCBz dGF0aWMgaW50IGFzcGVlZF92aWRlb19pbml0KHN0cnVjdCBhc3BlZWRfdmlkZW8gKnZpZGVvKQo+ ICAgCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byByZXF1ZXN0IElSUSAlZFxuIiwgaXJxKTsKPiAg IAkJcmV0dXJuIHJjOwo+ICAgCX0KPiArCWRldl9pbmZvKHZpZGVvLT5kZXYsICJpcnEgJWRcbiIs IGlycSk7Cj4gICAKPiAgIAl2aWRlby0+ZWNsayA9IGRldm1fY2xrX2dldChkZXYsICJlY2xrIik7 Cj4gICAJaWYgKElTX0VSUih2aWRlby0+ZWNsaykpIHsKPiBAQCAtMTc1MSw2ICsxNzkzLDggQEAg c3RhdGljIGludCBhc3BlZWRfdmlkZW9faW5pdChzdHJ1Y3QgYXNwZWVkX3ZpZGVvICp2aWRlbykK PiAgIAkJcmMgPSAtRU5PTUVNOwo+ICAgCQlnb3RvIGVycl9yZWxlYXNlX3Jlc2VydmVkX21lbTsK PiAgIAl9Cj4gKwlkZXZfaW5mbyh2aWRlby0+ZGV2LCAiYWxsb2MgbWVtIHNpemUoJWQpIGF0ICUj eCBmb3IganBlZyBoZWFkZXJcbiIsCj4gKwkJIFZFX0pQRUdfSEVBREVSX1NJWkUsIHZpZGVvLT5q cGVnLmRtYSk7Cj4gICAKPiAgIAlhc3BlZWRfdmlkZW9faW5pdF9qcGVnX3RhYmxlKHZpZGVvLT5q cGVnLnZpcnQsIHZpZGVvLT55dXY0MjApOwo+ICAgCj4gQEAgLTE4NTYsNiArMTkwMCw5IEBAIHN0 YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFzcGVlZF92aWRlb19kcml2ZXIgPSB7Cj4gICAK PiAgIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYXNwZWVkX3ZpZGVvX2RyaXZlcik7Cj4gICAKPiAr bW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwo+ICtNT0RVTEVfUEFSTV9ERVNDKGRlYnVn LCAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMD1yZWcsMj1pcnEsND10cmFjZSw4PWluZm8ofC1hYmxl KSkuIik7Cj4gKwo+ICAgTU9EVUxFX0RFU0NSSVBUSU9OKCJBU1BFRUQgVmlkZW8gRW5naW5lIERy aXZlciIpOwo+ICAgTU9EVUxFX0FVVEhPUigiRWRkaWUgSmFtZXMiKTsKPiAgIE1PRFVMRV9MSUNF TlNFKCJHUEwgdjIiKTsKCgpLaW5kIHJlZ2FyZHMsCgpQYXVsCgpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlz dApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJh ZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==