From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [46.235.227.227]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 851EE2C82 for ; Thu, 2 Dec 2021 12:08:34 +0000 (UTC) Received: from [IPv6:2a01:e0a:120:3210:f817:8a6c:e399:d0b] (unknown [IPv6:2a01:e0a:120:3210:f817:8a6c:e399:d0b]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: benjamin.gaignard) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 2C2431F464A8; Thu, 2 Dec 2021 12:08:31 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=collabora.com; s=mail; t=1638446911; bh=yGg2w1LEJNfgJtRcDYSnRyripC1X0LIs/E2T8PD6qFY=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=By3UELcY5/fXiDvKG1dMzGqcTt8EzqR6Z3HB0z41SyBjs2dbIbIwsKAm12ePCPtiq I7SdpkhzJi5XymxOXjrXETSJwtEk8sEilX5AlPL14TmQX5ZECI6zFBs5PuEhdkEw1Q Yrj9bgXsPbMnhLZyBCvcT+dAM+KEFe+EJzUMD5ZFBysX0240asW1xIHxWr4BcHDrCM i3tJL1F0ymteZZRVu5lZVfpLCJpGiJUsNVaVZImKt0Cca7Pvewc7xFZ+o3S4qDO8bt EZWpWvfu3ClDOEitJTgczr/9ucyHy7MAT0G1i2rBNrJbHAKVVR19pbIW6pocWRzufW vQwhjOHM03Xhw== Subject: Re: [PATCH] media: hantro: Make G2/HEVC use hantro_postproc_ops To: Ezequiel Garcia Cc: Philipp Zabel , Mauro Carvalho Chehab , Greg KH , linux-media , "open list:ARM/Rockchip SoC..." , "open list:STAGING SUBSYSTEM" , Linux Kernel Mailing List , Collabora Kernel ML References: <20211202105549.276572-1-benjamin.gaignard@collabora.com> From: Benjamin Gaignard Message-ID: Date: Thu, 2 Dec 2021 13:08:28 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.14.0 Precedence: bulk X-Mailing-List: linux-staging@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Le 02/12/2021 à 12:11, Ezequiel Garcia a écrit : > Hi Benjamin, > > Almost there :-) > > On Thu, 2 Dec 2021 at 07:55, Benjamin Gaignard > wrote: >> Use the postprocessor functions introduced by Hantro G2/VP9 codec series >> and remove duplicated buffer management. >> This allow Hantro G12/HEVC to produce NV12_4L4 and NV12. >> > s/G12/G2 > >> fluster score is 77/147 which equal to previous score. > s/fluster/Fluster > > Can you clarify if this is the HEVC score? While here, can you run VP9 > to confirm there are no regressions? I haven't VP9 GStreamer decoder element ready so I can't do that now. That said the patch doesn't touch any VP9 code. Benjamin >> Note that since NV12_4L2 is the first pixel format enumerated by the >> driver fluster pipeline and it is well converted into I420 by >> GStreamer's videoconvert. >> >> Beauty, Jockey and ShakeNDry bitstreams from UVG set have also been >> tested. >> > Can you add a link to the UVG test suite, so it's clearer? > > Also, this patch is v2, so don't forget to prefix the next one as v3, > and add a changelog to it. > > Thanks a lot, > Ezequiel > >> Signed-off-by: Benjamin Gaignard >> --- >> .../staging/media/hantro/hantro_g2_hevc_dec.c | 25 +++--- >> drivers/staging/media/hantro/hantro_hevc.c | 79 +++---------------- >> drivers/staging/media/hantro/hantro_hw.h | 11 +++ >> .../staging/media/hantro/hantro_postproc.c | 3 + >> drivers/staging/media/hantro/hantro_v4l2.c | 19 ++--- >> 5 files changed, 41 insertions(+), 96 deletions(-) >> >> diff --git a/drivers/staging/media/hantro/hantro_g2_hevc_dec.c b/drivers/staging/media/hantro/hantro_g2_hevc_dec.c >> index b35f36109a6f..6ef5430b18eb 100644 >> --- a/drivers/staging/media/hantro/hantro_g2_hevc_dec.c >> +++ b/drivers/staging/media/hantro/hantro_g2_hevc_dec.c >> @@ -341,6 +341,8 @@ static int set_ref(struct hantro_ctx *ctx) >> const struct v4l2_hevc_dpb_entry *dpb = decode_params->dpb; >> dma_addr_t luma_addr, chroma_addr, mv_addr = 0; >> struct hantro_dev *vpu = ctx->dev; >> + struct vb2_v4l2_buffer *vb2_dst; >> + struct hantro_decoded_buffer *dst; >> size_t cr_offset = hantro_hevc_chroma_offset(sps); >> size_t mv_offset = hantro_hevc_motion_vectors_offset(sps); >> u32 max_ref_frames; >> @@ -426,10 +428,15 @@ static int set_ref(struct hantro_ctx *ctx) >> hantro_write_addr(vpu, G2_REF_MV_ADDR(i), mv_addr); >> } >> >> - luma_addr = hantro_hevc_get_ref_buf(ctx, decode_params->pic_order_cnt_val); >> + vb2_dst = hantro_get_dst_buf(ctx); >> + dst = vb2_to_hantro_decoded_buf(&vb2_dst->vb2_buf); >> + luma_addr = hantro_get_dec_buf_addr(ctx, &dst->base.vb.vb2_buf); >> if (!luma_addr) >> return -ENOMEM; >> >> + if (hantro_hevc_add_ref_buf(ctx, decode_params->pic_order_cnt_val, luma_addr)) >> + return -EINVAL; >> + >> chroma_addr = luma_addr + cr_offset; >> mv_addr = luma_addr + mv_offset; >> >> @@ -456,16 +463,12 @@ static int set_ref(struct hantro_ctx *ctx) >> >> static void set_buffers(struct hantro_ctx *ctx) >> { >> - struct vb2_v4l2_buffer *src_buf, *dst_buf; >> + struct vb2_v4l2_buffer *src_buf; >> struct hantro_dev *vpu = ctx->dev; >> - const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls; >> - const struct v4l2_ctrl_hevc_sps *sps = ctrls->sps; >> - size_t cr_offset = hantro_hevc_chroma_offset(sps); >> - dma_addr_t src_dma, dst_dma; >> + dma_addr_t src_dma; >> u32 src_len, src_buf_len; >> >> src_buf = hantro_get_src_buf(ctx); >> - dst_buf = hantro_get_dst_buf(ctx); >> >> /* Source (stream) buffer. */ >> src_dma = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0); >> @@ -478,11 +481,6 @@ static void set_buffers(struct hantro_ctx *ctx) >> hantro_reg_write(vpu, &g2_strm_start_offset, 0); >> hantro_reg_write(vpu, &g2_write_mvs_e, 1); >> >> - /* Destination (decoded frame) buffer. */ >> - dst_dma = hantro_get_dec_buf_addr(ctx, &dst_buf->vb2_buf); >> - >> - hantro_write_addr(vpu, G2_RS_OUT_LUMA_ADDR, dst_dma); >> - hantro_write_addr(vpu, G2_RS_OUT_CHROMA_ADDR, dst_dma + cr_offset); >> hantro_write_addr(vpu, G2_TILE_SIZES_ADDR, ctx->hevc_dec.tile_sizes.dma); >> hantro_write_addr(vpu, G2_TILE_FILTER_ADDR, ctx->hevc_dec.tile_filter.dma); >> hantro_write_addr(vpu, G2_TILE_SAO_ADDR, ctx->hevc_dec.tile_sao.dma); >> @@ -575,9 +573,6 @@ int hantro_g2_hevc_dec_run(struct hantro_ctx *ctx) >> /* Don't compress buffers */ >> hantro_reg_write(vpu, &g2_ref_compress_bypass, 1); >> >> - /* use NV12 as output format */ >> - hantro_reg_write(vpu, &g2_out_rs_e, 1); >> - >> /* Bus width and max burst */ >> hantro_reg_write(vpu, &g2_buswidth, BUS_WIDTH_128); >> hantro_reg_write(vpu, &g2_max_burst, 16); >> diff --git a/drivers/staging/media/hantro/hantro_hevc.c b/drivers/staging/media/hantro/hantro_hevc.c >> index ee03123e7704..b49a41d7ae91 100644 >> --- a/drivers/staging/media/hantro/hantro_hevc.c >> +++ b/drivers/staging/media/hantro/hantro_hevc.c >> @@ -44,47 +44,6 @@ size_t hantro_hevc_motion_vectors_offset(const struct v4l2_ctrl_hevc_sps *sps) >> return ALIGN((cr_offset * 3) / 2, G2_ALIGN); >> } >> >> -static size_t hantro_hevc_mv_size(const struct v4l2_ctrl_hevc_sps *sps) >> -{ >> - u32 min_cb_log2_size_y = sps->log2_min_luma_coding_block_size_minus3 + 3; >> - u32 ctb_log2_size_y = min_cb_log2_size_y + sps->log2_diff_max_min_luma_coding_block_size; >> - u32 pic_width_in_ctbs_y = (sps->pic_width_in_luma_samples + (1 << ctb_log2_size_y) - 1) >> - >> ctb_log2_size_y; >> - u32 pic_height_in_ctbs_y = (sps->pic_height_in_luma_samples + (1 << ctb_log2_size_y) - 1) >> - >> ctb_log2_size_y; >> - size_t mv_size; >> - >> - mv_size = pic_width_in_ctbs_y * pic_height_in_ctbs_y * >> - (1 << (2 * (ctb_log2_size_y - 4))) * 16; >> - >> - vpu_debug(4, "%dx%d (CTBs) %zu MV bytes\n", >> - pic_width_in_ctbs_y, pic_height_in_ctbs_y, mv_size); >> - >> - return mv_size; >> -} >> - >> -static size_t hantro_hevc_ref_size(struct hantro_ctx *ctx) >> -{ >> - const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls; >> - const struct v4l2_ctrl_hevc_sps *sps = ctrls->sps; >> - >> - return hantro_hevc_motion_vectors_offset(sps) + hantro_hevc_mv_size(sps); >> -} >> - >> -static void hantro_hevc_ref_free(struct hantro_ctx *ctx) >> -{ >> - struct hantro_hevc_dec_hw_ctx *hevc_dec = &ctx->hevc_dec; >> - struct hantro_dev *vpu = ctx->dev; >> - int i; >> - >> - for (i = 0; i < NUM_REF_PICTURES; i++) { >> - if (hevc_dec->ref_bufs[i].cpu) >> - dma_free_coherent(vpu->dev, hevc_dec->ref_bufs[i].size, >> - hevc_dec->ref_bufs[i].cpu, >> - hevc_dec->ref_bufs[i].dma); >> - } >> -} >> - >> static void hantro_hevc_ref_init(struct hantro_ctx *ctx) >> { >> struct hantro_hevc_dec_hw_ctx *hevc_dec = &ctx->hevc_dec; >> @@ -108,37 +67,25 @@ dma_addr_t hantro_hevc_get_ref_buf(struct hantro_ctx *ctx, >> } >> } >> >> - /* Allocate a new reference buffer */ >> + return 0; >> +} >> + >> +int hantro_hevc_add_ref_buf(struct hantro_ctx *ctx, int poc, dma_addr_t addr) >> +{ >> + struct hantro_hevc_dec_hw_ctx *hevc_dec = &ctx->hevc_dec; >> + int i; >> + >> + /* Add a new reference buffer */ >> for (i = 0; i < NUM_REF_PICTURES; i++) { >> if (hevc_dec->ref_bufs_poc[i] == UNUSED_REF) { >> - if (!hevc_dec->ref_bufs[i].cpu) { >> - struct hantro_dev *vpu = ctx->dev; >> - >> - /* >> - * Allocate the space needed for the raw data + >> - * motion vector data. Optimizations could be to >> - * allocate raw data in non coherent memory and only >> - * clear the motion vector data. >> - */ >> - hevc_dec->ref_bufs[i].cpu = >> - dma_alloc_coherent(vpu->dev, >> - hantro_hevc_ref_size(ctx), >> - &hevc_dec->ref_bufs[i].dma, >> - GFP_KERNEL); >> - if (!hevc_dec->ref_bufs[i].cpu) >> - return 0; >> - >> - hevc_dec->ref_bufs[i].size = hantro_hevc_ref_size(ctx); >> - } >> hevc_dec->ref_bufs_used |= 1 << i; >> - memset(hevc_dec->ref_bufs[i].cpu, 0, hantro_hevc_ref_size(ctx)); >> hevc_dec->ref_bufs_poc[i] = poc; >> - >> - return hevc_dec->ref_bufs[i].dma; >> + hevc_dec->ref_bufs[i].dma = addr; >> + return 0; >> } >> } >> >> - return 0; >> + return -EINVAL; >> } >> >> void hantro_hevc_ref_remove_unused(struct hantro_ctx *ctx) >> @@ -314,8 +261,6 @@ void hantro_hevc_dec_exit(struct hantro_ctx *ctx) >> hevc_dec->tile_bsd.cpu, >> hevc_dec->tile_bsd.dma); >> hevc_dec->tile_bsd.cpu = NULL; >> - >> - hantro_hevc_ref_free(ctx); >> } >> >> int hantro_hevc_dec_init(struct hantro_ctx *ctx) >> diff --git a/drivers/staging/media/hantro/hantro_hw.h b/drivers/staging/media/hantro/hantro_hw.h >> index dbe51303724b..7286404c32ab 100644 >> --- a/drivers/staging/media/hantro/hantro_hw.h >> +++ b/drivers/staging/media/hantro/hantro_hw.h >> @@ -345,6 +345,7 @@ void hantro_hevc_dec_exit(struct hantro_ctx *ctx); >> int hantro_g2_hevc_dec_run(struct hantro_ctx *ctx); >> int hantro_hevc_dec_prepare_run(struct hantro_ctx *ctx); >> dma_addr_t hantro_hevc_get_ref_buf(struct hantro_ctx *ctx, int poc); >> +int hantro_hevc_add_ref_buf(struct hantro_ctx *ctx, int poc, dma_addr_t addr); >> void hantro_hevc_ref_remove_unused(struct hantro_ctx *ctx); >> size_t hantro_hevc_chroma_offset(const struct v4l2_ctrl_hevc_sps *sps); >> size_t hantro_hevc_motion_vectors_offset(const struct v4l2_ctrl_hevc_sps *sps); >> @@ -394,6 +395,16 @@ hantro_h264_mv_size(unsigned int width, unsigned int height) >> return 64 * MB_WIDTH(width) * MB_WIDTH(height) + 32; >> } >> >> +static inline size_t >> +hantro_hevc_mv_size(unsigned int width, unsigned int height) >> +{ >> + /* >> + * A CTB can be 64x64, 32x32 or 16x16. >> + * Allocated memory for the "worse" case: 16x16 >> + */ >> + return width * height / 16; >> +} >> + >> int hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx); >> int rockchip_vpu2_mpeg2_dec_run(struct hantro_ctx *ctx); >> void hantro_mpeg2_dec_copy_qtable(u8 *qtable, >> diff --git a/drivers/staging/media/hantro/hantro_postproc.c b/drivers/staging/media/hantro/hantro_postproc.c >> index a7774ad4c445..248abe5423f0 100644 >> --- a/drivers/staging/media/hantro/hantro_postproc.c >> +++ b/drivers/staging/media/hantro/hantro_postproc.c >> @@ -146,6 +146,9 @@ int hantro_postproc_alloc(struct hantro_ctx *ctx) >> else if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_VP9_FRAME) >> buf_size += hantro_vp9_mv_size(ctx->dst_fmt.width, >> ctx->dst_fmt.height); >> + else if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_HEVC_SLICE) >> + buf_size += hantro_hevc_mv_size(ctx->dst_fmt.width, >> + ctx->dst_fmt.height); >> >> for (i = 0; i < num_buffers; ++i) { >> struct hantro_aux_buf *priv = &ctx->postproc.dec_q[i]; >> diff --git a/drivers/staging/media/hantro/hantro_v4l2.c b/drivers/staging/media/hantro/hantro_v4l2.c >> index e4b0645ba6fc..e1fe37afe576 100644 >> --- a/drivers/staging/media/hantro/hantro_v4l2.c >> +++ b/drivers/staging/media/hantro/hantro_v4l2.c >> @@ -150,20 +150,6 @@ static int vidioc_enum_fmt(struct file *file, void *priv, >> unsigned int num_fmts, i, j = 0; >> bool skip_mode_none; >> >> - /* >> - * The HEVC decoder on the G2 core needs a little quirk to offer NV12 >> - * only on the capture side. Once the post-processor logic is used, >> - * we will be able to expose NV12_4L4 and NV12 as the other cases, >> - * and therefore remove this quirk. >> - */ >> - if (capture && ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_HEVC_SLICE) { >> - if (f->index == 0) { >> - f->pixelformat = V4L2_PIX_FMT_NV12; >> - return 0; >> - } >> - return -EINVAL; >> - } >> - >> /* >> * When dealing with an encoder: >> * - on the capture side we want to filter out all MODE_NONE formats. >> @@ -304,6 +290,11 @@ static int hantro_try_fmt(const struct hantro_ctx *ctx, >> pix_mp->plane_fmt[0].sizeimage += >> hantro_vp9_mv_size(pix_mp->width, >> pix_mp->height); >> + else if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_HEVC_SLICE && >> + !hantro_needs_postproc(ctx, fmt)) >> + pix_mp->plane_fmt[0].sizeimage += >> + hantro_hevc_mv_size(pix_mp->width, >> + pix_mp->height); >> } else if (!pix_mp->plane_fmt[0].sizeimage) { >> /* >> * For coded formats the application can specify >> -- >> 2.30.2 >> 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 92050C4332F for ; Thu, 2 Dec 2021 12:12:45 +0000 (UTC) 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: References:Cc:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=chHAX/sOnwq/gZ4uLDfVInO7SPzxinc8FtBEqO+HcL0=; b=zlKbrA+SQOHIEO1qEqFSGwlEMk QiYfxDPV8UY85hU58enCVSzDbVZQ2+lc/XDXNH/kjIrbHjdmfC0NOtA3e8VSgXg+0baoqVD2Sihsj 1+N8Lom/Pi88Uu8bNGbS21u+kNW6ui0uMigrTbeOJdUYh51YmbfJeATop4N0C2pjX8afL2J+JW2tQ vvaGEvDGPxt4c9vb0O4rx2qcvYvTbofAcyqh4PlGRub5zLIhJDg2kj+uWOOZCeXtYYS/48y7cSw9f mGW/wI/dS+6juQYwGKG9M/DWyaPV2ISCcIaDvnR7FAzcJyMGLXy90ujIdRUhx7e08P1XFMxe9t6SC byQFR9hA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mskx5-00CCJ5-5a; Thu, 02 Dec 2021 12:12:39 +0000 Received: from bhuna.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e3e3]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mskt6-00CAjd-Kb for linux-rockchip@lists.infradead.org; Thu, 02 Dec 2021 12:08:37 +0000 Received: from [IPv6:2a01:e0a:120:3210:f817:8a6c:e399:d0b] (unknown [IPv6:2a01:e0a:120:3210:f817:8a6c:e399:d0b]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: benjamin.gaignard) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 2C2431F464A8; Thu, 2 Dec 2021 12:08:31 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=collabora.com; s=mail; t=1638446911; bh=yGg2w1LEJNfgJtRcDYSnRyripC1X0LIs/E2T8PD6qFY=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=By3UELcY5/fXiDvKG1dMzGqcTt8EzqR6Z3HB0z41SyBjs2dbIbIwsKAm12ePCPtiq I7SdpkhzJi5XymxOXjrXETSJwtEk8sEilX5AlPL14TmQX5ZECI6zFBs5PuEhdkEw1Q Yrj9bgXsPbMnhLZyBCvcT+dAM+KEFe+EJzUMD5ZFBysX0240asW1xIHxWr4BcHDrCM i3tJL1F0ymteZZRVu5lZVfpLCJpGiJUsNVaVZImKt0Cca7Pvewc7xFZ+o3S4qDO8bt EZWpWvfu3ClDOEitJTgczr/9ucyHy7MAT0G1i2rBNrJbHAKVVR19pbIW6pocWRzufW vQwhjOHM03Xhw== Subject: Re: [PATCH] media: hantro: Make G2/HEVC use hantro_postproc_ops To: Ezequiel Garcia Cc: Philipp Zabel , Mauro Carvalho Chehab , Greg KH , linux-media , "open list:ARM/Rockchip SoC..." , "open list:STAGING SUBSYSTEM" , Linux Kernel Mailing List , Collabora Kernel ML References: <20211202105549.276572-1-benjamin.gaignard@collabora.com> From: Benjamin Gaignard Message-ID: Date: Thu, 2 Dec 2021 13:08:28 +0100 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: Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211202_040833_056214_AC6FE1DA X-CRM114-Status: GOOD ( 35.29 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms 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-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org CkxlIDAyLzEyLzIwMjEgw6AgMTI6MTEsIEV6ZXF1aWVsIEdhcmNpYSBhIMOpY3JpdMKgOgo+IEhp IEJlbmphbWluLAo+Cj4gQWxtb3N0IHRoZXJlIDotKQo+Cj4gT24gVGh1LCAyIERlYyAyMDIxIGF0 IDA3OjU1LCBCZW5qYW1pbiBHYWlnbmFyZAo+IDxiZW5qYW1pbi5nYWlnbmFyZEBjb2xsYWJvcmEu Y29tPiB3cm90ZToKPj4gVXNlIHRoZSBwb3N0cHJvY2Vzc29yIGZ1bmN0aW9ucyBpbnRyb2R1Y2Vk IGJ5IEhhbnRybyBHMi9WUDkgY29kZWMgc2VyaWVzCj4+IGFuZCByZW1vdmUgZHVwbGljYXRlZCBi dWZmZXIgbWFuYWdlbWVudC4KPj4gVGhpcyBhbGxvdyBIYW50cm8gRzEyL0hFVkMgdG8gcHJvZHVj ZSBOVjEyXzRMNCBhbmQgTlYxMi4KPj4KPiBzL0cxMi9HMgo+Cj4+IGZsdXN0ZXIgc2NvcmUgaXMg NzcvMTQ3IHdoaWNoIGVxdWFsIHRvIHByZXZpb3VzIHNjb3JlLgo+IHMvZmx1c3Rlci9GbHVzdGVy Cj4KPiBDYW4geW91IGNsYXJpZnkgaWYgdGhpcyBpcyB0aGUgSEVWQyBzY29yZT8gV2hpbGUgaGVy ZSwgY2FuIHlvdSBydW4gVlA5Cj4gdG8gY29uZmlybSB0aGVyZSBhcmUgbm8gcmVncmVzc2lvbnM/ CgpJIGhhdmVuJ3QgVlA5IEdTdHJlYW1lciBkZWNvZGVyIGVsZW1lbnQgcmVhZHkgc28gSSBjYW4n dCBkbyB0aGF0IG5vdy4KVGhhdCBzYWlkIHRoZSBwYXRjaCBkb2Vzbid0IHRvdWNoIGFueSBWUDkg Y29kZS4KCkJlbmphbWluCgo+PiBOb3RlIHRoYXQgc2luY2UgTlYxMl80TDIgaXMgdGhlIGZpcnN0 IHBpeGVsIGZvcm1hdCBlbnVtZXJhdGVkIGJ5IHRoZQo+PiBkcml2ZXIgZmx1c3RlciBwaXBlbGlu ZSBhbmQgaXQgaXMgd2VsbCBjb252ZXJ0ZWQgaW50byBJNDIwIGJ5Cj4+IEdTdHJlYW1lcidzIHZp ZGVvY29udmVydC4KPj4KPj4gQmVhdXR5LCBKb2NrZXkgYW5kIFNoYWtlTkRyeSBiaXRzdHJlYW1z IGZyb20gVVZHIHNldCBoYXZlIGFsc28gYmVlbgo+PiB0ZXN0ZWQuCj4+Cj4gQ2FuIHlvdSBhZGQg YSBsaW5rIHRvIHRoZSBVVkcgdGVzdCBzdWl0ZSwgc28gaXQncyBjbGVhcmVyPwo+Cj4gQWxzbywg dGhpcyBwYXRjaCBpcyB2Miwgc28gZG9uJ3QgZm9yZ2V0IHRvIHByZWZpeCB0aGUgbmV4dCBvbmUg YXMgdjMsCj4gYW5kIGFkZCBhIGNoYW5nZWxvZyB0byBpdC4KPgo+IFRoYW5rcyBhIGxvdCwKPiBF emVxdWllbAo+Cj4+IFNpZ25lZC1vZmYtYnk6IEJlbmphbWluIEdhaWduYXJkIDxiZW5qYW1pbi5n YWlnbmFyZEBjb2xsYWJvcmEuY29tPgo+PiAtLS0KPj4gICAuLi4vc3RhZ2luZy9tZWRpYS9oYW50 cm8vaGFudHJvX2cyX2hldmNfZGVjLmMgfCAyNSArKystLS0KPj4gICBkcml2ZXJzL3N0YWdpbmcv bWVkaWEvaGFudHJvL2hhbnRyb19oZXZjLmMgICAgfCA3OSArKystLS0tLS0tLS0tLS0tLS0tCj4+ ICAgZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9faHcuaCAgICAgIHwgMTEgKysr Cj4+ICAgLi4uL3N0YWdpbmcvbWVkaWEvaGFudHJvL2hhbnRyb19wb3N0cHJvYy5jICAgIHwgIDMg Kwo+PiAgIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvX3Y0bDIuYyAgICB8IDE5 ICsrLS0tCj4+ICAgNSBmaWxlcyBjaGFuZ2VkLCA0MSBpbnNlcnRpb25zKCspLCA5NiBkZWxldGlv bnMoLSkKPj4KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFu dHJvX2cyX2hldmNfZGVjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvaGFudHJvL2hhbnRyb19n Ml9oZXZjX2RlYy5jCj4+IGluZGV4IGIzNWYzNjEwOWE2Zi4uNmVmNTQzMGIxOGViIDEwMDY0NAo+ PiAtLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvaGFudHJvL2hhbnRyb19nMl9oZXZjX2RlYy5j Cj4+ICsrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvX2cyX2hldmNfZGVj LmMKPj4gQEAgLTM0MSw2ICszNDEsOCBAQCBzdGF0aWMgaW50IHNldF9yZWYoc3RydWN0IGhhbnRy b19jdHggKmN0eCkKPj4gICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfaGV2Y19kcGJfZW50cnkg KmRwYiA9IGRlY29kZV9wYXJhbXMtPmRwYjsKPj4gICAgICAgICAgZG1hX2FkZHJfdCBsdW1hX2Fk ZHIsIGNocm9tYV9hZGRyLCBtdl9hZGRyID0gMDsKPj4gICAgICAgICAgc3RydWN0IGhhbnRyb19k ZXYgKnZwdSA9IGN0eC0+ZGV2Owo+PiArICAgICAgIHN0cnVjdCB2YjJfdjRsMl9idWZmZXIgKnZi Ml9kc3Q7Cj4+ICsgICAgICAgc3RydWN0IGhhbnRyb19kZWNvZGVkX2J1ZmZlciAqZHN0Owo+PiAg ICAgICAgICBzaXplX3QgY3Jfb2Zmc2V0ID0gaGFudHJvX2hldmNfY2hyb21hX29mZnNldChzcHMp Owo+PiAgICAgICAgICBzaXplX3QgbXZfb2Zmc2V0ID0gaGFudHJvX2hldmNfbW90aW9uX3ZlY3Rv cnNfb2Zmc2V0KHNwcyk7Cj4+ICAgICAgICAgIHUzMiBtYXhfcmVmX2ZyYW1lczsKPj4gQEAgLTQy NiwxMCArNDI4LDE1IEBAIHN0YXRpYyBpbnQgc2V0X3JlZihzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4 KQo+PiAgICAgICAgICAgICAgICAgIGhhbnRyb193cml0ZV9hZGRyKHZwdSwgRzJfUkVGX01WX0FE RFIoaSksIG12X2FkZHIpOwo+PiAgICAgICAgICB9Cj4+Cj4+IC0gICAgICAgbHVtYV9hZGRyID0g aGFudHJvX2hldmNfZ2V0X3JlZl9idWYoY3R4LCBkZWNvZGVfcGFyYW1zLT5waWNfb3JkZXJfY250 X3ZhbCk7Cj4+ICsgICAgICAgdmIyX2RzdCA9IGhhbnRyb19nZXRfZHN0X2J1ZihjdHgpOwo+PiAr ICAgICAgIGRzdCA9IHZiMl90b19oYW50cm9fZGVjb2RlZF9idWYoJnZiMl9kc3QtPnZiMl9idWYp Owo+PiArICAgICAgIGx1bWFfYWRkciA9IGhhbnRyb19nZXRfZGVjX2J1Zl9hZGRyKGN0eCwgJmRz dC0+YmFzZS52Yi52YjJfYnVmKTsKPj4gICAgICAgICAgaWYgKCFsdW1hX2FkZHIpCj4+ICAgICAg ICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Cj4+Cj4+ICsgICAgICAgaWYgKGhhbnRyb19oZXZj X2FkZF9yZWZfYnVmKGN0eCwgZGVjb2RlX3BhcmFtcy0+cGljX29yZGVyX2NudF92YWwsIGx1bWFf YWRkcikpCj4+ICsgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKPj4gKwo+PiAgICAgICAg ICBjaHJvbWFfYWRkciA9IGx1bWFfYWRkciArIGNyX29mZnNldDsKPj4gICAgICAgICAgbXZfYWRk ciA9IGx1bWFfYWRkciArIG12X29mZnNldDsKPj4KPj4gQEAgLTQ1NiwxNiArNDYzLDEyIEBAIHN0 YXRpYyBpbnQgc2V0X3JlZihzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KQo+Pgo+PiAgIHN0YXRpYyB2 b2lkIHNldF9idWZmZXJzKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4+ICAgewo+PiAtICAgICAg IHN0cnVjdCB2YjJfdjRsMl9idWZmZXIgKnNyY19idWYsICpkc3RfYnVmOwo+PiArICAgICAgIHN0 cnVjdCB2YjJfdjRsMl9idWZmZXIgKnNyY19idWY7Cj4+ICAgICAgICAgIHN0cnVjdCBoYW50cm9f ZGV2ICp2cHUgPSBjdHgtPmRldjsKPj4gLSAgICAgICBjb25zdCBzdHJ1Y3QgaGFudHJvX2hldmNf ZGVjX2N0cmxzICpjdHJscyA9ICZjdHgtPmhldmNfZGVjLmN0cmxzOwo+PiAtICAgICAgIGNvbnN0 IHN0cnVjdCB2NGwyX2N0cmxfaGV2Y19zcHMgKnNwcyA9IGN0cmxzLT5zcHM7Cj4+IC0gICAgICAg c2l6ZV90IGNyX29mZnNldCA9IGhhbnRyb19oZXZjX2Nocm9tYV9vZmZzZXQoc3BzKTsKPj4gLSAg ICAgICBkbWFfYWRkcl90IHNyY19kbWEsIGRzdF9kbWE7Cj4+ICsgICAgICAgZG1hX2FkZHJfdCBz cmNfZG1hOwo+PiAgICAgICAgICB1MzIgc3JjX2xlbiwgc3JjX2J1Zl9sZW47Cj4+Cj4+ICAgICAg ICAgIHNyY19idWYgPSBoYW50cm9fZ2V0X3NyY19idWYoY3R4KTsKPj4gLSAgICAgICBkc3RfYnVm ID0gaGFudHJvX2dldF9kc3RfYnVmKGN0eCk7Cj4+Cj4+ICAgICAgICAgIC8qIFNvdXJjZSAoc3Ry ZWFtKSBidWZmZXIuICovCj4+ICAgICAgICAgIHNyY19kbWEgPSB2YjJfZG1hX2NvbnRpZ19wbGFu ZV9kbWFfYWRkcigmc3JjX2J1Zi0+dmIyX2J1ZiwgMCk7Cj4+IEBAIC00NzgsMTEgKzQ4MSw2IEBA IHN0YXRpYyB2b2lkIHNldF9idWZmZXJzKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4+ICAgICAg ICAgIGhhbnRyb19yZWdfd3JpdGUodnB1LCAmZzJfc3RybV9zdGFydF9vZmZzZXQsIDApOwo+PiAg ICAgICAgICBoYW50cm9fcmVnX3dyaXRlKHZwdSwgJmcyX3dyaXRlX212c19lLCAxKTsKPj4KPj4g LSAgICAgICAvKiBEZXN0aW5hdGlvbiAoZGVjb2RlZCBmcmFtZSkgYnVmZmVyLiAqLwo+PiAtICAg ICAgIGRzdF9kbWEgPSBoYW50cm9fZ2V0X2RlY19idWZfYWRkcihjdHgsICZkc3RfYnVmLT52YjJf YnVmKTsKPj4gLQo+PiAtICAgICAgIGhhbnRyb193cml0ZV9hZGRyKHZwdSwgRzJfUlNfT1VUX0xV TUFfQUREUiwgZHN0X2RtYSk7Cj4+IC0gICAgICAgaGFudHJvX3dyaXRlX2FkZHIodnB1LCBHMl9S U19PVVRfQ0hST01BX0FERFIsIGRzdF9kbWEgKyBjcl9vZmZzZXQpOwo+PiAgICAgICAgICBoYW50 cm9fd3JpdGVfYWRkcih2cHUsIEcyX1RJTEVfU0laRVNfQUREUiwgY3R4LT5oZXZjX2RlYy50aWxl X3NpemVzLmRtYSk7Cj4+ICAgICAgICAgIGhhbnRyb193cml0ZV9hZGRyKHZwdSwgRzJfVElMRV9G SUxURVJfQUREUiwgY3R4LT5oZXZjX2RlYy50aWxlX2ZpbHRlci5kbWEpOwo+PiAgICAgICAgICBo YW50cm9fd3JpdGVfYWRkcih2cHUsIEcyX1RJTEVfU0FPX0FERFIsIGN0eC0+aGV2Y19kZWMudGls ZV9zYW8uZG1hKTsKPj4gQEAgLTU3NSw5ICs1NzMsNiBAQCBpbnQgaGFudHJvX2cyX2hldmNfZGVj X3J1bihzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KQo+PiAgICAgICAgICAvKiBEb24ndCBjb21wcmVz cyBidWZmZXJzICovCj4+ICAgICAgICAgIGhhbnRyb19yZWdfd3JpdGUodnB1LCAmZzJfcmVmX2Nv bXByZXNzX2J5cGFzcywgMSk7Cj4+Cj4+IC0gICAgICAgLyogdXNlIE5WMTIgYXMgb3V0cHV0IGZv cm1hdCAqLwo+PiAtICAgICAgIGhhbnRyb19yZWdfd3JpdGUodnB1LCAmZzJfb3V0X3JzX2UsIDEp Owo+PiAtCj4+ICAgICAgICAgIC8qIEJ1cyB3aWR0aCBhbmQgbWF4IGJ1cnN0ICovCj4+ICAgICAg ICAgIGhhbnRyb19yZWdfd3JpdGUodnB1LCAmZzJfYnVzd2lkdGgsIEJVU19XSURUSF8xMjgpOwo+ PiAgICAgICAgICBoYW50cm9fcmVnX3dyaXRlKHZwdSwgJmcyX21heF9idXJzdCwgMTYpOwo+PiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9faGV2Yy5jIGIv ZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9faGV2Yy5jCj4+IGluZGV4IGVlMDMx MjNlNzcwNC4uYjQ5YTQxZDdhZTkxIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVk aWEvaGFudHJvL2hhbnRyb19oZXZjLmMKPj4gKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2hh bnRyby9oYW50cm9faGV2Yy5jCj4+IEBAIC00NCw0NyArNDQsNiBAQCBzaXplX3QgaGFudHJvX2hl dmNfbW90aW9uX3ZlY3RvcnNfb2Zmc2V0KGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfaGV2Y19zcHMg KnNwcykKPj4gICAgICAgICAgcmV0dXJuIEFMSUdOKChjcl9vZmZzZXQgKiAzKSAvIDIsIEcyX0FM SUdOKTsKPj4gICB9Cj4+Cj4+IC1zdGF0aWMgc2l6ZV90IGhhbnRyb19oZXZjX212X3NpemUoY29u c3Qgc3RydWN0IHY0bDJfY3RybF9oZXZjX3NwcyAqc3BzKQo+PiAtewo+PiAtICAgICAgIHUzMiBt aW5fY2JfbG9nMl9zaXplX3kgPSBzcHMtPmxvZzJfbWluX2x1bWFfY29kaW5nX2Jsb2NrX3NpemVf bWludXMzICsgMzsKPj4gLSAgICAgICB1MzIgY3RiX2xvZzJfc2l6ZV95ID0gbWluX2NiX2xvZzJf c2l6ZV95ICsgc3BzLT5sb2cyX2RpZmZfbWF4X21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplOwo+ PiAtICAgICAgIHUzMiBwaWNfd2lkdGhfaW5fY3Ric195ID0gKHNwcy0+cGljX3dpZHRoX2luX2x1 bWFfc2FtcGxlcyArICgxIDw8IGN0Yl9sb2cyX3NpemVfeSkgLSAxKQo+PiAtICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgPj4gY3RiX2xvZzJfc2l6ZV95Owo+PiAtICAgICAgIHUzMiBw aWNfaGVpZ2h0X2luX2N0YnNfeSA9IChzcHMtPnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzICsg KDEgPDwgY3RiX2xvZzJfc2l6ZV95KSAtIDEpCj4+IC0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgPj4gY3RiX2xvZzJfc2l6ZV95Owo+PiAtICAgICAgIHNpemVfdCBtdl9zaXplOwo+ PiAtCj4+IC0gICAgICAgbXZfc2l6ZSA9IHBpY193aWR0aF9pbl9jdGJzX3kgKiBwaWNfaGVpZ2h0 X2luX2N0YnNfeSAqCj4+IC0gICAgICAgICAgICAgICAgICgxIDw8ICgyICogKGN0Yl9sb2cyX3Np emVfeSAtIDQpKSkgKiAxNjsKPj4gLQo+PiAtICAgICAgIHZwdV9kZWJ1Zyg0LCAiJWR4JWQgKENU QnMpICV6dSBNViBieXRlc1xuIiwKPj4gLSAgICAgICAgICAgICAgICAgcGljX3dpZHRoX2luX2N0 YnNfeSwgcGljX2hlaWdodF9pbl9jdGJzX3ksIG12X3NpemUpOwo+PiAtCj4+IC0gICAgICAgcmV0 dXJuIG12X3NpemU7Cj4+IC19Cj4+IC0KPj4gLXN0YXRpYyBzaXplX3QgaGFudHJvX2hldmNfcmVm X3NpemUoc3RydWN0IGhhbnRyb19jdHggKmN0eCkKPj4gLXsKPj4gLSAgICAgICBjb25zdCBzdHJ1 Y3QgaGFudHJvX2hldmNfZGVjX2N0cmxzICpjdHJscyA9ICZjdHgtPmhldmNfZGVjLmN0cmxzOwo+ PiAtICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfaGV2Y19zcHMgKnNwcyA9IGN0cmxzLT5z cHM7Cj4+IC0KPj4gLSAgICAgICByZXR1cm4gaGFudHJvX2hldmNfbW90aW9uX3ZlY3RvcnNfb2Zm c2V0KHNwcykgKyBoYW50cm9faGV2Y19tdl9zaXplKHNwcyk7Cj4+IC19Cj4+IC0KPj4gLXN0YXRp YyB2b2lkIGhhbnRyb19oZXZjX3JlZl9mcmVlKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4+IC17 Cj4+IC0gICAgICAgc3RydWN0IGhhbnRyb19oZXZjX2RlY19od19jdHggKmhldmNfZGVjID0gJmN0 eC0+aGV2Y19kZWM7Cj4+IC0gICAgICAgc3RydWN0IGhhbnRyb19kZXYgKnZwdSA9IGN0eC0+ZGV2 Owo+PiAtICAgICAgIGludCBpOwo+PiAtCj4+IC0gICAgICAgZm9yIChpID0gMDsgIGkgPCBOVU1f UkVGX1BJQ1RVUkVTOyBpKyspIHsKPj4gLSAgICAgICAgICAgICAgIGlmIChoZXZjX2RlYy0+cmVm X2J1ZnNbaV0uY3B1KQo+PiAtICAgICAgICAgICAgICAgICAgICAgICBkbWFfZnJlZV9jb2hlcmVu dCh2cHUtPmRldiwgaGV2Y19kZWMtPnJlZl9idWZzW2ldLnNpemUsCj4+IC0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhldmNfZGVjLT5yZWZfYnVmc1tpXS5jcHUsCj4+ IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhldmNfZGVjLT5yZWZf YnVmc1tpXS5kbWEpOwo+PiAtICAgICAgIH0KPj4gLX0KPj4gLQo+PiAgIHN0YXRpYyB2b2lkIGhh bnRyb19oZXZjX3JlZl9pbml0KHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4+ICAgewo+PiAgICAg ICAgICBzdHJ1Y3QgaGFudHJvX2hldmNfZGVjX2h3X2N0eCAqaGV2Y19kZWMgPSAmY3R4LT5oZXZj X2RlYzsKPj4gQEAgLTEwOCwzNyArNjcsMjUgQEAgZG1hX2FkZHJfdCBoYW50cm9faGV2Y19nZXRf cmVmX2J1ZihzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4LAo+PiAgICAgICAgICAgICAgICAgIH0KPj4g ICAgICAgICAgfQo+Pgo+PiAtICAgICAgIC8qIEFsbG9jYXRlIGEgbmV3IHJlZmVyZW5jZSBidWZm ZXIgKi8KPj4gKyAgICAgICByZXR1cm4gMDsKPj4gK30KPj4gKwo+PiAraW50IGhhbnRyb19oZXZj X2FkZF9yZWZfYnVmKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgsIGludCBwb2MsIGRtYV9hZGRyX3Qg YWRkcikKPj4gK3sKPj4gKyAgICAgICBzdHJ1Y3QgaGFudHJvX2hldmNfZGVjX2h3X2N0eCAqaGV2 Y19kZWMgPSAmY3R4LT5oZXZjX2RlYzsKPj4gKyAgICAgICBpbnQgaTsKPj4gKwo+PiArICAgICAg IC8qIEFkZCBhIG5ldyByZWZlcmVuY2UgYnVmZmVyICovCj4+ICAgICAgICAgIGZvciAoaSA9IDA7 IGkgPCBOVU1fUkVGX1BJQ1RVUkVTOyBpKyspIHsKPj4gICAgICAgICAgICAgICAgICBpZiAoaGV2 Y19kZWMtPnJlZl9idWZzX3BvY1tpXSA9PSBVTlVTRURfUkVGKSB7Cj4+IC0gICAgICAgICAgICAg ICAgICAgICAgIGlmICghaGV2Y19kZWMtPnJlZl9idWZzW2ldLmNwdSkgewo+PiAtICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBoYW50cm9fZGV2ICp2cHUgPSBjdHgtPmRldjsK Pj4gLQo+PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCj4+IC0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICogQWxsb2NhdGUgdGhlIHNwYWNlIG5lZWRlZCBmb3IgdGhl IHJhdyBkYXRhICsKPj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtb3Rpb24g dmVjdG9yIGRhdGEuIE9wdGltaXphdGlvbnMgY291bGQgYmUgdG8KPj4gLSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKiBhbGxvY2F0ZSByYXcgZGF0YSBpbiBub24gY29oZXJlbnQgbWVt b3J5IGFuZCBvbmx5Cj4+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2xlYXIg dGhlIG1vdGlvbiB2ZWN0b3IgZGF0YS4KPj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKi8KPj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXZjX2RlYy0+cmVmX2J1 ZnNbaV0uY3B1ID0KPj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRt YV9hbGxvY19jb2hlcmVudCh2cHUtPmRldiwKPj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW50cm9faGV2Y19yZWZfc2l6ZShjdHgp LAo+PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICZoZXZjX2RlYy0+cmVmX2J1ZnNbaV0uZG1hLAo+PiAtICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpOwo+PiAt ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGV2Y19kZWMtPnJlZl9idWZzW2ld LmNwdSkKPj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAw Owo+PiAtCj4+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV2Y19kZWMtPnJlZl9i dWZzW2ldLnNpemUgPSBoYW50cm9faGV2Y19yZWZfc2l6ZShjdHgpOwo+PiAtICAgICAgICAgICAg ICAgICAgICAgICB9Cj4+ICAgICAgICAgICAgICAgICAgICAgICAgICBoZXZjX2RlYy0+cmVmX2J1 ZnNfdXNlZCB8PSAxIDw8IGk7Cj4+IC0gICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChoZXZj X2RlYy0+cmVmX2J1ZnNbaV0uY3B1LCAwLCBoYW50cm9faGV2Y19yZWZfc2l6ZShjdHgpKTsKPj4g ICAgICAgICAgICAgICAgICAgICAgICAgIGhldmNfZGVjLT5yZWZfYnVmc19wb2NbaV0gPSBwb2M7 Cj4+IC0KPj4gLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhldmNfZGVjLT5yZWZfYnVm c1tpXS5kbWE7Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgIGhldmNfZGVjLT5yZWZfYnVmc1tp XS5kbWEgPSBhZGRyOwo+PiArICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKPj4gICAg ICAgICAgICAgICAgICB9Cj4+ICAgICAgICAgIH0KPj4KPj4gLSAgICAgICByZXR1cm4gMDsKPj4g KyAgICAgICByZXR1cm4gLUVJTlZBTDsKPj4gICB9Cj4+Cj4+ICAgdm9pZCBoYW50cm9faGV2Y19y ZWZfcmVtb3ZlX3VudXNlZChzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KQo+PiBAQCAtMzE0LDggKzI2 MSw2IEBAIHZvaWQgaGFudHJvX2hldmNfZGVjX2V4aXQoc3RydWN0IGhhbnRyb19jdHggKmN0eCkK Pj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXZjX2RlYy0+dGlsZV9ic2Qu Y3B1LAo+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhldmNfZGVjLT50aWxl X2JzZC5kbWEpOwo+PiAgICAgICAgICBoZXZjX2RlYy0+dGlsZV9ic2QuY3B1ID0gTlVMTDsKPj4g LQo+PiAtICAgICAgIGhhbnRyb19oZXZjX3JlZl9mcmVlKGN0eCk7Cj4+ICAgfQo+Pgo+PiAgIGlu dCBoYW50cm9faGV2Y19kZWNfaW5pdChzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KQo+PiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9faHcuaCBiL2RyaXZlcnMv c3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvX2h3LmgKPj4gaW5kZXggZGJlNTEzMDM3MjRiLi43 Mjg2NDA0YzMyYWIgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8v aGFudHJvX2h3LmgKPj4gKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRyby9oYW50cm9f aHcuaAo+PiBAQCAtMzQ1LDYgKzM0NSw3IEBAIHZvaWQgaGFudHJvX2hldmNfZGVjX2V4aXQoc3Ry dWN0IGhhbnRyb19jdHggKmN0eCk7Cj4+ICAgaW50IGhhbnRyb19nMl9oZXZjX2RlY19ydW4oc3Ry dWN0IGhhbnRyb19jdHggKmN0eCk7Cj4+ICAgaW50IGhhbnRyb19oZXZjX2RlY19wcmVwYXJlX3J1 bihzdHJ1Y3QgaGFudHJvX2N0eCAqY3R4KTsKPj4gICBkbWFfYWRkcl90IGhhbnRyb19oZXZjX2dl dF9yZWZfYnVmKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgsIGludCBwb2MpOwo+PiAraW50IGhhbnRy b19oZXZjX2FkZF9yZWZfYnVmKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgsIGludCBwb2MsIGRtYV9h ZGRyX3QgYWRkcik7Cj4+ICAgdm9pZCBoYW50cm9faGV2Y19yZWZfcmVtb3ZlX3VudXNlZChzdHJ1 Y3QgaGFudHJvX2N0eCAqY3R4KTsKPj4gICBzaXplX3QgaGFudHJvX2hldmNfY2hyb21hX29mZnNl dChjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2hldmNfc3BzICpzcHMpOwo+PiAgIHNpemVfdCBoYW50 cm9faGV2Y19tb3Rpb25fdmVjdG9yc19vZmZzZXQoY29uc3Qgc3RydWN0IHY0bDJfY3RybF9oZXZj X3NwcyAqc3BzKTsKPj4gQEAgLTM5NCw2ICszOTUsMTYgQEAgaGFudHJvX2gyNjRfbXZfc2l6ZSh1 bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQpCj4+ICAgICAgICAgIHJldHVy biA2NCAqIE1CX1dJRFRIKHdpZHRoKSAqIE1CX1dJRFRIKGhlaWdodCkgKyAzMjsKPj4gICB9Cj4+ Cj4+ICtzdGF0aWMgaW5saW5lIHNpemVfdAo+PiAraGFudHJvX2hldmNfbXZfc2l6ZSh1bnNpZ25l ZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQpCj4+ICt7Cj4+ICsgICAgICAgLyoKPj4g KyAgICAgICAgKiBBIENUQiBjYW4gYmUgNjR4NjQsIDMyeDMyIG9yIDE2eDE2Lgo+PiArICAgICAg ICAqIEFsbG9jYXRlZCBtZW1vcnkgZm9yIHRoZSAid29yc2UiIGNhc2U6IDE2eDE2Cj4+ICsgICAg ICAgICovCj4+ICsgICAgICAgcmV0dXJuIHdpZHRoICogaGVpZ2h0IC8gMTY7Cj4+ICt9Cj4+ICsK Pj4gICBpbnQgaGFudHJvX2cxX21wZWcyX2RlY19ydW4oc3RydWN0IGhhbnRyb19jdHggKmN0eCk7 Cj4+ICAgaW50IHJvY2tjaGlwX3ZwdTJfbXBlZzJfZGVjX3J1bihzdHJ1Y3QgaGFudHJvX2N0eCAq Y3R4KTsKPj4gICB2b2lkIGhhbnRyb19tcGVnMl9kZWNfY29weV9xdGFibGUodTggKnF0YWJsZSwK Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvX3Bvc3Rw cm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvaGFudHJvL2hhbnRyb19wb3N0cHJvYy5jCj4+ IGluZGV4IGE3Nzc0YWQ0YzQ0NS4uMjQ4YWJlNTQyM2YwIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJz L3N0YWdpbmcvbWVkaWEvaGFudHJvL2hhbnRyb19wb3N0cHJvYy5jCj4+ICsrKyBiL2RyaXZlcnMv c3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvX3Bvc3Rwcm9jLmMKPj4gQEAgLTE0Niw2ICsxNDYs OSBAQCBpbnQgaGFudHJvX3Bvc3Rwcm9jX2FsbG9jKHN0cnVjdCBoYW50cm9fY3R4ICpjdHgpCj4+ ICAgICAgICAgIGVsc2UgaWYgKGN0eC0+dnB1X3NyY19mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9G TVRfVlA5X0ZSQU1FKQo+PiAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplICs9IGhhbnRyb192cDlf bXZfc2l6ZShjdHgtPmRzdF9mbXQud2lkdGgsCj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGN0eC0+ZHN0X2ZtdC5oZWlnaHQpOwo+PiArICAgICAgIGVs c2UgaWYgKGN0eC0+dnB1X3NyY19mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfSEVWQ19TTElD RSkKPj4gKyAgICAgICAgICAgICAgIGJ1Zl9zaXplICs9IGhhbnRyb19oZXZjX212X3NpemUoY3R4 LT5kc3RfZm10LndpZHRoLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBjdHgtPmRzdF9mbXQuaGVpZ2h0KTsKPj4KPj4gICAgICAgICAgZm9yIChpID0g MDsgaSA8IG51bV9idWZmZXJzOyArK2kpIHsKPj4gICAgICAgICAgICAgICAgICBzdHJ1Y3QgaGFu dHJvX2F1eF9idWYgKnByaXYgPSAmY3R4LT5wb3N0cHJvYy5kZWNfcVtpXTsKPj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvX3Y0bDIuYyBiL2RyaXZlcnMv c3RhZ2luZy9tZWRpYS9oYW50cm8vaGFudHJvX3Y0bDIuYwo+PiBpbmRleCBlNGIwNjQ1YmE2ZmMu LmUxZmUzN2FmZTU3NiAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2hhbnRy by9oYW50cm9fdjRsMi5jCj4+ICsrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9oYW50cm8vaGFu dHJvX3Y0bDIuYwo+PiBAQCAtMTUwLDIwICsxNTAsNiBAQCBzdGF0aWMgaW50IHZpZGlvY19lbnVt X2ZtdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKPj4gICAgICAgICAgdW5zaWduZWQg aW50IG51bV9mbXRzLCBpLCBqID0gMDsKPj4gICAgICAgICAgYm9vbCBza2lwX21vZGVfbm9uZTsK Pj4KPj4gLSAgICAgICAvKgo+PiAtICAgICAgICAqIFRoZSBIRVZDIGRlY29kZXIgb24gdGhlIEcy IGNvcmUgbmVlZHMgYSBsaXR0bGUgcXVpcmsgdG8gb2ZmZXIgTlYxMgo+PiAtICAgICAgICAqIG9u bHkgb24gdGhlIGNhcHR1cmUgc2lkZS4gT25jZSB0aGUgcG9zdC1wcm9jZXNzb3IgbG9naWMgaXMg dXNlZCwKPj4gLSAgICAgICAgKiB3ZSB3aWxsIGJlIGFibGUgdG8gZXhwb3NlIE5WMTJfNEw0IGFu ZCBOVjEyIGFzIHRoZSBvdGhlciBjYXNlcywKPj4gLSAgICAgICAgKiBhbmQgdGhlcmVmb3JlIHJl bW92ZSB0aGlzIHF1aXJrLgo+PiAtICAgICAgICAqLwo+PiAtICAgICAgIGlmIChjYXB0dXJlICYm IGN0eC0+dnB1X3NyY19mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfSEVWQ19TTElDRSkgewo+ PiAtICAgICAgICAgICAgICAgaWYgKGYtPmluZGV4ID09IDApIHsKPj4gLSAgICAgICAgICAgICAg ICAgICAgICAgZi0+cGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTlYxMjsKPj4gLSAgICAgICAg ICAgICAgICAgICAgICAgcmV0dXJuIDA7Cj4+IC0gICAgICAgICAgICAgICB9Cj4+IC0gICAgICAg ICAgICAgICByZXR1cm4gLUVJTlZBTDsKPj4gLSAgICAgICB9Cj4+IC0KPj4gICAgICAgICAgLyoK Pj4gICAgICAgICAgICogV2hlbiBkZWFsaW5nIHdpdGggYW4gZW5jb2RlcjoKPj4gICAgICAgICAg ICogIC0gb24gdGhlIGNhcHR1cmUgc2lkZSB3ZSB3YW50IHRvIGZpbHRlciBvdXQgYWxsIE1PREVf Tk9ORSBmb3JtYXRzLgo+PiBAQCAtMzA0LDYgKzI5MCwxMSBAQCBzdGF0aWMgaW50IGhhbnRyb190 cnlfZm10KGNvbnN0IHN0cnVjdCBoYW50cm9fY3R4ICpjdHgsCj4+ICAgICAgICAgICAgICAgICAg ICAgICAgICBwaXhfbXAtPnBsYW5lX2ZtdFswXS5zaXplaW1hZ2UgKz0KPj4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgaGFudHJvX3ZwOV9tdl9zaXplKHBpeF9tcC0+d2lkdGgsCj4+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhf bXAtPmhlaWdodCk7Cj4+ICsgICAgICAgICAgICAgICBlbHNlIGlmIChjdHgtPnZwdV9zcmNfZm10 LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX0hFVkNfU0xJQ0UgJiYKPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICFoYW50cm9fbmVlZHNfcG9zdHByb2MoY3R4LCBmbXQpKQo+PiArICAgICAgICAg ICAgICAgICAgICAgICBwaXhfbXAtPnBsYW5lX2ZtdFswXS5zaXplaW1hZ2UgKz0KPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBoYW50cm9faGV2Y19tdl9zaXplKHBpeF9tcC0+d2lk dGgsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBwaXhfbXAtPmhlaWdodCk7Cj4+ICAgICAgICAgIH0gZWxzZSBpZiAoIXBpeF9tcC0+cGxhbmVf Zm10WzBdLnNpemVpbWFnZSkgewo+PiAgICAgICAgICAgICAgICAgIC8qCj4+ICAgICAgICAgICAg ICAgICAgICogRm9yIGNvZGVkIGZvcm1hdHMgdGhlIGFwcGxpY2F0aW9uIGNhbiBzcGVjaWZ5Cj4+ IC0tCj4+IDIuMzAuMgo+PgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KTGludXgtcm9ja2NoaXAgbWFpbGluZyBsaXN0CkxpbnV4LXJvY2tjaGlwQGxpc3Rz LmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9saW51eC1yb2NrY2hpcAo=