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=-11.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,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 63625C3F2C6 for ; Sat, 29 Feb 2020 14:42:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 243F42469C for ; Sat, 29 Feb 2020 14:42:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727103AbgB2Omf convert rfc822-to-8bit (ORCPT ); Sat, 29 Feb 2020 09:42:35 -0500 Received: from mailoutvs53.siol.net ([185.57.226.244]:52179 "EHLO mail.siol.net" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726308AbgB2Omf (ORCPT ); Sat, 29 Feb 2020 09:42:35 -0500 Received: from localhost (localhost [127.0.0.1]) by mail.siol.net (Postfix) with ESMTP id 005B252143B; Sat, 29 Feb 2020 15:42:29 +0100 (CET) X-Virus-Scanned: amavisd-new at psrvmta09.zcs-production.pri Received: from mail.siol.net ([127.0.0.1]) by localhost (psrvmta09.zcs-production.pri [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id kYSbecqOzKhu; Sat, 29 Feb 2020 15:42:28 +0100 (CET) Received: from mail.siol.net (localhost [127.0.0.1]) by mail.siol.net (Postfix) with ESMTPS id B8B6E5235DA; Sat, 29 Feb 2020 15:42:28 +0100 (CET) Received: from jernej-laptop.localnet (cpe-194-152-20-232.static.triera.net [194.152.20.232]) (Authenticated sender: jernej.skrabec@siol.net) by mail.siol.net (Postfix) with ESMTPA id C571252143B; Sat, 29 Feb 2020 15:42:27 +0100 (CET) From: Jernej =?utf-8?B?xaBrcmFiZWM=?= To: a.hajda@samsung.com, Laurent.pinchart@ideasonboard.com, boris.brezillon@collabora.com, Neil Armstrong , Jonas Karlman Cc: linux-amlogic@lists.infradead.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v4 04/11] drm/bridge: synopsys: dw-hdmi: add bus format negociation Date: Sat, 29 Feb 2020 15:42:27 +0100 Message-ID: <105533194.nniJfEyVGO@jernej-laptop> In-Reply-To: References: <20200206191834.6125-1-narmstrong@baylibre.com> <2970638.5fSG56mABF@jernej-laptop> MIME-Version: 1.0 Content-Transfer-Encoding: 8BIT Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Dne sobota, 29. februar 2020 ob 13:15:26 CET je Jonas Karlman napisal(a): > On 2020-02-29 12:07, Jernej Škrabec wrote: > > Dne sobota, 29. februar 2020 ob 11:09:14 CET je Jonas Karlman napisal(a): > >> Hi Jernej, > >> > >> On 2020-02-29 08:42, Jernej Škrabec wrote: > >>> Hi Neil! > >>> > >>> Dne četrtek, 06. februar 2020 ob 20:18:27 CET je Neil Armstrong > > > > napisal(a): > >>>> Add the atomic_get_output_bus_fmts, atomic_get_input_bus_fmts to > >>>> negociate > >>>> the possible output and input formats for the current mode and monitor, > >>>> and use the negotiated formats in a basic atomic_check callback. > >>>> > >>>> Signed-off-by: Neil Armstrong > >>>> --- > >>>> > >>>> drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 272 +++++++++++++++++++++- > >>>> 1 file changed, 268 insertions(+), 4 deletions(-) > >>>> > >>>> diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > >>>> b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index > >>>> fec4a4bcd1fe..15048ad694bc 100644 > >>>> --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > >>>> +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > >>>> @@ -2095,11 +2095,10 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, > >>>> struct drm_display_mode *mode) > >>>> hdmi->hdmi_data.video_mode.mpixelrepetitionoutput = 0; > >>>> > >>>> hdmi->hdmi_data.video_mode.mpixelrepetitioninput = 0; > >>>> > >>>> - /* TOFIX: Get input format from plat data or fallback to RGB888 */ > >>>> > >>>> if (hdmi->plat_data->input_bus_format) > >>>> > >>>> hdmi->hdmi_data.enc_in_bus_format = > >>>> > >>>> hdmi->plat_data->input_bus_format; > >>>> > >>>> - else > >>>> + else if (hdmi->hdmi_data.enc_in_bus_format == MEDIA_BUS_FMT_FIXED) > >>>> > >>>> hdmi->hdmi_data.enc_in_bus_format = > >>> > >>> MEDIA_BUS_FMT_RGB888_1X24; > >>> > >>>> /* TOFIX: Get input encoding from plat data or fallback to none */ > >>>> > >>>> @@ -2109,8 +2108,8 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, > >>>> struct > >>>> drm_display_mode *mode) else > >>>> > >>>> hdmi->hdmi_data.enc_in_encoding = > >>> > >>> V4L2_YCBCR_ENC_DEFAULT; > >>> > >>>> - /* TOFIX: Default to RGB888 output format */ > >>>> - hdmi->hdmi_data.enc_out_bus_format = MEDIA_BUS_FMT_RGB888_1X24; > >>>> + if (hdmi->hdmi_data.enc_out_bus_format == MEDIA_BUS_FMT_FIXED) > >>>> + hdmi->hdmi_data.enc_out_bus_format = > >>> > >>> MEDIA_BUS_FMT_RGB888_1X24; > >>> > >>>> hdmi->hdmi_data.pix_repet_factor = 0; > >>>> hdmi->hdmi_data.hdcp_enable = 0; > >>>> > >>>> @@ -2388,6 +2387,267 @@ static const struct drm_connector_helper_funcs > >>>> dw_hdmi_connector_helper_funcs = .atomic_check = > >>>> dw_hdmi_connector_atomic_check, > >>>> > >>>> }; > >>>> > >>>> +/* > >>>> + * Possible output formats : > >>>> + * - MEDIA_BUS_FMT_UYYVYY16_0_5X48, > >>>> + * - MEDIA_BUS_FMT_UYYVYY12_0_5X36, > >>>> + * - MEDIA_BUS_FMT_UYYVYY10_0_5X30, > >>>> + * - MEDIA_BUS_FMT_UYYVYY8_0_5X24, > >>>> + * - MEDIA_BUS_FMT_YUV16_1X48, > >>>> + * - MEDIA_BUS_FMT_RGB161616_1X48, > >>>> + * - MEDIA_BUS_FMT_UYVY12_1X24, > >>>> + * - MEDIA_BUS_FMT_YUV12_1X36, > >>>> + * - MEDIA_BUS_FMT_RGB121212_1X36, > >>>> + * - MEDIA_BUS_FMT_UYVY10_1X20, > >>>> + * - MEDIA_BUS_FMT_YUV10_1X30, > >>>> + * - MEDIA_BUS_FMT_RGB101010_1X30, > >>>> + * - MEDIA_BUS_FMT_UYVY8_1X16, > >>>> + * - MEDIA_BUS_FMT_YUV8_1X24, > >>>> + * - MEDIA_BUS_FMT_RGB888_1X24, > >>>> + */ > >>>> + > >>>> +/* Can return a maximum of 12 possible output formats for a > >>>> mode/connector > >>>> */ +#define MAX_OUTPUT_SEL_FORMATS 12 > >>>> + > >>>> +static u32 *dw_hdmi_bridge_atomic_get_output_bus_fmts(struct > >>>> drm_bridge > >>>> *bridge, + struct > >>> > >>> drm_bridge_state *bridge_state, > >>> > >>>> + struct drm_crtc_state > >>> > >>> *crtc_state, > >>> > >>>> + struct > >>> > >>> drm_connector_state *conn_state, > >>> > >>>> + unsigned int > >>> > >>> *num_output_fmts) > >>> > >>>> +{ > >>>> + struct drm_connector *conn = conn_state->connector; > >>>> + struct drm_display_info *info = &conn->display_info; > >>>> + struct drm_display_mode *mode = &crtc_state->mode; > >>>> + u8 max_bpc = conn_state->max_requested_bpc; > >>>> + bool is_hdmi2_sink = info->hdmi.scdc.supported || > >>>> + (info->color_formats & > >>> > >>> DRM_COLOR_FORMAT_YCRCB420); > >>> > >>>> + u32 *output_fmts; > >>>> + int i = 0; > >>>> + > >>>> + *num_output_fmts = 0; > >>>> + > >>>> + output_fmts = kcalloc(MAX_OUTPUT_SEL_FORMATS, > > > > sizeof(*output_fmts), > > > >>>> + GFP_KERNEL); > >>>> + if (!output_fmts) > >>>> + return NULL; > >>>> + > >>>> + /* > >>>> + * If the current mode enforces 4:2:0, force the output but format > >>>> + * to 4:2:0 and do not add the YUV422/444/RGB formats > >>>> + */ > >>>> + if (conn->ycbcr_420_allowed && > >>>> + (drm_mode_is_420_only(info, mode) || > >>>> + ())) { > >>>> + > >>>> + /* Order bus formats from 16bit to 8bit if supported */ > >>>> + if (max_bpc >= 16 && info->bpc == 16 && > >>>> + (info->hdmi.y420_dc_modes & > >>> > >>> DRM_EDID_YCBCR420_DC_48)) > >>> > >>>> + output_fmts[i++] = > >>> > >>> MEDIA_BUS_FMT_UYYVYY16_0_5X48; > >>> > >>>> + > >>>> + if (max_bpc >= 12 && info->bpc >= 12 && > >>>> + (info->hdmi.y420_dc_modes & > >>> > >>> DRM_EDID_YCBCR420_DC_36)) > >>> > >>>> + output_fmts[i++] = > >>> > >>> MEDIA_BUS_FMT_UYYVYY12_0_5X36; > >>> > >>>> + > >>>> + if (max_bpc >= 10 && info->bpc >= 10 && > >>>> + (info->hdmi.y420_dc_modes & > >>> > >>> DRM_EDID_YCBCR420_DC_30)) > >>> > >>>> + output_fmts[i++] = > >>> > >>> MEDIA_BUS_FMT_UYYVYY10_0_5X30; > >>> > >>>> + > >>>> + /* Default 8bit fallback */ > >>>> + output_fmts[i++] = MEDIA_BUS_FMT_UYYVYY8_0_5X24; > >>>> + > >>>> + *num_output_fmts = i; > >>>> + > >>>> + return output_fmts; > >>> > >>> Driver shouldn't return just yet for case "is_hdmi2_sink && > >>> drm_mode_is_420_also(info, mode)", because monitor/TV also supports > >>> YCbCr > >>> 4:4:4 in that case. IMO YCbCr 4:4:4 should be even prefered. What do you > >>> think? > >> > >> I think we need to have some way for controller driver and userspace to > >> control what hdmi output format gets selected. I know for a fact that > >> some > >> Samsung TV have issues with 444 YCbCr modes at 4k 50/60hz but have no > >> problems with 420 modes. The Samsung TV edid lie and/or the TV is not > >> fully > >> following HDMI specs > > > > Interesting, maybe just some bandwith issues? I guess we should have a > > blacklist for such cases. I know that at least Allwinner BSP driver for DW > > HDMI has a blacklist, in this case for 2 monitors which claim to support > > YCbCr 4:4:4 mode but they not. > > > >> From a personal and mediaplayer userspace perspective I would like to > >> prefer 420/444 YCbCr mode as soon as any yuv drm plane is active and rgb > >> 444 anytime else. > > > > I would argue that YCbCr is always prefered: > > - CEA 861 prefers it for all CEA modes > > - avoid dealing with quantization range - it's always limited range for < > > hdmi 2.0 and selectable on some hdmi 2.0 capable sinks > > This is probably true if your sink is a TV, for monitors with HDMI > connections I would expect or at least like to have an option to use rgb444 > full range mode for any desktop or gaming or similar use-case. Well, thing is that CEA 861 clearly states that for CEA modes (720p, 1080p, 2160p, etc.) limited range should be also used for RGB color space. With implemented logic to detect if RGB limited range is needed or not and indicating that in AVI frame, I finally get proper (better?) color reproduction with PC monitor and TV at the same time. I'm not sure if there is any way to detect "full range RGB" capable displays. However, we can always implement connector property like Intel did in i915 driver "Broadcast RGB", which can override RGB quantization mode. > > > Anyway, there is no universal solution to avoid color space conversion in > > all cases. For example, due to design of Allwinner Display Engine 2, it > > can only work in RGB format internally, but it can convert final output > > to YCbCr right before it's feeded to DW HDMI. On the other hand, you have > > meson display pipeline which works in YCbCr format internally and relies > > on DW HDMI CSC unit to convert output to RGB. Fortunately, there are also > > display pipelines which can work in any colorspace internally, like > > Allwinner Display Engine 3. Not sure in which category Rockchip display > > pipeline falls into. > > Agree, and for Rockchip to my knowledge RK3288 VOP (Video Output Processor) > can only output 8/10-bit rgb (full range) to DW-HDMI. > And the VOP in RK322x/RK3328/RK3399 can output 8/10-bit rgb and 444/420 yuv. > I do not know how the VOP handles internal color conversion. > > >> On Rockchip SoCs the display controller cannot output yuv422 to dw-hdmi > >> block, the optimal output format selection in such case should put yuv422 > >> last. > > > > Note that DW HDMI has decimation support which converts 444 to 422. This > > is > > part of CSC unit. > > This works as it should (after a patch to disable color conversion for 444 > to 422), Yeah, I noticed that too, I plan to send a patch for that soon. > the issue I see is that the format negotiation code will currently > favor 444 to 422 decimation over using 444 output. > Note: 422 will not be selected over 444 currently in case sink report deep > color support due to drm edid parsing code following HDMI 1.3 spec, see > [1]. > > [1] > https://github.com/torvalds/linux/blob/master/drivers/gpu/drm/drm_edid.c#L4 > 801-L4806 > > Side note: CSC unit is optional feature of DW-HDMI and presence is > > indicated by config register. However, it seems that CSC support is > > broken in DW HDMI controller on 40nm Allwinner SoCs. If it is enabled, TV > > loses signal. I have to investigate if only CSC is broken or decimation > > also don't work.> Scratch above, DW HDMI CSC unit works ok on Allwinner SoCs, I just forgot to enable CSC clock. > >> Maybe dw-hdmi can call a dw-hdmi glue driver callback to get the > >> preferred > >> output format order? > >> > >> On a side note but related issue, the dw-hdmi format negotiation code > >> should probably also filter modes on tmds rate, something like [1]. > >> It is needed to filter out deep color modes that is not supported by the > >> sink or hdmi spec. > > > > Ah, you mean on TMDS rates supported by the sink. Could this avoid Samsung > > deep color issues? If so, we don't need blacklist then. > > I do not think so, the initial issue was reported with intel graphics but > looking at the edid and comparing to the manual of supported modes they do > not fully match. See manual info at [2] and edid when UHD mode is off at > [3] and when on at [4]. Which part doesn't match? I don't see any issue. Best regards, Jernej > > [2] > https://gitlab.freedesktop.org/drm/intel/uploads/36630c8a727bf8c66a53fd7470 > c88383/MU7000_manual_-_UHD_colour_modes.PNG [3] http://ix.io/1H25 > [4] http://ix.io/1H2e > > > Best regards, > > Jernej > > > >> [1] > >> https://github.com/Kwiboo/linux-rockchip/commit/fc3df6903384e764ab6ac5987 > >> 9c > >> 489cbef55fcbe > >> > >> Best regards, > >> Jonas > >> > >>> Best regards, > >>> Jernej > >>> > >>>> + } > >>>> + > >>>> + /* > >>>> + * Order bus formats from 16bit to 8bit and from YUV422 to RGB > >>>> + * if supported. In any case the default RGB888 format is added > >>>> + */ > >>>> + > >>>> + if (max_bpc >= 16 && info->bpc == 16) { > >>>> + if (info->color_formats & DRM_COLOR_FORMAT_YCRCB444) > >>>> + output_fmts[i++] = MEDIA_BUS_FMT_YUV16_1X48; > >>>> + > >>>> + output_fmts[i++] = MEDIA_BUS_FMT_RGB161616_1X48; > >>>> + } > >>>> + > >>>> + if (max_bpc >= 12 && info->bpc >= 12) { > >>>> + if (info->color_formats & DRM_COLOR_FORMAT_YCRCB422) > >>>> + output_fmts[i++] = > > > > MEDIA_BUS_FMT_UYVY12_1X24; > > > >>>> + > >>>> + if (info->color_formats & DRM_COLOR_FORMAT_YCRCB444) > >>>> + output_fmts[i++] = MEDIA_BUS_FMT_YUV12_1X36; > >>>> + > >>>> + output_fmts[i++] = MEDIA_BUS_FMT_RGB121212_1X36; > >>>> + } > >>>> + > >>>> + if (max_bpc >= 10 && info->bpc >= 10) { > >>>> + if (info->color_formats & DRM_COLOR_FORMAT_YCRCB422) > >>>> + output_fmts[i++] = > > > > MEDIA_BUS_FMT_UYVY10_1X20; > > > >>>> + > >>>> + if (info->color_formats & DRM_COLOR_FORMAT_YCRCB444) > >>>> + output_fmts[i++] = MEDIA_BUS_FMT_YUV10_1X30; > >>>> + > >>>> + output_fmts[i++] = MEDIA_BUS_FMT_RGB101010_1X30; > >>>> + } > >>>> + > >>>> + if (info->color_formats & DRM_COLOR_FORMAT_YCRCB422) > >>>> + output_fmts[i++] = MEDIA_BUS_FMT_UYVY8_1X16; > >>>> + > >>>> + if (info->color_formats & DRM_COLOR_FORMAT_YCRCB444) > >>>> + output_fmts[i++] = MEDIA_BUS_FMT_YUV8_1X24; > >>>> + > >>>> + /* Default 8bit RGB fallback */ > >>>> + output_fmts[i++] = MEDIA_BUS_FMT_RGB888_1X24; > >>>> + > >>>> + *num_output_fmts = i; > >>>> + > >>>> + return output_fmts; > >>>> +} > >>>> + > >>>> +/* > >>>> + * Possible input formats : > >>>> + * - MEDIA_BUS_FMT_RGB888_1X24 > >>>> + * - MEDIA_BUS_FMT_YUV8_1X24 > >>>> + * - MEDIA_BUS_FMT_UYVY8_1X16 > >>>> + * - MEDIA_BUS_FMT_UYYVYY8_0_5X24 > >>>> + * - MEDIA_BUS_FMT_RGB101010_1X30 > >>>> + * - MEDIA_BUS_FMT_YUV10_1X30 > >>>> + * - MEDIA_BUS_FMT_UYVY10_1X20 > >>>> + * - MEDIA_BUS_FMT_UYYVYY10_0_5X30 > >>>> + * - MEDIA_BUS_FMT_RGB121212_1X36 > >>>> + * - MEDIA_BUS_FMT_YUV12_1X36 > >>>> + * - MEDIA_BUS_FMT_UYVY12_1X24 > >>>> + * - MEDIA_BUS_FMT_UYYVYY12_0_5X36 > >>>> + * - MEDIA_BUS_FMT_RGB161616_1X48 > >>>> + * - MEDIA_BUS_FMT_YUV16_1X48 > >>>> + * - MEDIA_BUS_FMT_UYYVYY16_0_5X48 > >>>> + */ > >>>> + > >>>> +/* Can return a maximum of 4 possible input formats for an output > >>>> format > >>>> */ +#define MAX_INPUT_SEL_FORMATS 4 > >>>> + > >>>> +static u32 *dw_hdmi_bridge_atomic_get_input_bus_fmts(struct drm_bridge > >>>> *bridge, + struct > >>> > >>> drm_bridge_state *bridge_state, > >>> > >>>> + struct drm_crtc_state > >>> > >>> *crtc_state, > >>> > >>>> + struct > >>> > >>> drm_connector_state *conn_state, > >>> > >>>> + u32 output_fmt, > >>>> + unsigned int > >>> > >>> *num_input_fmts) > >>> > >>>> +{ > >>>> + u32 *input_fmts; > >>>> + int i = 0; > >>>> + > >>>> + *num_input_fmts = 0; > >>>> + > >>>> + input_fmts = kcalloc(MAX_INPUT_SEL_FORMATS, sizeof(*input_fmts), > >>>> + GFP_KERNEL); > >>>> + if (!input_fmts) > >>>> + return NULL; > >>>> + > >>>> + switch (output_fmt) { > >>>> + /* 8bit */ > >>>> + case MEDIA_BUS_FMT_RGB888_1X24: > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_RGB888_1X24; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_YUV8_1X24; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_UYVY8_1X16; > >>>> + break; > >>>> + case MEDIA_BUS_FMT_YUV8_1X24: > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_YUV8_1X24; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_UYVY8_1X16; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_RGB888_1X24; > >>>> + break; > >>>> + case MEDIA_BUS_FMT_UYVY8_1X16: > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_UYVY8_1X16; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_YUV8_1X24; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_RGB888_1X24; > >>>> + break; > >>>> + > >>>> + /* 10bit */ > >>>> + case MEDIA_BUS_FMT_RGB101010_1X30: > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_RGB101010_1X30; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_YUV10_1X30; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_UYVY10_1X20; > >>>> + break; > >>>> + case MEDIA_BUS_FMT_YUV10_1X30: > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_YUV10_1X30; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_UYVY10_1X20; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_RGB101010_1X30; > >>>> + break; > >>>> + case MEDIA_BUS_FMT_UYVY10_1X20: > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_UYVY10_1X20; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_YUV10_1X30; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_RGB101010_1X30; > >>>> + break; > >>>> + > >>>> + /* 12bit */ > >>>> + case MEDIA_BUS_FMT_RGB121212_1X36: > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_RGB121212_1X36; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_YUV12_1X36; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_UYVY12_1X24; > >>>> + break; > >>>> + case MEDIA_BUS_FMT_YUV12_1X36: > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_YUV12_1X36; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_UYVY12_1X24; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_RGB121212_1X36; > >>>> + break; > >>>> + case MEDIA_BUS_FMT_UYVY12_1X24: > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_UYVY12_1X24; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_YUV12_1X36; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_RGB121212_1X36; > >>>> + break; > >>>> + > >>>> + /* 16bit */ > >>>> + case MEDIA_BUS_FMT_RGB161616_1X48: > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_RGB161616_1X48; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_YUV16_1X48; > >>>> + break; > >>>> + case MEDIA_BUS_FMT_YUV16_1X48: > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_YUV16_1X48; > >>>> + input_fmts[i++] = MEDIA_BUS_FMT_RGB161616_1X48; > >>>> + break; > >>>> + > >>>> + /* 420 */ > >>>> + case MEDIA_BUS_FMT_UYYVYY8_0_5X24: > >>>> + case MEDIA_BUS_FMT_UYYVYY10_0_5X30: > >>>> + case MEDIA_BUS_FMT_UYYVYY12_0_5X36: > >>>> + case MEDIA_BUS_FMT_UYYVYY16_0_5X48: > >>>> + input_fmts[i++] = output_fmt; > >>>> + break; > >>>> + } > >>>> + > >>>> + *num_input_fmts = i; > >>>> + > >>>> + if (*num_input_fmts == 0) { > >>>> + kfree(input_fmts); > >>>> + input_fmts = NULL; > >>>> + } > >>>> + > >>>> + return input_fmts; > >>>> +} > >>>> + > >>>> +static int dw_hdmi_bridge_atomic_check(struct drm_bridge *bridge, > >>>> + struct drm_bridge_state > >>> > >>> *bridge_state, > >>> > >>>> + struct drm_crtc_state > >>> > >>> *crtc_state, > >>> > >>>> + struct drm_connector_state > >>> > >>> *conn_state) > >>> > >>>> +{ > >>>> + struct dw_hdmi *hdmi = bridge->driver_private; > >>>> + > >>>> + dev_dbg(hdmi->dev, "selected output format %x\n", > >>>> + bridge_state->output_bus_cfg.format); > >>>> + > >>>> + hdmi->hdmi_data.enc_out_bus_format = > >>>> + bridge_state->output_bus_cfg.format; > >>>> + > >>>> + dev_dbg(hdmi->dev, "selected input format %x\n", > >>>> + bridge_state->input_bus_cfg.format); > >>>> + > >>>> + hdmi->hdmi_data.enc_in_bus_format = > >>>> + bridge_state->input_bus_cfg.format; > >>>> + > >>>> + return 0; > >>>> +} > >>>> + > >>>> > >>>> static int dw_hdmi_bridge_attach(struct drm_bridge *bridge) > >>>> { > >>>> > >>>> struct dw_hdmi *hdmi = bridge->driver_private; > >>>> > >>>> @@ -2499,6 +2759,9 @@ static const struct drm_bridge_funcs > >>>> dw_hdmi_bridge_funcs = { .atomic_reset = > >>>> drm_atomic_helper_bridge_reset, > >>>> > >>>> .attach = dw_hdmi_bridge_attach, > >>>> .detach = dw_hdmi_bridge_detach, > >>>> > >>>> + .atomic_check = dw_hdmi_bridge_atomic_check, > >>>> + .atomic_get_output_bus_fmts = > >>> > >>> dw_hdmi_bridge_atomic_get_output_bus_fmts, > >>> > >>>> + .atomic_get_input_bus_fmts = > >>> > >>> dw_hdmi_bridge_atomic_get_input_bus_fmts, > >>> > >>>> .enable = dw_hdmi_bridge_enable, > >>>> .disable = dw_hdmi_bridge_disable, > >>>> .mode_set = dw_hdmi_bridge_mode_set, > >>>> > >>>> @@ -2963,6 +3226,7 @@ __dw_hdmi_probe(struct platform_device *pdev, > >>>> > >>>> hdmi->bridge.driver_private = hdmi; > >>>> hdmi->bridge.funcs = &dw_hdmi_bridge_funcs; > >>>> > >>>> + > >>>> > >>>> #ifdef CONFIG_OF > >>>> > >>>> hdmi->bridge.of_node = pdev->dev.of_node; > >>>> > >>>> #endif 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=-11.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,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 3AE0CC3F2E0 for ; Mon, 2 Mar 2020 08:18:22 +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 1BD6F246B4 for ; Mon, 2 Mar 2020 08:18:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1BD6F246B4 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=siol.net 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 7711B6E108; Mon, 2 Mar 2020 08:18:21 +0000 (UTC) Received: from mail.siol.net (mailoutvs3.siol.net [185.57.226.194]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5A97E6E0CE for ; Sat, 29 Feb 2020 14:42:32 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by mail.siol.net (Postfix) with ESMTP id 005B252143B; Sat, 29 Feb 2020 15:42:29 +0100 (CET) X-Virus-Scanned: amavisd-new at psrvmta09.zcs-production.pri Received: from mail.siol.net ([127.0.0.1]) by localhost (psrvmta09.zcs-production.pri [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id kYSbecqOzKhu; Sat, 29 Feb 2020 15:42:28 +0100 (CET) Received: from mail.siol.net (localhost [127.0.0.1]) by mail.siol.net (Postfix) with ESMTPS id B8B6E5235DA; Sat, 29 Feb 2020 15:42:28 +0100 (CET) Received: from jernej-laptop.localnet (cpe-194-152-20-232.static.triera.net [194.152.20.232]) (Authenticated sender: jernej.skrabec@siol.net) by mail.siol.net (Postfix) with ESMTPA id C571252143B; Sat, 29 Feb 2020 15:42:27 +0100 (CET) From: Jernej =?utf-8?B?xaBrcmFiZWM=?= To: a.hajda@samsung.com, Laurent.pinchart@ideasonboard.com, boris.brezillon@collabora.com, Neil Armstrong , Jonas Karlman Subject: Re: [PATCH v4 04/11] drm/bridge: synopsys: dw-hdmi: add bus format negociation Date: Sat, 29 Feb 2020 15:42:27 +0100 Message-ID: <105533194.nniJfEyVGO@jernej-laptop> In-Reply-To: References: <20200206191834.6125-1-narmstrong@baylibre.com> <2970638.5fSG56mABF@jernej-laptop> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 02 Mar 2020 08:17:47 +0000 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: linux-amlogic@lists.infradead.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" RG5lIHNvYm90YSwgMjkuIGZlYnJ1YXIgMjAyMCBvYiAxMzoxNToyNiBDRVQgamUgSm9uYXMgS2Fy bG1hbiBuYXBpc2FsKGEpOgo+IE9uIDIwMjAtMDItMjkgMTI6MDcsIEplcm5laiDFoGtyYWJlYyB3 cm90ZToKPiA+IERuZSBzb2JvdGEsIDI5LiBmZWJydWFyIDIwMjAgb2IgMTE6MDk6MTQgQ0VUIGpl IEpvbmFzIEthcmxtYW4gbmFwaXNhbChhKToKPiA+PiBIaSBKZXJuZWosCj4gPj4gCj4gPj4gT24g MjAyMC0wMi0yOSAwODo0MiwgSmVybmVqIMWga3JhYmVjIHdyb3RlOgo+ID4+PiBIaSBOZWlsIQo+ ID4+PiAKPiA+Pj4gRG5lIMSNZXRydGVrLCAwNi4gZmVicnVhciAyMDIwIG9iIDIwOjE4OjI3IENF VCBqZSBOZWlsIEFybXN0cm9uZwo+ID4gCj4gPiBuYXBpc2FsKGEpOgo+ID4+Pj4gQWRkIHRoZSBh dG9taWNfZ2V0X291dHB1dF9idXNfZm10cywgYXRvbWljX2dldF9pbnB1dF9idXNfZm10cyB0bwo+ ID4+Pj4gbmVnb2NpYXRlCj4gPj4+PiB0aGUgcG9zc2libGUgb3V0cHV0IGFuZCBpbnB1dCBmb3Jt YXRzIGZvciB0aGUgY3VycmVudCBtb2RlIGFuZCBtb25pdG9yLAo+ID4+Pj4gYW5kIHVzZSB0aGUg bmVnb3RpYXRlZCBmb3JtYXRzIGluIGEgYmFzaWMgYXRvbWljX2NoZWNrIGNhbGxiYWNrLgo+ID4+ Pj4gCj4gPj4+PiBTaWduZWQtb2ZmLWJ5OiBOZWlsIEFybXN0cm9uZyA8bmFybXN0cm9uZ0BiYXls aWJyZS5jb20+Cj4gPj4+PiAtLS0KPiA+Pj4+IAo+ID4+Pj4gIGRyaXZlcnMvZ3B1L2RybS9icmlk Z2Uvc3lub3BzeXMvZHctaGRtaS5jIHwgMjcyICsrKysrKysrKysrKysrKysrKysrKy0KPiA+Pj4+ ICAxIGZpbGUgY2hhbmdlZCwgMjY4IGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25zKC0pCj4gPj4+ PiAKPiA+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL3N5bm9wc3lzL2R3 LWhkbWkuYwo+ID4+Pj4gYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL3N5bm9wc3lzL2R3LWhkbWku YyBpbmRleAo+ID4+Pj4gZmVjNGE0YmNkMWZlLi4xNTA0OGFkNjk0YmMgMTAwNjQ0Cj4gPj4+PiAt LS0gYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL3N5bm9wc3lzL2R3LWhkbWkuYwo+ID4+Pj4gKysr IGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9zeW5vcHN5cy9kdy1oZG1pLmMKPiA+Pj4+IEBAIC0y MDk1LDExICsyMDk1LDEwIEBAIHN0YXRpYyBpbnQgZHdfaGRtaV9zZXR1cChzdHJ1Y3QgZHdfaGRt aSAqaGRtaSwKPiA+Pj4+IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQo+ID4+Pj4gaGRt aS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubXBpeGVscmVwZXRpdGlvbm91dHB1dCA9IDA7Cj4gPj4+ PiAKPiA+Pj4+ICAJaGRtaS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubXBpeGVscmVwZXRpdGlvbmlu cHV0ID0gMDsKPiA+Pj4+IAo+ID4+Pj4gLQkvKiBUT0ZJWDogR2V0IGlucHV0IGZvcm1hdCBmcm9t IHBsYXQgZGF0YSBvciBmYWxsYmFjayB0byBSR0I4ODggKi8KPiA+Pj4+IAo+ID4+Pj4gIAlpZiAo aGRtaS0+cGxhdF9kYXRhLT5pbnB1dF9idXNfZm9ybWF0KQo+ID4+Pj4gIAkKPiA+Pj4+ICAJCWhk bWktPmhkbWlfZGF0YS5lbmNfaW5fYnVzX2Zvcm1hdCA9Cj4gPj4+PiAgCQkKPiA+Pj4+ICAJCQlo ZG1pLT5wbGF0X2RhdGEtPmlucHV0X2J1c19mb3JtYXQ7Cj4gPj4+PiAKPiA+Pj4+IC0JZWxzZQo+ ID4+Pj4gKwllbHNlIGlmIChoZG1pLT5oZG1pX2RhdGEuZW5jX2luX2J1c19mb3JtYXQgPT0gTUVE SUFfQlVTX0ZNVF9GSVhFRCkKPiA+Pj4+IAo+ID4+Pj4gIAkJaGRtaS0+aGRtaV9kYXRhLmVuY19p bl9idXNfZm9ybWF0ID0KPiA+Pj4gCj4gPj4+IE1FRElBX0JVU19GTVRfUkdCODg4XzFYMjQ7Cj4g Pj4+IAo+ID4+Pj4gIAkvKiBUT0ZJWDogR2V0IGlucHV0IGVuY29kaW5nIGZyb20gcGxhdCBkYXRh IG9yIGZhbGxiYWNrIHRvIG5vbmUgKi8KPiA+Pj4+IAo+ID4+Pj4gQEAgLTIxMDksOCArMjEwOCw4 IEBAIHN0YXRpYyBpbnQgZHdfaGRtaV9zZXR1cChzdHJ1Y3QgZHdfaGRtaSAqaGRtaSwKPiA+Pj4+ IHN0cnVjdAo+ID4+Pj4gZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkgZWxzZQo+ID4+Pj4gCj4gPj4+ PiAgCQloZG1pLT5oZG1pX2RhdGEuZW5jX2luX2VuY29kaW5nID0KPiA+Pj4gCj4gPj4+IFY0TDJf WUNCQ1JfRU5DX0RFRkFVTFQ7Cj4gPj4+IAo+ID4+Pj4gLQkvKiBUT0ZJWDogRGVmYXVsdCB0byBS R0I4ODggb3V0cHV0IGZvcm1hdCAqLwo+ID4+Pj4gLQloZG1pLT5oZG1pX2RhdGEuZW5jX291dF9i dXNfZm9ybWF0ID0gTUVESUFfQlVTX0ZNVF9SR0I4ODhfMVgyNDsKPiA+Pj4+ICsJaWYgKGhkbWkt PmhkbWlfZGF0YS5lbmNfb3V0X2J1c19mb3JtYXQgPT0gTUVESUFfQlVTX0ZNVF9GSVhFRCkKPiA+ Pj4+ICsJCWhkbWktPmhkbWlfZGF0YS5lbmNfb3V0X2J1c19mb3JtYXQgPQo+ID4+PiAKPiA+Pj4g TUVESUFfQlVTX0ZNVF9SR0I4ODhfMVgyNDsKPiA+Pj4gCj4gPj4+PiAgCWhkbWktPmhkbWlfZGF0 YS5waXhfcmVwZXRfZmFjdG9yID0gMDsKPiA+Pj4+ICAJaGRtaS0+aGRtaV9kYXRhLmhkY3BfZW5h YmxlID0gMDsKPiA+Pj4+IAo+ID4+Pj4gQEAgLTIzODgsNiArMjM4NywyNjcgQEAgc3RhdGljIGNv bnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcwo+ID4+Pj4gZHdfaGRtaV9jb25u ZWN0b3JfaGVscGVyX2Z1bmNzID0gLmF0b21pY19jaGVjayA9Cj4gPj4+PiBkd19oZG1pX2Nvbm5l Y3Rvcl9hdG9taWNfY2hlY2ssCj4gPj4+PiAKPiA+Pj4+ICB9Owo+ID4+Pj4gCj4gPj4+PiArLyoK PiA+Pj4+ICsgKiBQb3NzaWJsZSBvdXRwdXQgZm9ybWF0cyA6Cj4gPj4+PiArICogLSBNRURJQV9C VVNfRk1UX1VZWVZZWTE2XzBfNVg0OCwKPiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfVVlZVllZ MTJfMF81WDM2LAo+ID4+Pj4gKyAqIC0gTUVESUFfQlVTX0ZNVF9VWVlWWVkxMF8wXzVYMzAsCj4g Pj4+PiArICogLSBNRURJQV9CVVNfRk1UX1VZWVZZWThfMF81WDI0LAo+ID4+Pj4gKyAqIC0gTUVE SUFfQlVTX0ZNVF9ZVVYxNl8xWDQ4LAo+ID4+Pj4gKyAqIC0gTUVESUFfQlVTX0ZNVF9SR0IxNjE2 MTZfMVg0OCwKPiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfVVlWWTEyXzFYMjQsCj4gPj4+PiAr ICogLSBNRURJQV9CVVNfRk1UX1lVVjEyXzFYMzYsCj4gPj4+PiArICogLSBNRURJQV9CVVNfRk1U X1JHQjEyMTIxMl8xWDM2LAo+ID4+Pj4gKyAqIC0gTUVESUFfQlVTX0ZNVF9VWVZZMTBfMVgyMCwK PiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfWVVWMTBfMVgzMCwKPiA+Pj4+ICsgKiAtIE1FRElB X0JVU19GTVRfUkdCMTAxMDEwXzFYMzAsCj4gPj4+PiArICogLSBNRURJQV9CVVNfRk1UX1VZVlk4 XzFYMTYsCj4gPj4+PiArICogLSBNRURJQV9CVVNfRk1UX1lVVjhfMVgyNCwKPiA+Pj4+ICsgKiAt IE1FRElBX0JVU19GTVRfUkdCODg4XzFYMjQsCj4gPj4+PiArICovCj4gPj4+PiArCj4gPj4+PiAr LyogQ2FuIHJldHVybiBhIG1heGltdW0gb2YgMTIgcG9zc2libGUgb3V0cHV0IGZvcm1hdHMgZm9y IGEKPiA+Pj4+IG1vZGUvY29ubmVjdG9yCj4gPj4+PiAqLyArI2RlZmluZSBNQVhfT1VUUFVUX1NF TF9GT1JNQVRTCTEyCj4gPj4+PiArCj4gPj4+PiArc3RhdGljIHUzMiAqZHdfaGRtaV9icmlkZ2Vf YXRvbWljX2dldF9vdXRwdXRfYnVzX2ZtdHMoc3RydWN0Cj4gPj4+PiBkcm1fYnJpZGdlCj4gPj4+ PiAqYnJpZGdlLCArCQkJCQlzdHJ1Y3QKPiA+Pj4gCj4gPj4+IGRybV9icmlkZ2Vfc3RhdGUgKmJy aWRnZV9zdGF0ZSwKPiA+Pj4gCj4gPj4+PiArCQkJCQlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUKPiA+ Pj4gCj4gPj4+ICpjcnRjX3N0YXRlLAo+ID4+PiAKPiA+Pj4+ICsJCQkJCXN0cnVjdAo+ID4+PiAK PiA+Pj4gZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubl9zdGF0ZSwKPiA+Pj4gCj4gPj4+PiArCQkJ CQl1bnNpZ25lZCBpbnQKPiA+Pj4gCj4gPj4+ICpudW1fb3V0cHV0X2ZtdHMpCj4gPj4+IAo+ID4+ Pj4gK3sKPiA+Pj4+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm4gPSBjb25uX3N0YXRlLT5j b25uZWN0b3I7Cj4gPj4+PiArCXN0cnVjdCBkcm1fZGlzcGxheV9pbmZvICppbmZvID0gJmNvbm4t PmRpc3BsYXlfaW5mbzsKPiA+Pj4+ICsJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSAm Y3J0Y19zdGF0ZS0+bW9kZTsKPiA+Pj4+ICsJdTggbWF4X2JwYyA9IGNvbm5fc3RhdGUtPm1heF9y ZXF1ZXN0ZWRfYnBjOwo+ID4+Pj4gKwlib29sIGlzX2hkbWkyX3NpbmsgPSBpbmZvLT5oZG1pLnNj ZGMuc3VwcG9ydGVkIHx8Cj4gPj4+PiArCQkJICAgICAoaW5mby0+Y29sb3JfZm9ybWF0cyAmCj4g Pj4+IAo+ID4+PiBEUk1fQ09MT1JfRk9STUFUX1lDUkNCNDIwKTsKPiA+Pj4gCj4gPj4+PiArCXUz MiAqb3V0cHV0X2ZtdHM7Cj4gPj4+PiArCWludCBpID0gMDsKPiA+Pj4+ICsKPiA+Pj4+ICsJKm51 bV9vdXRwdXRfZm10cyA9IDA7Cj4gPj4+PiArCj4gPj4+PiArCW91dHB1dF9mbXRzID0ga2NhbGxv YyhNQVhfT1VUUFVUX1NFTF9GT1JNQVRTLAo+ID4gCj4gPiBzaXplb2YoKm91dHB1dF9mbXRzKSwK PiA+IAo+ID4+Pj4gKwkJCSAgICAgIEdGUF9LRVJORUwpOwo+ID4+Pj4gKwlpZiAoIW91dHB1dF9m bXRzKQo+ID4+Pj4gKwkJcmV0dXJuIE5VTEw7Cj4gPj4+PiArCj4gPj4+PiArCS8qCj4gPj4+PiAr CSAqIElmIHRoZSBjdXJyZW50IG1vZGUgZW5mb3JjZXMgNDoyOjAsIGZvcmNlIHRoZSBvdXRwdXQg YnV0IGZvcm1hdAo+ID4+Pj4gKwkgKiB0byA0OjI6MCBhbmQgZG8gbm90IGFkZCB0aGUgWVVWNDIy LzQ0NC9SR0IgZm9ybWF0cwo+ID4+Pj4gKwkgKi8KPiA+Pj4+ICsJaWYgKGNvbm4tPnljYmNyXzQy MF9hbGxvd2VkICYmCj4gPj4+PiArCSAgICAoZHJtX21vZGVfaXNfNDIwX29ubHkoaW5mbywgbW9k ZSkgfHwKPiA+Pj4+ICsJICAgICAoKSkpIHsKPiA+Pj4+ICsKPiA+Pj4+ICsJCS8qIE9yZGVyIGJ1 cyBmb3JtYXRzIGZyb20gMTZiaXQgdG8gOGJpdCBpZiBzdXBwb3J0ZWQgKi8KPiA+Pj4+ICsJCWlm IChtYXhfYnBjID49IDE2ICYmIGluZm8tPmJwYyA9PSAxNiAmJgo+ID4+Pj4gKwkJICAgIChpbmZv LT5oZG1pLnk0MjBfZGNfbW9kZXMgJgo+ID4+PiAKPiA+Pj4gRFJNX0VESURfWUNCQ1I0MjBfRENf NDgpKQo+ID4+PiAKPiA+Pj4+ICsJCQlvdXRwdXRfZm10c1tpKytdID0KPiA+Pj4gCj4gPj4+IE1F RElBX0JVU19GTVRfVVlZVllZMTZfMF81WDQ4Owo+ID4+PiAKPiA+Pj4+ICsKPiA+Pj4+ICsJCWlm IChtYXhfYnBjID49IDEyICYmIGluZm8tPmJwYyA+PSAxMiAmJgo+ID4+Pj4gKwkJICAgIChpbmZv LT5oZG1pLnk0MjBfZGNfbW9kZXMgJgo+ID4+PiAKPiA+Pj4gRFJNX0VESURfWUNCQ1I0MjBfRENf MzYpKQo+ID4+PiAKPiA+Pj4+ICsJCQlvdXRwdXRfZm10c1tpKytdID0KPiA+Pj4gCj4gPj4+IE1F RElBX0JVU19GTVRfVVlZVllZMTJfMF81WDM2Owo+ID4+PiAKPiA+Pj4+ICsKPiA+Pj4+ICsJCWlm IChtYXhfYnBjID49IDEwICYmIGluZm8tPmJwYyA+PSAxMCAmJgo+ID4+Pj4gKwkJICAgIChpbmZv LT5oZG1pLnk0MjBfZGNfbW9kZXMgJgo+ID4+PiAKPiA+Pj4gRFJNX0VESURfWUNCQ1I0MjBfRENf MzApKQo+ID4+PiAKPiA+Pj4+ICsJCQlvdXRwdXRfZm10c1tpKytdID0KPiA+Pj4gCj4gPj4+IE1F RElBX0JVU19GTVRfVVlZVllZMTBfMF81WDMwOwo+ID4+PiAKPiA+Pj4+ICsKPiA+Pj4+ICsJCS8q IERlZmF1bHQgOGJpdCBmYWxsYmFjayAqLwo+ID4+Pj4gKwkJb3V0cHV0X2ZtdHNbaSsrXSA9IE1F RElBX0JVU19GTVRfVVlZVllZOF8wXzVYMjQ7Cj4gPj4+PiArCj4gPj4+PiArCQkqbnVtX291dHB1 dF9mbXRzID0gaTsKPiA+Pj4+ICsKPiA+Pj4+ICsJCXJldHVybiBvdXRwdXRfZm10czsKPiA+Pj4g Cj4gPj4+IERyaXZlciBzaG91bGRuJ3QgcmV0dXJuIGp1c3QgeWV0IGZvciBjYXNlICJpc19oZG1p Ml9zaW5rICYmCj4gPj4+IGRybV9tb2RlX2lzXzQyMF9hbHNvKGluZm8sIG1vZGUpIiwgYmVjYXVz ZSBtb25pdG9yL1RWIGFsc28gc3VwcG9ydHMKPiA+Pj4gWUNiQ3IKPiA+Pj4gNDo0OjQgaW4gdGhh dCBjYXNlLiBJTU8gWUNiQ3IgNDo0OjQgc2hvdWxkIGJlIGV2ZW4gcHJlZmVyZWQuIFdoYXQgZG8g eW91Cj4gPj4+IHRoaW5rPwo+ID4+IAo+ID4+IEkgdGhpbmsgd2UgbmVlZCB0byBoYXZlIHNvbWUg d2F5IGZvciBjb250cm9sbGVyIGRyaXZlciBhbmQgdXNlcnNwYWNlIHRvCj4gPj4gY29udHJvbCB3 aGF0IGhkbWkgb3V0cHV0IGZvcm1hdCBnZXRzIHNlbGVjdGVkLiBJIGtub3cgZm9yIGEgZmFjdCB0 aGF0Cj4gPj4gc29tZQo+ID4+IFNhbXN1bmcgVFYgaGF2ZSBpc3N1ZXMgd2l0aCA0NDQgWUNiQ3Ig bW9kZXMgYXQgNGsgNTAvNjBoeiBidXQgaGF2ZSBubwo+ID4+IHByb2JsZW1zIHdpdGggNDIwIG1v ZGVzLiBUaGUgU2Ftc3VuZyBUViBlZGlkIGxpZSBhbmQvb3IgdGhlIFRWIGlzIG5vdAo+ID4+IGZ1 bGx5Cj4gPj4gZm9sbG93aW5nIEhETUkgc3BlY3MKPiA+IAo+ID4gSW50ZXJlc3RpbmcsIG1heWJl IGp1c3Qgc29tZSBiYW5kd2l0aCBpc3N1ZXM/IEkgZ3Vlc3Mgd2Ugc2hvdWxkIGhhdmUgYQo+ID4g YmxhY2tsaXN0IGZvciBzdWNoIGNhc2VzLiBJIGtub3cgdGhhdCBhdCBsZWFzdCBBbGx3aW5uZXIg QlNQIGRyaXZlciBmb3IgRFcKPiA+IEhETUkgaGFzIGEgYmxhY2tsaXN0LCBpbiB0aGlzIGNhc2Ug Zm9yIDIgbW9uaXRvcnMgd2hpY2ggY2xhaW0gdG8gc3VwcG9ydAo+ID4gWUNiQ3IgNDo0OjQgbW9k ZSBidXQgdGhleSBub3QuCj4gPiAKPiA+PiBGcm9tIGEgcGVyc29uYWwgYW5kIG1lZGlhcGxheWVy IHVzZXJzcGFjZSBwZXJzcGVjdGl2ZSBJIHdvdWxkIGxpa2UgdG8KPiA+PiBwcmVmZXIgNDIwLzQ0 NCBZQ2JDciBtb2RlIGFzIHNvb24gYXMgYW55IHl1diBkcm0gcGxhbmUgaXMgYWN0aXZlIGFuZCBy Z2IKPiA+PiA0NDQgYW55dGltZSBlbHNlLgo+ID4gCj4gPiBJIHdvdWxkIGFyZ3VlIHRoYXQgWUNi Q3IgaXMgYWx3YXlzIHByZWZlcmVkOgo+ID4gLSBDRUEgODYxIHByZWZlcnMgaXQgZm9yIGFsbCBD RUEgbW9kZXMKPiA+IC0gYXZvaWQgZGVhbGluZyB3aXRoIHF1YW50aXphdGlvbiByYW5nZSAtIGl0 J3MgYWx3YXlzIGxpbWl0ZWQgcmFuZ2UgZm9yIDwKPiA+IGhkbWkgMi4wIGFuZCBzZWxlY3RhYmxl IG9uIHNvbWUgaGRtaSAyLjAgY2FwYWJsZSBzaW5rcwo+IAo+IFRoaXMgaXMgcHJvYmFibHkgdHJ1 ZSBpZiB5b3VyIHNpbmsgaXMgYSBUViwgZm9yIG1vbml0b3JzIHdpdGggSERNSQo+IGNvbm5lY3Rp b25zIEkgd291bGQgZXhwZWN0IG9yIGF0IGxlYXN0IGxpa2UgdG8gaGF2ZSBhbiBvcHRpb24gdG8g dXNlIHJnYjQ0NAo+IGZ1bGwgcmFuZ2UgbW9kZSBmb3IgYW55IGRlc2t0b3Agb3IgZ2FtaW5nIG9y IHNpbWlsYXIgdXNlLWNhc2UuCgpXZWxsLCB0aGluZyBpcyB0aGF0IENFQSA4NjEgY2xlYXJseSBz dGF0ZXMgdGhhdCBmb3IgQ0VBIG1vZGVzICg3MjBwLCAxMDgwcCwgCjIxNjBwLCBldGMuKSBsaW1p dGVkIHJhbmdlIHNob3VsZCBiZSBhbHNvIHVzZWQgZm9yIFJHQiBjb2xvciBzcGFjZS4gV2l0aCAK aW1wbGVtZW50ZWQgbG9naWMgdG8gZGV0ZWN0IGlmIFJHQiBsaW1pdGVkIHJhbmdlIGlzIG5lZWRl ZCBvciBub3QgYW5kIAppbmRpY2F0aW5nIHRoYXQgaW4gQVZJIGZyYW1lLCBJIGZpbmFsbHkgZ2V0 IHByb3BlciAoYmV0dGVyPykgY29sb3IgcmVwcm9kdWN0aW9uIAp3aXRoIFBDIG1vbml0b3IgYW5k IFRWIGF0IHRoZSBzYW1lIHRpbWUuIEknbSBub3Qgc3VyZSBpZiB0aGVyZSBpcyBhbnkgd2F5IHRv IApkZXRlY3QgImZ1bGwgcmFuZ2UgUkdCIiBjYXBhYmxlIGRpc3BsYXlzLiBIb3dldmVyLCB3ZSBj YW4gYWx3YXlzIGltcGxlbWVudCAKY29ubmVjdG9yIHByb3BlcnR5IGxpa2UgSW50ZWwgZGlkIGlu IGk5MTUgZHJpdmVyICJCcm9hZGNhc3QgUkdCIiwgd2hpY2ggY2FuIApvdmVycmlkZSBSR0IgcXVh bnRpemF0aW9uIG1vZGUuCgo+IAo+ID4gQW55d2F5LCB0aGVyZSBpcyBubyB1bml2ZXJzYWwgc29s dXRpb24gdG8gYXZvaWQgY29sb3Igc3BhY2UgY29udmVyc2lvbiBpbgo+ID4gYWxsIGNhc2VzLiBG b3IgZXhhbXBsZSwgZHVlIHRvIGRlc2lnbiBvZiBBbGx3aW5uZXIgRGlzcGxheSBFbmdpbmUgMiwg aXQKPiA+IGNhbiBvbmx5IHdvcmsgaW4gUkdCIGZvcm1hdCBpbnRlcm5hbGx5LCBidXQgaXQgY2Fu IGNvbnZlcnQgZmluYWwgb3V0cHV0Cj4gPiB0byBZQ2JDciByaWdodCBiZWZvcmUgaXQncyBmZWVk ZWQgdG8gRFcgSERNSS4gT24gdGhlIG90aGVyIGhhbmQsIHlvdSBoYXZlCj4gPiBtZXNvbiBkaXNw bGF5IHBpcGVsaW5lIHdoaWNoIHdvcmtzIGluIFlDYkNyIGZvcm1hdCBpbnRlcm5hbGx5IGFuZCBy ZWxpZXMKPiA+IG9uIERXIEhETUkgQ1NDIHVuaXQgdG8gY29udmVydCBvdXRwdXQgdG8gUkdCLiBG b3J0dW5hdGVseSwgdGhlcmUgYXJlIGFsc28KPiA+IGRpc3BsYXkgcGlwZWxpbmVzIHdoaWNoIGNh biB3b3JrIGluIGFueSBjb2xvcnNwYWNlIGludGVybmFsbHksIGxpa2UKPiA+IEFsbHdpbm5lciBE aXNwbGF5IEVuZ2luZSAzLiBOb3Qgc3VyZSBpbiB3aGljaCBjYXRlZ29yeSBSb2NrY2hpcCBkaXNw bGF5Cj4gPiBwaXBlbGluZSBmYWxscyBpbnRvLgo+IAo+IEFncmVlLCBhbmQgZm9yIFJvY2tjaGlw IHRvIG15IGtub3dsZWRnZSBSSzMyODggVk9QIChWaWRlbyBPdXRwdXQgUHJvY2Vzc29yKQo+IGNh biBvbmx5IG91dHB1dCA4LzEwLWJpdCByZ2IgKGZ1bGwgcmFuZ2UpIHRvIERXLUhETUkuCj4gQW5k IHRoZSBWT1AgaW4gUkszMjJ4L1JLMzMyOC9SSzMzOTkgY2FuIG91dHB1dCA4LzEwLWJpdCByZ2Ig YW5kIDQ0NC80MjAgeXV2Lgo+IEkgZG8gbm90IGtub3cgaG93IHRoZSBWT1AgaGFuZGxlcyBpbnRl cm5hbCBjb2xvciBjb252ZXJzaW9uLgo+IAo+ID4+IE9uIFJvY2tjaGlwIFNvQ3MgdGhlIGRpc3Bs YXkgY29udHJvbGxlciBjYW5ub3Qgb3V0cHV0IHl1djQyMiB0byBkdy1oZG1pCj4gPj4gYmxvY2ss IHRoZSBvcHRpbWFsIG91dHB1dCBmb3JtYXQgc2VsZWN0aW9uIGluIHN1Y2ggY2FzZSBzaG91bGQg cHV0IHl1djQyMgo+ID4+IGxhc3QuCj4gPiAKPiA+IE5vdGUgdGhhdCBEVyBIRE1JIGhhcyBkZWNp bWF0aW9uIHN1cHBvcnQgd2hpY2ggY29udmVydHMgNDQ0IHRvIDQyMi4gVGhpcwo+ID4gaXMKPiA+ IHBhcnQgb2YgQ1NDIHVuaXQuCj4gCj4gVGhpcyB3b3JrcyBhcyBpdCBzaG91bGQgKGFmdGVyIGEg cGF0Y2ggdG8gZGlzYWJsZSBjb2xvciBjb252ZXJzaW9uIGZvciA0NDQKPiB0byA0MjIpLCAKClll YWgsIEkgbm90aWNlZCB0aGF0IHRvbywgSSBwbGFuIHRvIHNlbmQgYSBwYXRjaCBmb3IgdGhhdCBz b29uLgoKPiB0aGUgaXNzdWUgSSBzZWUgaXMgdGhhdCB0aGUgZm9ybWF0IG5lZ290aWF0aW9uIGNv ZGUgd2lsbCBjdXJyZW50bHkKPiBmYXZvciA0NDQgdG8gNDIyIGRlY2ltYXRpb24gb3ZlciB1c2lu ZyA0NDQgb3V0cHV0Lgo+IE5vdGU6IDQyMiB3aWxsIG5vdCBiZSBzZWxlY3RlZCBvdmVyIDQ0NCBj dXJyZW50bHkgaW4gY2FzZSBzaW5rIHJlcG9ydCBkZWVwCj4gY29sb3Igc3VwcG9ydCBkdWUgdG8g ZHJtIGVkaWQgcGFyc2luZyBjb2RlIGZvbGxvd2luZyBIRE1JIDEuMyBzcGVjLCBzZWUKPiBbMV0u Cj4gCj4gWzFdCj4gaHR0cHM6Ly9naXRodWIuY29tL3RvcnZhbGRzL2xpbnV4L2Jsb2IvbWFzdGVy L2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jI0w0Cj4gODAxLUw0ODA2Cj4gPiBTaWRlIG5vdGU6 IENTQyB1bml0IGlzIG9wdGlvbmFsIGZlYXR1cmUgb2YgRFctSERNSSBhbmQgcHJlc2VuY2UgaXMK PiA+IGluZGljYXRlZCBieSBjb25maWcgcmVnaXN0ZXIuIEhvd2V2ZXIsIGl0IHNlZW1zIHRoYXQg Q1NDIHN1cHBvcnQgaXMKPiA+IGJyb2tlbiBpbiBEVyBIRE1JIGNvbnRyb2xsZXIgb24gNDBubSBB bGx3aW5uZXIgU29Dcy4gSWYgaXQgaXMgZW5hYmxlZCwgVFYKPiA+IGxvc2VzIHNpZ25hbC4gSSBo YXZlIHRvIGludmVzdGlnYXRlIGlmIG9ubHkgQ1NDIGlzIGJyb2tlbiBvciBkZWNpbWF0aW9uCj4g PiBhbHNvIGRvbid0IHdvcmsuPiAKClNjcmF0Y2ggYWJvdmUsIERXIEhETUkgQ1NDIHVuaXQgd29y a3Mgb2sgb24gQWxsd2lubmVyIFNvQ3MsIEkganVzdCBmb3Jnb3QgdG8gCmVuYWJsZSBDU0MgY2xv Y2suCgo+ID4+IE1heWJlIGR3LWhkbWkgY2FuIGNhbGwgYSBkdy1oZG1pIGdsdWUgZHJpdmVyIGNh bGxiYWNrIHRvIGdldCB0aGUKPiA+PiBwcmVmZXJyZWQKPiA+PiBvdXRwdXQgZm9ybWF0IG9yZGVy Pwo+ID4+IAo+ID4+IE9uIGEgc2lkZSBub3RlIGJ1dCByZWxhdGVkIGlzc3VlLCB0aGUgZHctaGRt aSBmb3JtYXQgbmVnb3RpYXRpb24gY29kZQo+ID4+IHNob3VsZCBwcm9iYWJseSBhbHNvIGZpbHRl ciBtb2RlcyBvbiB0bWRzIHJhdGUsIHNvbWV0aGluZyBsaWtlIFsxXS4KPiA+PiBJdCBpcyBuZWVk ZWQgdG8gZmlsdGVyIG91dCBkZWVwIGNvbG9yIG1vZGVzIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBi eSB0aGUKPiA+PiBzaW5rIG9yIGhkbWkgc3BlYy4KPiA+IAo+ID4gQWgsIHlvdSBtZWFuIG9uIFRN RFMgcmF0ZXMgc3VwcG9ydGVkIGJ5IHRoZSBzaW5rLiBDb3VsZCB0aGlzIGF2b2lkIFNhbXN1bmcK PiA+IGRlZXAgY29sb3IgaXNzdWVzPyBJZiBzbywgd2UgZG9uJ3QgbmVlZCBibGFja2xpc3QgdGhl bi4KPiAKPiBJIGRvIG5vdCB0aGluayBzbywgdGhlIGluaXRpYWwgaXNzdWUgd2FzIHJlcG9ydGVk IHdpdGggaW50ZWwgZ3JhcGhpY3MgYnV0Cj4gbG9va2luZyBhdCB0aGUgZWRpZCBhbmQgY29tcGFy aW5nIHRvIHRoZSBtYW51YWwgb2Ygc3VwcG9ydGVkIG1vZGVzIHRoZXkgZG8KPiBub3QgZnVsbHkg bWF0Y2guIFNlZSBtYW51YWwgaW5mbyBhdCBbMl0gYW5kIGVkaWQgd2hlbiBVSEQgbW9kZSBpcyBv ZmYgYXQKPiBbM10gYW5kIHdoZW4gb24gYXQgWzRdLgoKV2hpY2ggcGFydCBkb2Vzbid0IG1hdGNo PyBJIGRvbid0IHNlZSBhbnkgaXNzdWUuCgpCZXN0IHJlZ2FyZHMsCkplcm5lagoKPiAKPiBbMl0K PiBodHRwczovL2dpdGxhYi5mcmVlZGVza3RvcC5vcmcvZHJtL2ludGVsL3VwbG9hZHMvMzY2MzBj OGE3MjdiZjhjNjZhNTNmZDc0NzAKPiBjODgzODMvTVU3MDAwX21hbnVhbF8tX1VIRF9jb2xvdXJf bW9kZXMuUE5HIFszXSBodHRwOi8vaXguaW8vMUgyNQo+IFs0XSBodHRwOi8vaXguaW8vMUgyZQo+ IAo+ID4gQmVzdCByZWdhcmRzLAo+ID4gSmVybmVqCj4gPiAKPiA+PiBbMV0KPiA+PiBodHRwczov L2dpdGh1Yi5jb20vS3dpYm9vL2xpbnV4LXJvY2tjaGlwL2NvbW1pdC9mYzNkZjY5MDMzODRlNzY0 YWI2YWM1OTg3Cj4gPj4gOWMKPiA+PiA0ODljYmVmNTVmY2JlCj4gPj4gCj4gPj4gQmVzdCByZWdh cmRzLAo+ID4+IEpvbmFzCj4gPj4gCj4gPj4+IEJlc3QgcmVnYXJkcywKPiA+Pj4gSmVybmVqCj4g Pj4+IAo+ID4+Pj4gKwl9Cj4gPj4+PiArCj4gPj4+PiArCS8qCj4gPj4+PiArCSAqIE9yZGVyIGJ1 cyBmb3JtYXRzIGZyb20gMTZiaXQgdG8gOGJpdCBhbmQgZnJvbSBZVVY0MjIgdG8gUkdCCj4gPj4+ PiArCSAqIGlmIHN1cHBvcnRlZC4gSW4gYW55IGNhc2UgdGhlIGRlZmF1bHQgUkdCODg4IGZvcm1h dCBpcyBhZGRlZAo+ID4+Pj4gKwkgKi8KPiA+Pj4+ICsKPiA+Pj4+ICsJaWYgKG1heF9icGMgPj0g MTYgJiYgaW5mby0+YnBjID09IDE2KSB7Cj4gPj4+PiArCQlpZiAoaW5mby0+Y29sb3JfZm9ybWF0 cyAmIERSTV9DT0xPUl9GT1JNQVRfWUNSQ0I0NDQpCj4gPj4+PiArCQkJb3V0cHV0X2ZtdHNbaSsr XSA9IE1FRElBX0JVU19GTVRfWVVWMTZfMVg0ODsKPiA+Pj4+ICsKPiA+Pj4+ICsJCW91dHB1dF9m bXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1JHQjE2MTYxNl8xWDQ4Owo+ID4+Pj4gKwl9Cj4gPj4+ PiArCj4gPj4+PiArCWlmIChtYXhfYnBjID49IDEyICYmIGluZm8tPmJwYyA+PSAxMikgewo+ID4+ Pj4gKwkJaWYgKGluZm8tPmNvbG9yX2Zvcm1hdHMgJiBEUk1fQ09MT1JfRk9STUFUX1lDUkNCNDIy KQo+ID4+Pj4gKwkJCW91dHB1dF9mbXRzW2krK10gPQo+ID4gCj4gPiBNRURJQV9CVVNfRk1UX1VZ VlkxMl8xWDI0Owo+ID4gCj4gPj4+PiArCj4gPj4+PiArCQlpZiAoaW5mby0+Y29sb3JfZm9ybWF0 cyAmIERSTV9DT0xPUl9GT1JNQVRfWUNSQ0I0NDQpCj4gPj4+PiArCQkJb3V0cHV0X2ZtdHNbaSsr XSA9IE1FRElBX0JVU19GTVRfWVVWMTJfMVgzNjsKPiA+Pj4+ICsKPiA+Pj4+ICsJCW91dHB1dF9m bXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1JHQjEyMTIxMl8xWDM2Owo+ID4+Pj4gKwl9Cj4gPj4+ PiArCj4gPj4+PiArCWlmIChtYXhfYnBjID49IDEwICYmIGluZm8tPmJwYyA+PSAxMCkgewo+ID4+ Pj4gKwkJaWYgKGluZm8tPmNvbG9yX2Zvcm1hdHMgJiBEUk1fQ09MT1JfRk9STUFUX1lDUkNCNDIy KQo+ID4+Pj4gKwkJCW91dHB1dF9mbXRzW2krK10gPQo+ID4gCj4gPiBNRURJQV9CVVNfRk1UX1VZ VlkxMF8xWDIwOwo+ID4gCj4gPj4+PiArCj4gPj4+PiArCQlpZiAoaW5mby0+Y29sb3JfZm9ybWF0 cyAmIERSTV9DT0xPUl9GT1JNQVRfWUNSQ0I0NDQpCj4gPj4+PiArCQkJb3V0cHV0X2ZtdHNbaSsr XSA9IE1FRElBX0JVU19GTVRfWVVWMTBfMVgzMDsKPiA+Pj4+ICsKPiA+Pj4+ICsJCW91dHB1dF9m bXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1JHQjEwMTAxMF8xWDMwOwo+ID4+Pj4gKwl9Cj4gPj4+ PiArCj4gPj4+PiArCWlmIChpbmZvLT5jb2xvcl9mb3JtYXRzICYgRFJNX0NPTE9SX0ZPUk1BVF9Z Q1JDQjQyMikKPiA+Pj4+ICsJCW91dHB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1VZVlk4 XzFYMTY7Cj4gPj4+PiArCj4gPj4+PiArCWlmIChpbmZvLT5jb2xvcl9mb3JtYXRzICYgRFJNX0NP TE9SX0ZPUk1BVF9ZQ1JDQjQ0NCkKPiA+Pj4+ICsJCW91dHB1dF9mbXRzW2krK10gPSBNRURJQV9C VVNfRk1UX1lVVjhfMVgyNDsKPiA+Pj4+ICsKPiA+Pj4+ICsJLyogRGVmYXVsdCA4Yml0IFJHQiBm YWxsYmFjayAqLwo+ID4+Pj4gKwlvdXRwdXRfZm10c1tpKytdID0gTUVESUFfQlVTX0ZNVF9SR0I4 ODhfMVgyNDsKPiA+Pj4+ICsKPiA+Pj4+ICsJKm51bV9vdXRwdXRfZm10cyA9IGk7Cj4gPj4+PiAr Cj4gPj4+PiArCXJldHVybiBvdXRwdXRfZm10czsKPiA+Pj4+ICt9Cj4gPj4+PiArCj4gPj4+PiAr LyoKPiA+Pj4+ICsgKiBQb3NzaWJsZSBpbnB1dCBmb3JtYXRzIDoKPiA+Pj4+ICsgKiAtIE1FRElB X0JVU19GTVRfUkdCODg4XzFYMjQKPiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfWVVWOF8xWDI0 Cj4gPj4+PiArICogLSBNRURJQV9CVVNfRk1UX1VZVlk4XzFYMTYKPiA+Pj4+ICsgKiAtIE1FRElB X0JVU19GTVRfVVlZVllZOF8wXzVYMjQKPiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfUkdCMTAx MDEwXzFYMzAKPiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfWVVWMTBfMVgzMAo+ID4+Pj4gKyAq IC0gTUVESUFfQlVTX0ZNVF9VWVZZMTBfMVgyMAo+ID4+Pj4gKyAqIC0gTUVESUFfQlVTX0ZNVF9V WVlWWVkxMF8wXzVYMzAKPiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfUkdCMTIxMjEyXzFYMzYK PiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfWVVWMTJfMVgzNgo+ID4+Pj4gKyAqIC0gTUVESUFf QlVTX0ZNVF9VWVZZMTJfMVgyNAo+ID4+Pj4gKyAqIC0gTUVESUFfQlVTX0ZNVF9VWVlWWVkxMl8w XzVYMzYKPiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfUkdCMTYxNjE2XzFYNDgKPiA+Pj4+ICsg KiAtIE1FRElBX0JVU19GTVRfWVVWMTZfMVg0OAo+ID4+Pj4gKyAqIC0gTUVESUFfQlVTX0ZNVF9V WVlWWVkxNl8wXzVYNDgKPiA+Pj4+ICsgKi8KPiA+Pj4+ICsKPiA+Pj4+ICsvKiBDYW4gcmV0dXJu IGEgbWF4aW11bSBvZiA0IHBvc3NpYmxlIGlucHV0IGZvcm1hdHMgZm9yIGFuIG91dHB1dAo+ID4+ Pj4gZm9ybWF0Cj4gPj4+PiAqLyArI2RlZmluZSBNQVhfSU5QVVRfU0VMX0ZPUk1BVFMJNAo+ID4+ Pj4gKwo+ID4+Pj4gK3N0YXRpYyB1MzIgKmR3X2hkbWlfYnJpZGdlX2F0b21pY19nZXRfaW5wdXRf YnVzX2ZtdHMoc3RydWN0IGRybV9icmlkZ2UKPiA+Pj4+ICpicmlkZ2UsICsJCQkJCXN0cnVjdAo+ ID4+PiAKPiA+Pj4gZHJtX2JyaWRnZV9zdGF0ZSAqYnJpZGdlX3N0YXRlLAo+ID4+PiAKPiA+Pj4+ ICsJCQkJCXN0cnVjdCBkcm1fY3J0Y19zdGF0ZQo+ID4+PiAKPiA+Pj4gKmNydGNfc3RhdGUsCj4g Pj4+IAo+ID4+Pj4gKwkJCQkJc3RydWN0Cj4gPj4+IAo+ID4+PiBkcm1fY29ubmVjdG9yX3N0YXRl ICpjb25uX3N0YXRlLAo+ID4+PiAKPiA+Pj4+ICsJCQkJCXUzMiBvdXRwdXRfZm10LAo+ID4+Pj4g KwkJCQkJdW5zaWduZWQgaW50Cj4gPj4+IAo+ID4+PiAqbnVtX2lucHV0X2ZtdHMpCj4gPj4+IAo+ ID4+Pj4gK3sKPiA+Pj4+ICsJdTMyICppbnB1dF9mbXRzOwo+ID4+Pj4gKwlpbnQgaSA9IDA7Cj4g Pj4+PiArCj4gPj4+PiArCSpudW1faW5wdXRfZm10cyA9IDA7Cj4gPj4+PiArCj4gPj4+PiArCWlu cHV0X2ZtdHMgPSBrY2FsbG9jKE1BWF9JTlBVVF9TRUxfRk9STUFUUywgc2l6ZW9mKCppbnB1dF9m bXRzKSwKPiA+Pj4+ICsJCQkgICAgIEdGUF9LRVJORUwpOwo+ID4+Pj4gKwlpZiAoIWlucHV0X2Zt dHMpCj4gPj4+PiArCQlyZXR1cm4gTlVMTDsKPiA+Pj4+ICsKPiA+Pj4+ICsJc3dpdGNoIChvdXRw dXRfZm10KSB7Cj4gPj4+PiArCS8qIDhiaXQgKi8KPiA+Pj4+ICsJY2FzZSBNRURJQV9CVVNfRk1U X1JHQjg4OF8xWDI0Ogo+ID4+Pj4gKwkJaW5wdXRfZm10c1tpKytdID0gTUVESUFfQlVTX0ZNVF9S R0I4ODhfMVgyNDsKPiA+Pj4+ICsJCWlucHV0X2ZtdHNbaSsrXSA9IE1FRElBX0JVU19GTVRfWVVW OF8xWDI0Owo+ID4+Pj4gKwkJaW5wdXRfZm10c1tpKytdID0gTUVESUFfQlVTX0ZNVF9VWVZZOF8x WDE2Owo+ID4+Pj4gKwkJYnJlYWs7Cj4gPj4+PiArCWNhc2UgTUVESUFfQlVTX0ZNVF9ZVVY4XzFY MjQ6Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1lVVjhfMVgyNDsK PiA+Pj4+ICsJCWlucHV0X2ZtdHNbaSsrXSA9IE1FRElBX0JVU19GTVRfVVlWWThfMVgxNjsKPiA+ Pj4+ICsJCWlucHV0X2ZtdHNbaSsrXSA9IE1FRElBX0JVU19GTVRfUkdCODg4XzFYMjQ7Cj4gPj4+ PiArCQlicmVhazsKPiA+Pj4+ICsJY2FzZSBNRURJQV9CVVNfRk1UX1VZVlk4XzFYMTY6Cj4gPj4+ PiArCQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1VZVlk4XzFYMTY7Cj4gPj4+PiAr CQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1lVVjhfMVgyNDsKPiA+Pj4+ICsJCWlu cHV0X2ZtdHNbaSsrXSA9IE1FRElBX0JVU19GTVRfUkdCODg4XzFYMjQ7Cj4gPj4+PiArCQlicmVh azsKPiA+Pj4+ICsKPiA+Pj4+ICsJLyogMTBiaXQgKi8KPiA+Pj4+ICsJY2FzZSBNRURJQV9CVVNf Rk1UX1JHQjEwMTAxMF8xWDMwOgo+ID4+Pj4gKwkJaW5wdXRfZm10c1tpKytdID0gTUVESUFfQlVT X0ZNVF9SR0IxMDEwMTBfMVgzMDsKPiA+Pj4+ICsJCWlucHV0X2ZtdHNbaSsrXSA9IE1FRElBX0JV U19GTVRfWVVWMTBfMVgzMDsKPiA+Pj4+ICsJCWlucHV0X2ZtdHNbaSsrXSA9IE1FRElBX0JVU19G TVRfVVlWWTEwXzFYMjA7Cj4gPj4+PiArCQlicmVhazsKPiA+Pj4+ICsJY2FzZSBNRURJQV9CVVNf Rk1UX1lVVjEwXzFYMzA6Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1U X1lVVjEwXzFYMzA7Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1VZ VlkxMF8xWDIwOwo+ID4+Pj4gKwkJaW5wdXRfZm10c1tpKytdID0gTUVESUFfQlVTX0ZNVF9SR0Ix MDEwMTBfMVgzMDsKPiA+Pj4+ICsJCWJyZWFrOwo+ID4+Pj4gKwljYXNlIE1FRElBX0JVU19GTVRf VVlWWTEwXzFYMjA6Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1VZ VlkxMF8xWDIwOwo+ID4+Pj4gKwkJaW5wdXRfZm10c1tpKytdID0gTUVESUFfQlVTX0ZNVF9ZVVYx MF8xWDMwOwo+ID4+Pj4gKwkJaW5wdXRfZm10c1tpKytdID0gTUVESUFfQlVTX0ZNVF9SR0IxMDEw MTBfMVgzMDsKPiA+Pj4+ICsJCWJyZWFrOwo+ID4+Pj4gKwo+ID4+Pj4gKwkvKiAxMmJpdCAqLwo+ ID4+Pj4gKwljYXNlIE1FRElBX0JVU19GTVRfUkdCMTIxMjEyXzFYMzY6Cj4gPj4+PiArCQlpbnB1 dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1JHQjEyMTIxMl8xWDM2Owo+ID4+Pj4gKwkJaW5w dXRfZm10c1tpKytdID0gTUVESUFfQlVTX0ZNVF9ZVVYxMl8xWDM2Owo+ID4+Pj4gKwkJaW5wdXRf Zm10c1tpKytdID0gTUVESUFfQlVTX0ZNVF9VWVZZMTJfMVgyNDsKPiA+Pj4+ICsJCWJyZWFrOwo+ ID4+Pj4gKwljYXNlIE1FRElBX0JVU19GTVRfWVVWMTJfMVgzNjoKPiA+Pj4+ICsJCWlucHV0X2Zt dHNbaSsrXSA9IE1FRElBX0JVU19GTVRfWVVWMTJfMVgzNjsKPiA+Pj4+ICsJCWlucHV0X2ZtdHNb aSsrXSA9IE1FRElBX0JVU19GTVRfVVlWWTEyXzFYMjQ7Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2kr K10gPSBNRURJQV9CVVNfRk1UX1JHQjEyMTIxMl8xWDM2Owo+ID4+Pj4gKwkJYnJlYWs7Cj4gPj4+ PiArCWNhc2UgTUVESUFfQlVTX0ZNVF9VWVZZMTJfMVgyNDoKPiA+Pj4+ICsJCWlucHV0X2ZtdHNb aSsrXSA9IE1FRElBX0JVU19GTVRfVVlWWTEyXzFYMjQ7Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2kr K10gPSBNRURJQV9CVVNfRk1UX1lVVjEyXzFYMzY7Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10g PSBNRURJQV9CVVNfRk1UX1JHQjEyMTIxMl8xWDM2Owo+ID4+Pj4gKwkJYnJlYWs7Cj4gPj4+PiAr Cj4gPj4+PiArCS8qIDE2Yml0ICovCj4gPj4+PiArCWNhc2UgTUVESUFfQlVTX0ZNVF9SR0IxNjE2 MTZfMVg0ODoKPiA+Pj4+ICsJCWlucHV0X2ZtdHNbaSsrXSA9IE1FRElBX0JVU19GTVRfUkdCMTYx NjE2XzFYNDg7Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1lVVjE2 XzFYNDg7Cj4gPj4+PiArCQlicmVhazsKPiA+Pj4+ICsJY2FzZSBNRURJQV9CVVNfRk1UX1lVVjE2 XzFYNDg6Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1lVVjE2XzFY NDg7Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1JHQjE2MTYxNl8x WDQ4Owo+ID4+Pj4gKwkJYnJlYWs7Cj4gPj4+PiArCj4gPj4+PiArCS8qIDQyMCAqLwo+ID4+Pj4g KwljYXNlIE1FRElBX0JVU19GTVRfVVlZVllZOF8wXzVYMjQ6Cj4gPj4+PiArCWNhc2UgTUVESUFf QlVTX0ZNVF9VWVlWWVkxMF8wXzVYMzA6Cj4gPj4+PiArCWNhc2UgTUVESUFfQlVTX0ZNVF9VWVlW WVkxMl8wXzVYMzY6Cj4gPj4+PiArCWNhc2UgTUVESUFfQlVTX0ZNVF9VWVlWWVkxNl8wXzVYNDg6 Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10gPSBvdXRwdXRfZm10Owo+ID4+Pj4gKwkJYnJlYWs7 Cj4gPj4+PiArCX0KPiA+Pj4+ICsKPiA+Pj4+ICsJKm51bV9pbnB1dF9mbXRzID0gaTsKPiA+Pj4+ ICsKPiA+Pj4+ICsJaWYgKCpudW1faW5wdXRfZm10cyA9PSAwKSB7Cj4gPj4+PiArCQlrZnJlZShp bnB1dF9mbXRzKTsKPiA+Pj4+ICsJCWlucHV0X2ZtdHMgPSBOVUxMOwo+ID4+Pj4gKwl9Cj4gPj4+ PiArCj4gPj4+PiArCXJldHVybiBpbnB1dF9mbXRzOwo+ID4+Pj4gK30KPiA+Pj4+ICsKPiA+Pj4+ ICtzdGF0aWMgaW50IGR3X2hkbWlfYnJpZGdlX2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX2JyaWRn ZSAqYnJpZGdlLAo+ID4+Pj4gKwkJCQkgICAgICAgc3RydWN0IGRybV9icmlkZ2Vfc3RhdGUKPiA+ Pj4gCj4gPj4+ICpicmlkZ2Vfc3RhdGUsCj4gPj4+IAo+ID4+Pj4gKwkJCQkgICAgICAgc3RydWN0 IGRybV9jcnRjX3N0YXRlCj4gPj4+IAo+ID4+PiAqY3J0Y19zdGF0ZSwKPiA+Pj4gCj4gPj4+PiAr CQkJCSAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZQo+ID4+PiAKPiA+Pj4gKmNvbm5f c3RhdGUpCj4gPj4+IAo+ID4+Pj4gK3sKPiA+Pj4+ICsJc3RydWN0IGR3X2hkbWkgKmhkbWkgPSBi cmlkZ2UtPmRyaXZlcl9wcml2YXRlOwo+ID4+Pj4gKwo+ID4+Pj4gKwlkZXZfZGJnKGhkbWktPmRl diwgInNlbGVjdGVkIG91dHB1dCBmb3JtYXQgJXhcbiIsCj4gPj4+PiArCQkJYnJpZGdlX3N0YXRl LT5vdXRwdXRfYnVzX2NmZy5mb3JtYXQpOwo+ID4+Pj4gKwo+ID4+Pj4gKwloZG1pLT5oZG1pX2Rh dGEuZW5jX291dF9idXNfZm9ybWF0ID0KPiA+Pj4+ICsJCQlicmlkZ2Vfc3RhdGUtPm91dHB1dF9i dXNfY2ZnLmZvcm1hdDsKPiA+Pj4+ICsKPiA+Pj4+ICsJZGV2X2RiZyhoZG1pLT5kZXYsICJzZWxl Y3RlZCBpbnB1dCBmb3JtYXQgJXhcbiIsCj4gPj4+PiArCQkJYnJpZGdlX3N0YXRlLT5pbnB1dF9i dXNfY2ZnLmZvcm1hdCk7Cj4gPj4+PiArCj4gPj4+PiArCWhkbWktPmhkbWlfZGF0YS5lbmNfaW5f YnVzX2Zvcm1hdCA9Cj4gPj4+PiArCQkJYnJpZGdlX3N0YXRlLT5pbnB1dF9idXNfY2ZnLmZvcm1h dDsKPiA+Pj4+ICsKPiA+Pj4+ICsJcmV0dXJuIDA7Cj4gPj4+PiArfQo+ID4+Pj4gKwo+ID4+Pj4g Cj4gPj4+PiAgc3RhdGljIGludCBkd19oZG1pX2JyaWRnZV9hdHRhY2goc3RydWN0IGRybV9icmlk Z2UgKmJyaWRnZSkKPiA+Pj4+ICB7Cj4gPj4+PiAgCj4gPj4+PiAgCXN0cnVjdCBkd19oZG1pICpo ZG1pID0gYnJpZGdlLT5kcml2ZXJfcHJpdmF0ZTsKPiA+Pj4+IAo+ID4+Pj4gQEAgLTI0OTksNiAr Mjc1OSw5IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2JyaWRnZV9mdW5jcwo+ID4+Pj4gZHdf aGRtaV9icmlkZ2VfZnVuY3MgPSB7IC5hdG9taWNfcmVzZXQgPQo+ID4+Pj4gZHJtX2F0b21pY19o ZWxwZXJfYnJpZGdlX3Jlc2V0LAo+ID4+Pj4gCj4gPj4+PiAgCS5hdHRhY2ggPSBkd19oZG1pX2Jy aWRnZV9hdHRhY2gsCj4gPj4+PiAgCS5kZXRhY2ggPSBkd19oZG1pX2JyaWRnZV9kZXRhY2gsCj4g Pj4+PiAKPiA+Pj4+ICsJLmF0b21pY19jaGVjayA9IGR3X2hkbWlfYnJpZGdlX2F0b21pY19jaGVj aywKPiA+Pj4+ICsJLmF0b21pY19nZXRfb3V0cHV0X2J1c19mbXRzID0KPiA+Pj4gCj4gPj4+IGR3 X2hkbWlfYnJpZGdlX2F0b21pY19nZXRfb3V0cHV0X2J1c19mbXRzLAo+ID4+PiAKPiA+Pj4+ICsJ LmF0b21pY19nZXRfaW5wdXRfYnVzX2ZtdHMgPQo+ID4+PiAKPiA+Pj4gZHdfaGRtaV9icmlkZ2Vf YXRvbWljX2dldF9pbnB1dF9idXNfZm10cywKPiA+Pj4gCj4gPj4+PiAgCS5lbmFibGUgPSBkd19o ZG1pX2JyaWRnZV9lbmFibGUsCj4gPj4+PiAgCS5kaXNhYmxlID0gZHdfaGRtaV9icmlkZ2VfZGlz YWJsZSwKPiA+Pj4+ICAJLm1vZGVfc2V0ID0gZHdfaGRtaV9icmlkZ2VfbW9kZV9zZXQsCj4gPj4+ PiAKPiA+Pj4+IEBAIC0yOTYzLDYgKzMyMjYsNyBAQCBfX2R3X2hkbWlfcHJvYmUoc3RydWN0IHBs YXRmb3JtX2RldmljZSAqcGRldiwKPiA+Pj4+IAo+ID4+Pj4gIAloZG1pLT5icmlkZ2UuZHJpdmVy X3ByaXZhdGUgPSBoZG1pOwo+ID4+Pj4gIAloZG1pLT5icmlkZ2UuZnVuY3MgPSAmZHdfaGRtaV9i cmlkZ2VfZnVuY3M7Cj4gPj4+PiAKPiA+Pj4+ICsKPiA+Pj4+IAo+ID4+Pj4gICNpZmRlZiBDT05G SUdfT0YKPiA+Pj4+ICAKPiA+Pj4+ICAJaGRtaS0+YnJpZGdlLm9mX25vZGUgPSBwZGV2LT5kZXYu b2Zfbm9kZTsKPiA+Pj4+ICAKPiA+Pj4+ICAjZW5kaWYKCgoKCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRl dmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo= 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=-11.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,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 319A2C3F2CD for ; Sat, 29 Feb 2020 14:42:52 +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 F318F2469C for ; Sat, 29 Feb 2020 14:42:51 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="Mui3V9YC" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org F318F2469C Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=siol.net Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-amlogic-bounces+linux-amlogic=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=DVOL0ixyn4GkN/QZ/Stbg7c/T1u8vgGZFRZ6lr/g3U8=; b=Mui3V9YCSO1QrZ 0behvwBBBjDepo6fDYoKI/PGRpXNpGOjrCCj/U6QUFVv3YFxxCF2QqaRqvGlR0zyamvC19JszzAs+ omFKrHup44BOuX8poWo2WauPwqb6v9YS1Vr5ix93jBHKfx7Nz4dhKOKrE+ix8fYmp4GdsjPYNh1vr i89iNV6aabLuLF70E50XPjAFJUP9iCbXl6FZAs2/X+UUomZVVw3Sj58s7xW4PDh0keB6gPCaToFmU B48eHp8/gm57Afomy6ceY9SEzDy3YVPQL2cfljOJ7kjKI2Wci0HwzHSr2K2dXkB+gJibffhJB95JM vc8hmrkuuVGRI0dr+Xkw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1j83KF-00046r-Fq; Sat, 29 Feb 2020 14:42:43 +0000 Received: from mailoutvs55.siol.net ([185.57.226.246] helo=mail.siol.net) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1j83KB-000466-0P for linux-amlogic@lists.infradead.org; Sat, 29 Feb 2020 14:42:42 +0000 Received: from localhost (localhost [127.0.0.1]) by mail.siol.net (Postfix) with ESMTP id 005B252143B; Sat, 29 Feb 2020 15:42:29 +0100 (CET) X-Virus-Scanned: amavisd-new at psrvmta09.zcs-production.pri Received: from mail.siol.net ([127.0.0.1]) by localhost (psrvmta09.zcs-production.pri [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id kYSbecqOzKhu; Sat, 29 Feb 2020 15:42:28 +0100 (CET) Received: from mail.siol.net (localhost [127.0.0.1]) by mail.siol.net (Postfix) with ESMTPS id B8B6E5235DA; Sat, 29 Feb 2020 15:42:28 +0100 (CET) Received: from jernej-laptop.localnet (cpe-194-152-20-232.static.triera.net [194.152.20.232]) (Authenticated sender: jernej.skrabec@siol.net) by mail.siol.net (Postfix) with ESMTPA id C571252143B; Sat, 29 Feb 2020 15:42:27 +0100 (CET) From: Jernej =?utf-8?B?xaBrcmFiZWM=?= To: a.hajda@samsung.com, Laurent.pinchart@ideasonboard.com, boris.brezillon@collabora.com, Neil Armstrong , Jonas Karlman Subject: Re: [PATCH v4 04/11] drm/bridge: synopsys: dw-hdmi: add bus format negociation Date: Sat, 29 Feb 2020 15:42:27 +0100 Message-ID: <105533194.nniJfEyVGO@jernej-laptop> In-Reply-To: References: <20200206191834.6125-1-narmstrong@baylibre.com> <2970638.5fSG56mABF@jernej-laptop> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200229_064239_368582_44A7078D X-CRM114-Status: GOOD ( 34.58 ) X-BeenThere: linux-amlogic@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-amlogic@lists.infradead.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-amlogic" Errors-To: linux-amlogic-bounces+linux-amlogic=archiver.kernel.org@lists.infradead.org RG5lIHNvYm90YSwgMjkuIGZlYnJ1YXIgMjAyMCBvYiAxMzoxNToyNiBDRVQgamUgSm9uYXMgS2Fy bG1hbiBuYXBpc2FsKGEpOgo+IE9uIDIwMjAtMDItMjkgMTI6MDcsIEplcm5laiDFoGtyYWJlYyB3 cm90ZToKPiA+IERuZSBzb2JvdGEsIDI5LiBmZWJydWFyIDIwMjAgb2IgMTE6MDk6MTQgQ0VUIGpl IEpvbmFzIEthcmxtYW4gbmFwaXNhbChhKToKPiA+PiBIaSBKZXJuZWosCj4gPj4gCj4gPj4gT24g MjAyMC0wMi0yOSAwODo0MiwgSmVybmVqIMWga3JhYmVjIHdyb3RlOgo+ID4+PiBIaSBOZWlsIQo+ ID4+PiAKPiA+Pj4gRG5lIMSNZXRydGVrLCAwNi4gZmVicnVhciAyMDIwIG9iIDIwOjE4OjI3IENF VCBqZSBOZWlsIEFybXN0cm9uZwo+ID4gCj4gPiBuYXBpc2FsKGEpOgo+ID4+Pj4gQWRkIHRoZSBh dG9taWNfZ2V0X291dHB1dF9idXNfZm10cywgYXRvbWljX2dldF9pbnB1dF9idXNfZm10cyB0bwo+ ID4+Pj4gbmVnb2NpYXRlCj4gPj4+PiB0aGUgcG9zc2libGUgb3V0cHV0IGFuZCBpbnB1dCBmb3Jt YXRzIGZvciB0aGUgY3VycmVudCBtb2RlIGFuZCBtb25pdG9yLAo+ID4+Pj4gYW5kIHVzZSB0aGUg bmVnb3RpYXRlZCBmb3JtYXRzIGluIGEgYmFzaWMgYXRvbWljX2NoZWNrIGNhbGxiYWNrLgo+ID4+ Pj4gCj4gPj4+PiBTaWduZWQtb2ZmLWJ5OiBOZWlsIEFybXN0cm9uZyA8bmFybXN0cm9uZ0BiYXls aWJyZS5jb20+Cj4gPj4+PiAtLS0KPiA+Pj4+IAo+ID4+Pj4gIGRyaXZlcnMvZ3B1L2RybS9icmlk Z2Uvc3lub3BzeXMvZHctaGRtaS5jIHwgMjcyICsrKysrKysrKysrKysrKysrKysrKy0KPiA+Pj4+ ICAxIGZpbGUgY2hhbmdlZCwgMjY4IGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25zKC0pCj4gPj4+ PiAKPiA+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL3N5bm9wc3lzL2R3 LWhkbWkuYwo+ID4+Pj4gYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL3N5bm9wc3lzL2R3LWhkbWku YyBpbmRleAo+ID4+Pj4gZmVjNGE0YmNkMWZlLi4xNTA0OGFkNjk0YmMgMTAwNjQ0Cj4gPj4+PiAt LS0gYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL3N5bm9wc3lzL2R3LWhkbWkuYwo+ID4+Pj4gKysr IGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9zeW5vcHN5cy9kdy1oZG1pLmMKPiA+Pj4+IEBAIC0y MDk1LDExICsyMDk1LDEwIEBAIHN0YXRpYyBpbnQgZHdfaGRtaV9zZXR1cChzdHJ1Y3QgZHdfaGRt aSAqaGRtaSwKPiA+Pj4+IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQo+ID4+Pj4gaGRt aS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubXBpeGVscmVwZXRpdGlvbm91dHB1dCA9IDA7Cj4gPj4+ PiAKPiA+Pj4+ICAJaGRtaS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubXBpeGVscmVwZXRpdGlvbmlu cHV0ID0gMDsKPiA+Pj4+IAo+ID4+Pj4gLQkvKiBUT0ZJWDogR2V0IGlucHV0IGZvcm1hdCBmcm9t IHBsYXQgZGF0YSBvciBmYWxsYmFjayB0byBSR0I4ODggKi8KPiA+Pj4+IAo+ID4+Pj4gIAlpZiAo aGRtaS0+cGxhdF9kYXRhLT5pbnB1dF9idXNfZm9ybWF0KQo+ID4+Pj4gIAkKPiA+Pj4+ICAJCWhk bWktPmhkbWlfZGF0YS5lbmNfaW5fYnVzX2Zvcm1hdCA9Cj4gPj4+PiAgCQkKPiA+Pj4+ICAJCQlo ZG1pLT5wbGF0X2RhdGEtPmlucHV0X2J1c19mb3JtYXQ7Cj4gPj4+PiAKPiA+Pj4+IC0JZWxzZQo+ ID4+Pj4gKwllbHNlIGlmIChoZG1pLT5oZG1pX2RhdGEuZW5jX2luX2J1c19mb3JtYXQgPT0gTUVE SUFfQlVTX0ZNVF9GSVhFRCkKPiA+Pj4+IAo+ID4+Pj4gIAkJaGRtaS0+aGRtaV9kYXRhLmVuY19p bl9idXNfZm9ybWF0ID0KPiA+Pj4gCj4gPj4+IE1FRElBX0JVU19GTVRfUkdCODg4XzFYMjQ7Cj4g Pj4+IAo+ID4+Pj4gIAkvKiBUT0ZJWDogR2V0IGlucHV0IGVuY29kaW5nIGZyb20gcGxhdCBkYXRh IG9yIGZhbGxiYWNrIHRvIG5vbmUgKi8KPiA+Pj4+IAo+ID4+Pj4gQEAgLTIxMDksOCArMjEwOCw4 IEBAIHN0YXRpYyBpbnQgZHdfaGRtaV9zZXR1cChzdHJ1Y3QgZHdfaGRtaSAqaGRtaSwKPiA+Pj4+ IHN0cnVjdAo+ID4+Pj4gZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkgZWxzZQo+ID4+Pj4gCj4gPj4+ PiAgCQloZG1pLT5oZG1pX2RhdGEuZW5jX2luX2VuY29kaW5nID0KPiA+Pj4gCj4gPj4+IFY0TDJf WUNCQ1JfRU5DX0RFRkFVTFQ7Cj4gPj4+IAo+ID4+Pj4gLQkvKiBUT0ZJWDogRGVmYXVsdCB0byBS R0I4ODggb3V0cHV0IGZvcm1hdCAqLwo+ID4+Pj4gLQloZG1pLT5oZG1pX2RhdGEuZW5jX291dF9i dXNfZm9ybWF0ID0gTUVESUFfQlVTX0ZNVF9SR0I4ODhfMVgyNDsKPiA+Pj4+ICsJaWYgKGhkbWkt PmhkbWlfZGF0YS5lbmNfb3V0X2J1c19mb3JtYXQgPT0gTUVESUFfQlVTX0ZNVF9GSVhFRCkKPiA+ Pj4+ICsJCWhkbWktPmhkbWlfZGF0YS5lbmNfb3V0X2J1c19mb3JtYXQgPQo+ID4+PiAKPiA+Pj4g TUVESUFfQlVTX0ZNVF9SR0I4ODhfMVgyNDsKPiA+Pj4gCj4gPj4+PiAgCWhkbWktPmhkbWlfZGF0 YS5waXhfcmVwZXRfZmFjdG9yID0gMDsKPiA+Pj4+ICAJaGRtaS0+aGRtaV9kYXRhLmhkY3BfZW5h YmxlID0gMDsKPiA+Pj4+IAo+ID4+Pj4gQEAgLTIzODgsNiArMjM4NywyNjcgQEAgc3RhdGljIGNv bnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcwo+ID4+Pj4gZHdfaGRtaV9jb25u ZWN0b3JfaGVscGVyX2Z1bmNzID0gLmF0b21pY19jaGVjayA9Cj4gPj4+PiBkd19oZG1pX2Nvbm5l Y3Rvcl9hdG9taWNfY2hlY2ssCj4gPj4+PiAKPiA+Pj4+ICB9Owo+ID4+Pj4gCj4gPj4+PiArLyoK PiA+Pj4+ICsgKiBQb3NzaWJsZSBvdXRwdXQgZm9ybWF0cyA6Cj4gPj4+PiArICogLSBNRURJQV9C VVNfRk1UX1VZWVZZWTE2XzBfNVg0OCwKPiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfVVlZVllZ MTJfMF81WDM2LAo+ID4+Pj4gKyAqIC0gTUVESUFfQlVTX0ZNVF9VWVlWWVkxMF8wXzVYMzAsCj4g Pj4+PiArICogLSBNRURJQV9CVVNfRk1UX1VZWVZZWThfMF81WDI0LAo+ID4+Pj4gKyAqIC0gTUVE SUFfQlVTX0ZNVF9ZVVYxNl8xWDQ4LAo+ID4+Pj4gKyAqIC0gTUVESUFfQlVTX0ZNVF9SR0IxNjE2 MTZfMVg0OCwKPiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfVVlWWTEyXzFYMjQsCj4gPj4+PiAr ICogLSBNRURJQV9CVVNfRk1UX1lVVjEyXzFYMzYsCj4gPj4+PiArICogLSBNRURJQV9CVVNfRk1U X1JHQjEyMTIxMl8xWDM2LAo+ID4+Pj4gKyAqIC0gTUVESUFfQlVTX0ZNVF9VWVZZMTBfMVgyMCwK PiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfWVVWMTBfMVgzMCwKPiA+Pj4+ICsgKiAtIE1FRElB X0JVU19GTVRfUkdCMTAxMDEwXzFYMzAsCj4gPj4+PiArICogLSBNRURJQV9CVVNfRk1UX1VZVlk4 XzFYMTYsCj4gPj4+PiArICogLSBNRURJQV9CVVNfRk1UX1lVVjhfMVgyNCwKPiA+Pj4+ICsgKiAt IE1FRElBX0JVU19GTVRfUkdCODg4XzFYMjQsCj4gPj4+PiArICovCj4gPj4+PiArCj4gPj4+PiAr LyogQ2FuIHJldHVybiBhIG1heGltdW0gb2YgMTIgcG9zc2libGUgb3V0cHV0IGZvcm1hdHMgZm9y IGEKPiA+Pj4+IG1vZGUvY29ubmVjdG9yCj4gPj4+PiAqLyArI2RlZmluZSBNQVhfT1VUUFVUX1NF TF9GT1JNQVRTCTEyCj4gPj4+PiArCj4gPj4+PiArc3RhdGljIHUzMiAqZHdfaGRtaV9icmlkZ2Vf YXRvbWljX2dldF9vdXRwdXRfYnVzX2ZtdHMoc3RydWN0Cj4gPj4+PiBkcm1fYnJpZGdlCj4gPj4+ PiAqYnJpZGdlLCArCQkJCQlzdHJ1Y3QKPiA+Pj4gCj4gPj4+IGRybV9icmlkZ2Vfc3RhdGUgKmJy aWRnZV9zdGF0ZSwKPiA+Pj4gCj4gPj4+PiArCQkJCQlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUKPiA+ Pj4gCj4gPj4+ICpjcnRjX3N0YXRlLAo+ID4+PiAKPiA+Pj4+ICsJCQkJCXN0cnVjdAo+ID4+PiAK PiA+Pj4gZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubl9zdGF0ZSwKPiA+Pj4gCj4gPj4+PiArCQkJ CQl1bnNpZ25lZCBpbnQKPiA+Pj4gCj4gPj4+ICpudW1fb3V0cHV0X2ZtdHMpCj4gPj4+IAo+ID4+ Pj4gK3sKPiA+Pj4+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm4gPSBjb25uX3N0YXRlLT5j b25uZWN0b3I7Cj4gPj4+PiArCXN0cnVjdCBkcm1fZGlzcGxheV9pbmZvICppbmZvID0gJmNvbm4t PmRpc3BsYXlfaW5mbzsKPiA+Pj4+ICsJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSAm Y3J0Y19zdGF0ZS0+bW9kZTsKPiA+Pj4+ICsJdTggbWF4X2JwYyA9IGNvbm5fc3RhdGUtPm1heF9y ZXF1ZXN0ZWRfYnBjOwo+ID4+Pj4gKwlib29sIGlzX2hkbWkyX3NpbmsgPSBpbmZvLT5oZG1pLnNj ZGMuc3VwcG9ydGVkIHx8Cj4gPj4+PiArCQkJICAgICAoaW5mby0+Y29sb3JfZm9ybWF0cyAmCj4g Pj4+IAo+ID4+PiBEUk1fQ09MT1JfRk9STUFUX1lDUkNCNDIwKTsKPiA+Pj4gCj4gPj4+PiArCXUz MiAqb3V0cHV0X2ZtdHM7Cj4gPj4+PiArCWludCBpID0gMDsKPiA+Pj4+ICsKPiA+Pj4+ICsJKm51 bV9vdXRwdXRfZm10cyA9IDA7Cj4gPj4+PiArCj4gPj4+PiArCW91dHB1dF9mbXRzID0ga2NhbGxv YyhNQVhfT1VUUFVUX1NFTF9GT1JNQVRTLAo+ID4gCj4gPiBzaXplb2YoKm91dHB1dF9mbXRzKSwK PiA+IAo+ID4+Pj4gKwkJCSAgICAgIEdGUF9LRVJORUwpOwo+ID4+Pj4gKwlpZiAoIW91dHB1dF9m bXRzKQo+ID4+Pj4gKwkJcmV0dXJuIE5VTEw7Cj4gPj4+PiArCj4gPj4+PiArCS8qCj4gPj4+PiAr CSAqIElmIHRoZSBjdXJyZW50IG1vZGUgZW5mb3JjZXMgNDoyOjAsIGZvcmNlIHRoZSBvdXRwdXQg YnV0IGZvcm1hdAo+ID4+Pj4gKwkgKiB0byA0OjI6MCBhbmQgZG8gbm90IGFkZCB0aGUgWVVWNDIy LzQ0NC9SR0IgZm9ybWF0cwo+ID4+Pj4gKwkgKi8KPiA+Pj4+ICsJaWYgKGNvbm4tPnljYmNyXzQy MF9hbGxvd2VkICYmCj4gPj4+PiArCSAgICAoZHJtX21vZGVfaXNfNDIwX29ubHkoaW5mbywgbW9k ZSkgfHwKPiA+Pj4+ICsJICAgICAoKSkpIHsKPiA+Pj4+ICsKPiA+Pj4+ICsJCS8qIE9yZGVyIGJ1 cyBmb3JtYXRzIGZyb20gMTZiaXQgdG8gOGJpdCBpZiBzdXBwb3J0ZWQgKi8KPiA+Pj4+ICsJCWlm IChtYXhfYnBjID49IDE2ICYmIGluZm8tPmJwYyA9PSAxNiAmJgo+ID4+Pj4gKwkJICAgIChpbmZv LT5oZG1pLnk0MjBfZGNfbW9kZXMgJgo+ID4+PiAKPiA+Pj4gRFJNX0VESURfWUNCQ1I0MjBfRENf NDgpKQo+ID4+PiAKPiA+Pj4+ICsJCQlvdXRwdXRfZm10c1tpKytdID0KPiA+Pj4gCj4gPj4+IE1F RElBX0JVU19GTVRfVVlZVllZMTZfMF81WDQ4Owo+ID4+PiAKPiA+Pj4+ICsKPiA+Pj4+ICsJCWlm IChtYXhfYnBjID49IDEyICYmIGluZm8tPmJwYyA+PSAxMiAmJgo+ID4+Pj4gKwkJICAgIChpbmZv LT5oZG1pLnk0MjBfZGNfbW9kZXMgJgo+ID4+PiAKPiA+Pj4gRFJNX0VESURfWUNCQ1I0MjBfRENf MzYpKQo+ID4+PiAKPiA+Pj4+ICsJCQlvdXRwdXRfZm10c1tpKytdID0KPiA+Pj4gCj4gPj4+IE1F RElBX0JVU19GTVRfVVlZVllZMTJfMF81WDM2Owo+ID4+PiAKPiA+Pj4+ICsKPiA+Pj4+ICsJCWlm IChtYXhfYnBjID49IDEwICYmIGluZm8tPmJwYyA+PSAxMCAmJgo+ID4+Pj4gKwkJICAgIChpbmZv LT5oZG1pLnk0MjBfZGNfbW9kZXMgJgo+ID4+PiAKPiA+Pj4gRFJNX0VESURfWUNCQ1I0MjBfRENf MzApKQo+ID4+PiAKPiA+Pj4+ICsJCQlvdXRwdXRfZm10c1tpKytdID0KPiA+Pj4gCj4gPj4+IE1F RElBX0JVU19GTVRfVVlZVllZMTBfMF81WDMwOwo+ID4+PiAKPiA+Pj4+ICsKPiA+Pj4+ICsJCS8q IERlZmF1bHQgOGJpdCBmYWxsYmFjayAqLwo+ID4+Pj4gKwkJb3V0cHV0X2ZtdHNbaSsrXSA9IE1F RElBX0JVU19GTVRfVVlZVllZOF8wXzVYMjQ7Cj4gPj4+PiArCj4gPj4+PiArCQkqbnVtX291dHB1 dF9mbXRzID0gaTsKPiA+Pj4+ICsKPiA+Pj4+ICsJCXJldHVybiBvdXRwdXRfZm10czsKPiA+Pj4g Cj4gPj4+IERyaXZlciBzaG91bGRuJ3QgcmV0dXJuIGp1c3QgeWV0IGZvciBjYXNlICJpc19oZG1p Ml9zaW5rICYmCj4gPj4+IGRybV9tb2RlX2lzXzQyMF9hbHNvKGluZm8sIG1vZGUpIiwgYmVjYXVz ZSBtb25pdG9yL1RWIGFsc28gc3VwcG9ydHMKPiA+Pj4gWUNiQ3IKPiA+Pj4gNDo0OjQgaW4gdGhh dCBjYXNlLiBJTU8gWUNiQ3IgNDo0OjQgc2hvdWxkIGJlIGV2ZW4gcHJlZmVyZWQuIFdoYXQgZG8g eW91Cj4gPj4+IHRoaW5rPwo+ID4+IAo+ID4+IEkgdGhpbmsgd2UgbmVlZCB0byBoYXZlIHNvbWUg d2F5IGZvciBjb250cm9sbGVyIGRyaXZlciBhbmQgdXNlcnNwYWNlIHRvCj4gPj4gY29udHJvbCB3 aGF0IGhkbWkgb3V0cHV0IGZvcm1hdCBnZXRzIHNlbGVjdGVkLiBJIGtub3cgZm9yIGEgZmFjdCB0 aGF0Cj4gPj4gc29tZQo+ID4+IFNhbXN1bmcgVFYgaGF2ZSBpc3N1ZXMgd2l0aCA0NDQgWUNiQ3Ig bW9kZXMgYXQgNGsgNTAvNjBoeiBidXQgaGF2ZSBubwo+ID4+IHByb2JsZW1zIHdpdGggNDIwIG1v ZGVzLiBUaGUgU2Ftc3VuZyBUViBlZGlkIGxpZSBhbmQvb3IgdGhlIFRWIGlzIG5vdAo+ID4+IGZ1 bGx5Cj4gPj4gZm9sbG93aW5nIEhETUkgc3BlY3MKPiA+IAo+ID4gSW50ZXJlc3RpbmcsIG1heWJl IGp1c3Qgc29tZSBiYW5kd2l0aCBpc3N1ZXM/IEkgZ3Vlc3Mgd2Ugc2hvdWxkIGhhdmUgYQo+ID4g YmxhY2tsaXN0IGZvciBzdWNoIGNhc2VzLiBJIGtub3cgdGhhdCBhdCBsZWFzdCBBbGx3aW5uZXIg QlNQIGRyaXZlciBmb3IgRFcKPiA+IEhETUkgaGFzIGEgYmxhY2tsaXN0LCBpbiB0aGlzIGNhc2Ug Zm9yIDIgbW9uaXRvcnMgd2hpY2ggY2xhaW0gdG8gc3VwcG9ydAo+ID4gWUNiQ3IgNDo0OjQgbW9k ZSBidXQgdGhleSBub3QuCj4gPiAKPiA+PiBGcm9tIGEgcGVyc29uYWwgYW5kIG1lZGlhcGxheWVy IHVzZXJzcGFjZSBwZXJzcGVjdGl2ZSBJIHdvdWxkIGxpa2UgdG8KPiA+PiBwcmVmZXIgNDIwLzQ0 NCBZQ2JDciBtb2RlIGFzIHNvb24gYXMgYW55IHl1diBkcm0gcGxhbmUgaXMgYWN0aXZlIGFuZCBy Z2IKPiA+PiA0NDQgYW55dGltZSBlbHNlLgo+ID4gCj4gPiBJIHdvdWxkIGFyZ3VlIHRoYXQgWUNi Q3IgaXMgYWx3YXlzIHByZWZlcmVkOgo+ID4gLSBDRUEgODYxIHByZWZlcnMgaXQgZm9yIGFsbCBD RUEgbW9kZXMKPiA+IC0gYXZvaWQgZGVhbGluZyB3aXRoIHF1YW50aXphdGlvbiByYW5nZSAtIGl0 J3MgYWx3YXlzIGxpbWl0ZWQgcmFuZ2UgZm9yIDwKPiA+IGhkbWkgMi4wIGFuZCBzZWxlY3RhYmxl IG9uIHNvbWUgaGRtaSAyLjAgY2FwYWJsZSBzaW5rcwo+IAo+IFRoaXMgaXMgcHJvYmFibHkgdHJ1 ZSBpZiB5b3VyIHNpbmsgaXMgYSBUViwgZm9yIG1vbml0b3JzIHdpdGggSERNSQo+IGNvbm5lY3Rp b25zIEkgd291bGQgZXhwZWN0IG9yIGF0IGxlYXN0IGxpa2UgdG8gaGF2ZSBhbiBvcHRpb24gdG8g dXNlIHJnYjQ0NAo+IGZ1bGwgcmFuZ2UgbW9kZSBmb3IgYW55IGRlc2t0b3Agb3IgZ2FtaW5nIG9y IHNpbWlsYXIgdXNlLWNhc2UuCgpXZWxsLCB0aGluZyBpcyB0aGF0IENFQSA4NjEgY2xlYXJseSBz dGF0ZXMgdGhhdCBmb3IgQ0VBIG1vZGVzICg3MjBwLCAxMDgwcCwgCjIxNjBwLCBldGMuKSBsaW1p dGVkIHJhbmdlIHNob3VsZCBiZSBhbHNvIHVzZWQgZm9yIFJHQiBjb2xvciBzcGFjZS4gV2l0aCAK aW1wbGVtZW50ZWQgbG9naWMgdG8gZGV0ZWN0IGlmIFJHQiBsaW1pdGVkIHJhbmdlIGlzIG5lZWRl ZCBvciBub3QgYW5kIAppbmRpY2F0aW5nIHRoYXQgaW4gQVZJIGZyYW1lLCBJIGZpbmFsbHkgZ2V0 IHByb3BlciAoYmV0dGVyPykgY29sb3IgcmVwcm9kdWN0aW9uIAp3aXRoIFBDIG1vbml0b3IgYW5k IFRWIGF0IHRoZSBzYW1lIHRpbWUuIEknbSBub3Qgc3VyZSBpZiB0aGVyZSBpcyBhbnkgd2F5IHRv IApkZXRlY3QgImZ1bGwgcmFuZ2UgUkdCIiBjYXBhYmxlIGRpc3BsYXlzLiBIb3dldmVyLCB3ZSBj YW4gYWx3YXlzIGltcGxlbWVudCAKY29ubmVjdG9yIHByb3BlcnR5IGxpa2UgSW50ZWwgZGlkIGlu IGk5MTUgZHJpdmVyICJCcm9hZGNhc3QgUkdCIiwgd2hpY2ggY2FuIApvdmVycmlkZSBSR0IgcXVh bnRpemF0aW9uIG1vZGUuCgo+IAo+ID4gQW55d2F5LCB0aGVyZSBpcyBubyB1bml2ZXJzYWwgc29s dXRpb24gdG8gYXZvaWQgY29sb3Igc3BhY2UgY29udmVyc2lvbiBpbgo+ID4gYWxsIGNhc2VzLiBG b3IgZXhhbXBsZSwgZHVlIHRvIGRlc2lnbiBvZiBBbGx3aW5uZXIgRGlzcGxheSBFbmdpbmUgMiwg aXQKPiA+IGNhbiBvbmx5IHdvcmsgaW4gUkdCIGZvcm1hdCBpbnRlcm5hbGx5LCBidXQgaXQgY2Fu IGNvbnZlcnQgZmluYWwgb3V0cHV0Cj4gPiB0byBZQ2JDciByaWdodCBiZWZvcmUgaXQncyBmZWVk ZWQgdG8gRFcgSERNSS4gT24gdGhlIG90aGVyIGhhbmQsIHlvdSBoYXZlCj4gPiBtZXNvbiBkaXNw bGF5IHBpcGVsaW5lIHdoaWNoIHdvcmtzIGluIFlDYkNyIGZvcm1hdCBpbnRlcm5hbGx5IGFuZCBy ZWxpZXMKPiA+IG9uIERXIEhETUkgQ1NDIHVuaXQgdG8gY29udmVydCBvdXRwdXQgdG8gUkdCLiBG b3J0dW5hdGVseSwgdGhlcmUgYXJlIGFsc28KPiA+IGRpc3BsYXkgcGlwZWxpbmVzIHdoaWNoIGNh biB3b3JrIGluIGFueSBjb2xvcnNwYWNlIGludGVybmFsbHksIGxpa2UKPiA+IEFsbHdpbm5lciBE aXNwbGF5IEVuZ2luZSAzLiBOb3Qgc3VyZSBpbiB3aGljaCBjYXRlZ29yeSBSb2NrY2hpcCBkaXNw bGF5Cj4gPiBwaXBlbGluZSBmYWxscyBpbnRvLgo+IAo+IEFncmVlLCBhbmQgZm9yIFJvY2tjaGlw IHRvIG15IGtub3dsZWRnZSBSSzMyODggVk9QIChWaWRlbyBPdXRwdXQgUHJvY2Vzc29yKQo+IGNh biBvbmx5IG91dHB1dCA4LzEwLWJpdCByZ2IgKGZ1bGwgcmFuZ2UpIHRvIERXLUhETUkuCj4gQW5k IHRoZSBWT1AgaW4gUkszMjJ4L1JLMzMyOC9SSzMzOTkgY2FuIG91dHB1dCA4LzEwLWJpdCByZ2Ig YW5kIDQ0NC80MjAgeXV2Lgo+IEkgZG8gbm90IGtub3cgaG93IHRoZSBWT1AgaGFuZGxlcyBpbnRl cm5hbCBjb2xvciBjb252ZXJzaW9uLgo+IAo+ID4+IE9uIFJvY2tjaGlwIFNvQ3MgdGhlIGRpc3Bs YXkgY29udHJvbGxlciBjYW5ub3Qgb3V0cHV0IHl1djQyMiB0byBkdy1oZG1pCj4gPj4gYmxvY2ss IHRoZSBvcHRpbWFsIG91dHB1dCBmb3JtYXQgc2VsZWN0aW9uIGluIHN1Y2ggY2FzZSBzaG91bGQg cHV0IHl1djQyMgo+ID4+IGxhc3QuCj4gPiAKPiA+IE5vdGUgdGhhdCBEVyBIRE1JIGhhcyBkZWNp bWF0aW9uIHN1cHBvcnQgd2hpY2ggY29udmVydHMgNDQ0IHRvIDQyMi4gVGhpcwo+ID4gaXMKPiA+ IHBhcnQgb2YgQ1NDIHVuaXQuCj4gCj4gVGhpcyB3b3JrcyBhcyBpdCBzaG91bGQgKGFmdGVyIGEg cGF0Y2ggdG8gZGlzYWJsZSBjb2xvciBjb252ZXJzaW9uIGZvciA0NDQKPiB0byA0MjIpLCAKClll YWgsIEkgbm90aWNlZCB0aGF0IHRvbywgSSBwbGFuIHRvIHNlbmQgYSBwYXRjaCBmb3IgdGhhdCBz b29uLgoKPiB0aGUgaXNzdWUgSSBzZWUgaXMgdGhhdCB0aGUgZm9ybWF0IG5lZ290aWF0aW9uIGNv ZGUgd2lsbCBjdXJyZW50bHkKPiBmYXZvciA0NDQgdG8gNDIyIGRlY2ltYXRpb24gb3ZlciB1c2lu ZyA0NDQgb3V0cHV0Lgo+IE5vdGU6IDQyMiB3aWxsIG5vdCBiZSBzZWxlY3RlZCBvdmVyIDQ0NCBj dXJyZW50bHkgaW4gY2FzZSBzaW5rIHJlcG9ydCBkZWVwCj4gY29sb3Igc3VwcG9ydCBkdWUgdG8g ZHJtIGVkaWQgcGFyc2luZyBjb2RlIGZvbGxvd2luZyBIRE1JIDEuMyBzcGVjLCBzZWUKPiBbMV0u Cj4gCj4gWzFdCj4gaHR0cHM6Ly9naXRodWIuY29tL3RvcnZhbGRzL2xpbnV4L2Jsb2IvbWFzdGVy L2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jI0w0Cj4gODAxLUw0ODA2Cj4gPiBTaWRlIG5vdGU6 IENTQyB1bml0IGlzIG9wdGlvbmFsIGZlYXR1cmUgb2YgRFctSERNSSBhbmQgcHJlc2VuY2UgaXMK PiA+IGluZGljYXRlZCBieSBjb25maWcgcmVnaXN0ZXIuIEhvd2V2ZXIsIGl0IHNlZW1zIHRoYXQg Q1NDIHN1cHBvcnQgaXMKPiA+IGJyb2tlbiBpbiBEVyBIRE1JIGNvbnRyb2xsZXIgb24gNDBubSBB bGx3aW5uZXIgU29Dcy4gSWYgaXQgaXMgZW5hYmxlZCwgVFYKPiA+IGxvc2VzIHNpZ25hbC4gSSBo YXZlIHRvIGludmVzdGlnYXRlIGlmIG9ubHkgQ1NDIGlzIGJyb2tlbiBvciBkZWNpbWF0aW9uCj4g PiBhbHNvIGRvbid0IHdvcmsuPiAKClNjcmF0Y2ggYWJvdmUsIERXIEhETUkgQ1NDIHVuaXQgd29y a3Mgb2sgb24gQWxsd2lubmVyIFNvQ3MsIEkganVzdCBmb3Jnb3QgdG8gCmVuYWJsZSBDU0MgY2xv Y2suCgo+ID4+IE1heWJlIGR3LWhkbWkgY2FuIGNhbGwgYSBkdy1oZG1pIGdsdWUgZHJpdmVyIGNh bGxiYWNrIHRvIGdldCB0aGUKPiA+PiBwcmVmZXJyZWQKPiA+PiBvdXRwdXQgZm9ybWF0IG9yZGVy Pwo+ID4+IAo+ID4+IE9uIGEgc2lkZSBub3RlIGJ1dCByZWxhdGVkIGlzc3VlLCB0aGUgZHctaGRt aSBmb3JtYXQgbmVnb3RpYXRpb24gY29kZQo+ID4+IHNob3VsZCBwcm9iYWJseSBhbHNvIGZpbHRl ciBtb2RlcyBvbiB0bWRzIHJhdGUsIHNvbWV0aGluZyBsaWtlIFsxXS4KPiA+PiBJdCBpcyBuZWVk ZWQgdG8gZmlsdGVyIG91dCBkZWVwIGNvbG9yIG1vZGVzIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBi eSB0aGUKPiA+PiBzaW5rIG9yIGhkbWkgc3BlYy4KPiA+IAo+ID4gQWgsIHlvdSBtZWFuIG9uIFRN RFMgcmF0ZXMgc3VwcG9ydGVkIGJ5IHRoZSBzaW5rLiBDb3VsZCB0aGlzIGF2b2lkIFNhbXN1bmcK PiA+IGRlZXAgY29sb3IgaXNzdWVzPyBJZiBzbywgd2UgZG9uJ3QgbmVlZCBibGFja2xpc3QgdGhl bi4KPiAKPiBJIGRvIG5vdCB0aGluayBzbywgdGhlIGluaXRpYWwgaXNzdWUgd2FzIHJlcG9ydGVk IHdpdGggaW50ZWwgZ3JhcGhpY3MgYnV0Cj4gbG9va2luZyBhdCB0aGUgZWRpZCBhbmQgY29tcGFy aW5nIHRvIHRoZSBtYW51YWwgb2Ygc3VwcG9ydGVkIG1vZGVzIHRoZXkgZG8KPiBub3QgZnVsbHkg bWF0Y2guIFNlZSBtYW51YWwgaW5mbyBhdCBbMl0gYW5kIGVkaWQgd2hlbiBVSEQgbW9kZSBpcyBv ZmYgYXQKPiBbM10gYW5kIHdoZW4gb24gYXQgWzRdLgoKV2hpY2ggcGFydCBkb2Vzbid0IG1hdGNo PyBJIGRvbid0IHNlZSBhbnkgaXNzdWUuCgpCZXN0IHJlZ2FyZHMsCkplcm5lagoKPiAKPiBbMl0K PiBodHRwczovL2dpdGxhYi5mcmVlZGVza3RvcC5vcmcvZHJtL2ludGVsL3VwbG9hZHMvMzY2MzBj OGE3MjdiZjhjNjZhNTNmZDc0NzAKPiBjODgzODMvTVU3MDAwX21hbnVhbF8tX1VIRF9jb2xvdXJf bW9kZXMuUE5HIFszXSBodHRwOi8vaXguaW8vMUgyNQo+IFs0XSBodHRwOi8vaXguaW8vMUgyZQo+ IAo+ID4gQmVzdCByZWdhcmRzLAo+ID4gSmVybmVqCj4gPiAKPiA+PiBbMV0KPiA+PiBodHRwczov L2dpdGh1Yi5jb20vS3dpYm9vL2xpbnV4LXJvY2tjaGlwL2NvbW1pdC9mYzNkZjY5MDMzODRlNzY0 YWI2YWM1OTg3Cj4gPj4gOWMKPiA+PiA0ODljYmVmNTVmY2JlCj4gPj4gCj4gPj4gQmVzdCByZWdh cmRzLAo+ID4+IEpvbmFzCj4gPj4gCj4gPj4+IEJlc3QgcmVnYXJkcywKPiA+Pj4gSmVybmVqCj4g Pj4+IAo+ID4+Pj4gKwl9Cj4gPj4+PiArCj4gPj4+PiArCS8qCj4gPj4+PiArCSAqIE9yZGVyIGJ1 cyBmb3JtYXRzIGZyb20gMTZiaXQgdG8gOGJpdCBhbmQgZnJvbSBZVVY0MjIgdG8gUkdCCj4gPj4+ PiArCSAqIGlmIHN1cHBvcnRlZC4gSW4gYW55IGNhc2UgdGhlIGRlZmF1bHQgUkdCODg4IGZvcm1h dCBpcyBhZGRlZAo+ID4+Pj4gKwkgKi8KPiA+Pj4+ICsKPiA+Pj4+ICsJaWYgKG1heF9icGMgPj0g MTYgJiYgaW5mby0+YnBjID09IDE2KSB7Cj4gPj4+PiArCQlpZiAoaW5mby0+Y29sb3JfZm9ybWF0 cyAmIERSTV9DT0xPUl9GT1JNQVRfWUNSQ0I0NDQpCj4gPj4+PiArCQkJb3V0cHV0X2ZtdHNbaSsr XSA9IE1FRElBX0JVU19GTVRfWVVWMTZfMVg0ODsKPiA+Pj4+ICsKPiA+Pj4+ICsJCW91dHB1dF9m bXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1JHQjE2MTYxNl8xWDQ4Owo+ID4+Pj4gKwl9Cj4gPj4+ PiArCj4gPj4+PiArCWlmIChtYXhfYnBjID49IDEyICYmIGluZm8tPmJwYyA+PSAxMikgewo+ID4+ Pj4gKwkJaWYgKGluZm8tPmNvbG9yX2Zvcm1hdHMgJiBEUk1fQ09MT1JfRk9STUFUX1lDUkNCNDIy KQo+ID4+Pj4gKwkJCW91dHB1dF9mbXRzW2krK10gPQo+ID4gCj4gPiBNRURJQV9CVVNfRk1UX1VZ VlkxMl8xWDI0Owo+ID4gCj4gPj4+PiArCj4gPj4+PiArCQlpZiAoaW5mby0+Y29sb3JfZm9ybWF0 cyAmIERSTV9DT0xPUl9GT1JNQVRfWUNSQ0I0NDQpCj4gPj4+PiArCQkJb3V0cHV0X2ZtdHNbaSsr XSA9IE1FRElBX0JVU19GTVRfWVVWMTJfMVgzNjsKPiA+Pj4+ICsKPiA+Pj4+ICsJCW91dHB1dF9m bXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1JHQjEyMTIxMl8xWDM2Owo+ID4+Pj4gKwl9Cj4gPj4+ PiArCj4gPj4+PiArCWlmIChtYXhfYnBjID49IDEwICYmIGluZm8tPmJwYyA+PSAxMCkgewo+ID4+ Pj4gKwkJaWYgKGluZm8tPmNvbG9yX2Zvcm1hdHMgJiBEUk1fQ09MT1JfRk9STUFUX1lDUkNCNDIy KQo+ID4+Pj4gKwkJCW91dHB1dF9mbXRzW2krK10gPQo+ID4gCj4gPiBNRURJQV9CVVNfRk1UX1VZ VlkxMF8xWDIwOwo+ID4gCj4gPj4+PiArCj4gPj4+PiArCQlpZiAoaW5mby0+Y29sb3JfZm9ybWF0 cyAmIERSTV9DT0xPUl9GT1JNQVRfWUNSQ0I0NDQpCj4gPj4+PiArCQkJb3V0cHV0X2ZtdHNbaSsr XSA9IE1FRElBX0JVU19GTVRfWVVWMTBfMVgzMDsKPiA+Pj4+ICsKPiA+Pj4+ICsJCW91dHB1dF9m bXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1JHQjEwMTAxMF8xWDMwOwo+ID4+Pj4gKwl9Cj4gPj4+ PiArCj4gPj4+PiArCWlmIChpbmZvLT5jb2xvcl9mb3JtYXRzICYgRFJNX0NPTE9SX0ZPUk1BVF9Z Q1JDQjQyMikKPiA+Pj4+ICsJCW91dHB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1VZVlk4 XzFYMTY7Cj4gPj4+PiArCj4gPj4+PiArCWlmIChpbmZvLT5jb2xvcl9mb3JtYXRzICYgRFJNX0NP TE9SX0ZPUk1BVF9ZQ1JDQjQ0NCkKPiA+Pj4+ICsJCW91dHB1dF9mbXRzW2krK10gPSBNRURJQV9C VVNfRk1UX1lVVjhfMVgyNDsKPiA+Pj4+ICsKPiA+Pj4+ICsJLyogRGVmYXVsdCA4Yml0IFJHQiBm YWxsYmFjayAqLwo+ID4+Pj4gKwlvdXRwdXRfZm10c1tpKytdID0gTUVESUFfQlVTX0ZNVF9SR0I4 ODhfMVgyNDsKPiA+Pj4+ICsKPiA+Pj4+ICsJKm51bV9vdXRwdXRfZm10cyA9IGk7Cj4gPj4+PiAr Cj4gPj4+PiArCXJldHVybiBvdXRwdXRfZm10czsKPiA+Pj4+ICt9Cj4gPj4+PiArCj4gPj4+PiAr LyoKPiA+Pj4+ICsgKiBQb3NzaWJsZSBpbnB1dCBmb3JtYXRzIDoKPiA+Pj4+ICsgKiAtIE1FRElB X0JVU19GTVRfUkdCODg4XzFYMjQKPiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfWVVWOF8xWDI0 Cj4gPj4+PiArICogLSBNRURJQV9CVVNfRk1UX1VZVlk4XzFYMTYKPiA+Pj4+ICsgKiAtIE1FRElB X0JVU19GTVRfVVlZVllZOF8wXzVYMjQKPiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfUkdCMTAx MDEwXzFYMzAKPiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfWVVWMTBfMVgzMAo+ID4+Pj4gKyAq IC0gTUVESUFfQlVTX0ZNVF9VWVZZMTBfMVgyMAo+ID4+Pj4gKyAqIC0gTUVESUFfQlVTX0ZNVF9V WVlWWVkxMF8wXzVYMzAKPiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfUkdCMTIxMjEyXzFYMzYK PiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfWVVWMTJfMVgzNgo+ID4+Pj4gKyAqIC0gTUVESUFf QlVTX0ZNVF9VWVZZMTJfMVgyNAo+ID4+Pj4gKyAqIC0gTUVESUFfQlVTX0ZNVF9VWVlWWVkxMl8w XzVYMzYKPiA+Pj4+ICsgKiAtIE1FRElBX0JVU19GTVRfUkdCMTYxNjE2XzFYNDgKPiA+Pj4+ICsg KiAtIE1FRElBX0JVU19GTVRfWVVWMTZfMVg0OAo+ID4+Pj4gKyAqIC0gTUVESUFfQlVTX0ZNVF9V WVlWWVkxNl8wXzVYNDgKPiA+Pj4+ICsgKi8KPiA+Pj4+ICsKPiA+Pj4+ICsvKiBDYW4gcmV0dXJu IGEgbWF4aW11bSBvZiA0IHBvc3NpYmxlIGlucHV0IGZvcm1hdHMgZm9yIGFuIG91dHB1dAo+ID4+ Pj4gZm9ybWF0Cj4gPj4+PiAqLyArI2RlZmluZSBNQVhfSU5QVVRfU0VMX0ZPUk1BVFMJNAo+ID4+ Pj4gKwo+ID4+Pj4gK3N0YXRpYyB1MzIgKmR3X2hkbWlfYnJpZGdlX2F0b21pY19nZXRfaW5wdXRf YnVzX2ZtdHMoc3RydWN0IGRybV9icmlkZ2UKPiA+Pj4+ICpicmlkZ2UsICsJCQkJCXN0cnVjdAo+ ID4+PiAKPiA+Pj4gZHJtX2JyaWRnZV9zdGF0ZSAqYnJpZGdlX3N0YXRlLAo+ID4+PiAKPiA+Pj4+ ICsJCQkJCXN0cnVjdCBkcm1fY3J0Y19zdGF0ZQo+ID4+PiAKPiA+Pj4gKmNydGNfc3RhdGUsCj4g Pj4+IAo+ID4+Pj4gKwkJCQkJc3RydWN0Cj4gPj4+IAo+ID4+PiBkcm1fY29ubmVjdG9yX3N0YXRl ICpjb25uX3N0YXRlLAo+ID4+PiAKPiA+Pj4+ICsJCQkJCXUzMiBvdXRwdXRfZm10LAo+ID4+Pj4g KwkJCQkJdW5zaWduZWQgaW50Cj4gPj4+IAo+ID4+PiAqbnVtX2lucHV0X2ZtdHMpCj4gPj4+IAo+ ID4+Pj4gK3sKPiA+Pj4+ICsJdTMyICppbnB1dF9mbXRzOwo+ID4+Pj4gKwlpbnQgaSA9IDA7Cj4g Pj4+PiArCj4gPj4+PiArCSpudW1faW5wdXRfZm10cyA9IDA7Cj4gPj4+PiArCj4gPj4+PiArCWlu cHV0X2ZtdHMgPSBrY2FsbG9jKE1BWF9JTlBVVF9TRUxfRk9STUFUUywgc2l6ZW9mKCppbnB1dF9m bXRzKSwKPiA+Pj4+ICsJCQkgICAgIEdGUF9LRVJORUwpOwo+ID4+Pj4gKwlpZiAoIWlucHV0X2Zt dHMpCj4gPj4+PiArCQlyZXR1cm4gTlVMTDsKPiA+Pj4+ICsKPiA+Pj4+ICsJc3dpdGNoIChvdXRw dXRfZm10KSB7Cj4gPj4+PiArCS8qIDhiaXQgKi8KPiA+Pj4+ICsJY2FzZSBNRURJQV9CVVNfRk1U X1JHQjg4OF8xWDI0Ogo+ID4+Pj4gKwkJaW5wdXRfZm10c1tpKytdID0gTUVESUFfQlVTX0ZNVF9S R0I4ODhfMVgyNDsKPiA+Pj4+ICsJCWlucHV0X2ZtdHNbaSsrXSA9IE1FRElBX0JVU19GTVRfWVVW OF8xWDI0Owo+ID4+Pj4gKwkJaW5wdXRfZm10c1tpKytdID0gTUVESUFfQlVTX0ZNVF9VWVZZOF8x WDE2Owo+ID4+Pj4gKwkJYnJlYWs7Cj4gPj4+PiArCWNhc2UgTUVESUFfQlVTX0ZNVF9ZVVY4XzFY MjQ6Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1lVVjhfMVgyNDsK PiA+Pj4+ICsJCWlucHV0X2ZtdHNbaSsrXSA9IE1FRElBX0JVU19GTVRfVVlWWThfMVgxNjsKPiA+ Pj4+ICsJCWlucHV0X2ZtdHNbaSsrXSA9IE1FRElBX0JVU19GTVRfUkdCODg4XzFYMjQ7Cj4gPj4+ PiArCQlicmVhazsKPiA+Pj4+ICsJY2FzZSBNRURJQV9CVVNfRk1UX1VZVlk4XzFYMTY6Cj4gPj4+ PiArCQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1VZVlk4XzFYMTY7Cj4gPj4+PiAr CQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1lVVjhfMVgyNDsKPiA+Pj4+ICsJCWlu cHV0X2ZtdHNbaSsrXSA9IE1FRElBX0JVU19GTVRfUkdCODg4XzFYMjQ7Cj4gPj4+PiArCQlicmVh azsKPiA+Pj4+ICsKPiA+Pj4+ICsJLyogMTBiaXQgKi8KPiA+Pj4+ICsJY2FzZSBNRURJQV9CVVNf Rk1UX1JHQjEwMTAxMF8xWDMwOgo+ID4+Pj4gKwkJaW5wdXRfZm10c1tpKytdID0gTUVESUFfQlVT X0ZNVF9SR0IxMDEwMTBfMVgzMDsKPiA+Pj4+ICsJCWlucHV0X2ZtdHNbaSsrXSA9IE1FRElBX0JV U19GTVRfWVVWMTBfMVgzMDsKPiA+Pj4+ICsJCWlucHV0X2ZtdHNbaSsrXSA9IE1FRElBX0JVU19G TVRfVVlWWTEwXzFYMjA7Cj4gPj4+PiArCQlicmVhazsKPiA+Pj4+ICsJY2FzZSBNRURJQV9CVVNf Rk1UX1lVVjEwXzFYMzA6Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1U X1lVVjEwXzFYMzA7Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1VZ VlkxMF8xWDIwOwo+ID4+Pj4gKwkJaW5wdXRfZm10c1tpKytdID0gTUVESUFfQlVTX0ZNVF9SR0Ix MDEwMTBfMVgzMDsKPiA+Pj4+ICsJCWJyZWFrOwo+ID4+Pj4gKwljYXNlIE1FRElBX0JVU19GTVRf VVlWWTEwXzFYMjA6Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1VZ VlkxMF8xWDIwOwo+ID4+Pj4gKwkJaW5wdXRfZm10c1tpKytdID0gTUVESUFfQlVTX0ZNVF9ZVVYx MF8xWDMwOwo+ID4+Pj4gKwkJaW5wdXRfZm10c1tpKytdID0gTUVESUFfQlVTX0ZNVF9SR0IxMDEw MTBfMVgzMDsKPiA+Pj4+ICsJCWJyZWFrOwo+ID4+Pj4gKwo+ID4+Pj4gKwkvKiAxMmJpdCAqLwo+ ID4+Pj4gKwljYXNlIE1FRElBX0JVU19GTVRfUkdCMTIxMjEyXzFYMzY6Cj4gPj4+PiArCQlpbnB1 dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1JHQjEyMTIxMl8xWDM2Owo+ID4+Pj4gKwkJaW5w dXRfZm10c1tpKytdID0gTUVESUFfQlVTX0ZNVF9ZVVYxMl8xWDM2Owo+ID4+Pj4gKwkJaW5wdXRf Zm10c1tpKytdID0gTUVESUFfQlVTX0ZNVF9VWVZZMTJfMVgyNDsKPiA+Pj4+ICsJCWJyZWFrOwo+ ID4+Pj4gKwljYXNlIE1FRElBX0JVU19GTVRfWVVWMTJfMVgzNjoKPiA+Pj4+ICsJCWlucHV0X2Zt dHNbaSsrXSA9IE1FRElBX0JVU19GTVRfWVVWMTJfMVgzNjsKPiA+Pj4+ICsJCWlucHV0X2ZtdHNb aSsrXSA9IE1FRElBX0JVU19GTVRfVVlWWTEyXzFYMjQ7Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2kr K10gPSBNRURJQV9CVVNfRk1UX1JHQjEyMTIxMl8xWDM2Owo+ID4+Pj4gKwkJYnJlYWs7Cj4gPj4+ PiArCWNhc2UgTUVESUFfQlVTX0ZNVF9VWVZZMTJfMVgyNDoKPiA+Pj4+ICsJCWlucHV0X2ZtdHNb aSsrXSA9IE1FRElBX0JVU19GTVRfVVlWWTEyXzFYMjQ7Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2kr K10gPSBNRURJQV9CVVNfRk1UX1lVVjEyXzFYMzY7Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10g PSBNRURJQV9CVVNfRk1UX1JHQjEyMTIxMl8xWDM2Owo+ID4+Pj4gKwkJYnJlYWs7Cj4gPj4+PiAr Cj4gPj4+PiArCS8qIDE2Yml0ICovCj4gPj4+PiArCWNhc2UgTUVESUFfQlVTX0ZNVF9SR0IxNjE2 MTZfMVg0ODoKPiA+Pj4+ICsJCWlucHV0X2ZtdHNbaSsrXSA9IE1FRElBX0JVU19GTVRfUkdCMTYx NjE2XzFYNDg7Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1lVVjE2 XzFYNDg7Cj4gPj4+PiArCQlicmVhazsKPiA+Pj4+ICsJY2FzZSBNRURJQV9CVVNfRk1UX1lVVjE2 XzFYNDg6Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1lVVjE2XzFY NDg7Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10gPSBNRURJQV9CVVNfRk1UX1JHQjE2MTYxNl8x WDQ4Owo+ID4+Pj4gKwkJYnJlYWs7Cj4gPj4+PiArCj4gPj4+PiArCS8qIDQyMCAqLwo+ID4+Pj4g KwljYXNlIE1FRElBX0JVU19GTVRfVVlZVllZOF8wXzVYMjQ6Cj4gPj4+PiArCWNhc2UgTUVESUFf QlVTX0ZNVF9VWVlWWVkxMF8wXzVYMzA6Cj4gPj4+PiArCWNhc2UgTUVESUFfQlVTX0ZNVF9VWVlW WVkxMl8wXzVYMzY6Cj4gPj4+PiArCWNhc2UgTUVESUFfQlVTX0ZNVF9VWVlWWVkxNl8wXzVYNDg6 Cj4gPj4+PiArCQlpbnB1dF9mbXRzW2krK10gPSBvdXRwdXRfZm10Owo+ID4+Pj4gKwkJYnJlYWs7 Cj4gPj4+PiArCX0KPiA+Pj4+ICsKPiA+Pj4+ICsJKm51bV9pbnB1dF9mbXRzID0gaTsKPiA+Pj4+ ICsKPiA+Pj4+ICsJaWYgKCpudW1faW5wdXRfZm10cyA9PSAwKSB7Cj4gPj4+PiArCQlrZnJlZShp bnB1dF9mbXRzKTsKPiA+Pj4+ICsJCWlucHV0X2ZtdHMgPSBOVUxMOwo+ID4+Pj4gKwl9Cj4gPj4+ PiArCj4gPj4+PiArCXJldHVybiBpbnB1dF9mbXRzOwo+ID4+Pj4gK30KPiA+Pj4+ICsKPiA+Pj4+ ICtzdGF0aWMgaW50IGR3X2hkbWlfYnJpZGdlX2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX2JyaWRn ZSAqYnJpZGdlLAo+ID4+Pj4gKwkJCQkgICAgICAgc3RydWN0IGRybV9icmlkZ2Vfc3RhdGUKPiA+ Pj4gCj4gPj4+ICpicmlkZ2Vfc3RhdGUsCj4gPj4+IAo+ID4+Pj4gKwkJCQkgICAgICAgc3RydWN0 IGRybV9jcnRjX3N0YXRlCj4gPj4+IAo+ID4+PiAqY3J0Y19zdGF0ZSwKPiA+Pj4gCj4gPj4+PiAr CQkJCSAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZQo+ID4+PiAKPiA+Pj4gKmNvbm5f c3RhdGUpCj4gPj4+IAo+ID4+Pj4gK3sKPiA+Pj4+ICsJc3RydWN0IGR3X2hkbWkgKmhkbWkgPSBi cmlkZ2UtPmRyaXZlcl9wcml2YXRlOwo+ID4+Pj4gKwo+ID4+Pj4gKwlkZXZfZGJnKGhkbWktPmRl diwgInNlbGVjdGVkIG91dHB1dCBmb3JtYXQgJXhcbiIsCj4gPj4+PiArCQkJYnJpZGdlX3N0YXRl LT5vdXRwdXRfYnVzX2NmZy5mb3JtYXQpOwo+ID4+Pj4gKwo+ID4+Pj4gKwloZG1pLT5oZG1pX2Rh dGEuZW5jX291dF9idXNfZm9ybWF0ID0KPiA+Pj4+ICsJCQlicmlkZ2Vfc3RhdGUtPm91dHB1dF9i dXNfY2ZnLmZvcm1hdDsKPiA+Pj4+ICsKPiA+Pj4+ICsJZGV2X2RiZyhoZG1pLT5kZXYsICJzZWxl Y3RlZCBpbnB1dCBmb3JtYXQgJXhcbiIsCj4gPj4+PiArCQkJYnJpZGdlX3N0YXRlLT5pbnB1dF9i dXNfY2ZnLmZvcm1hdCk7Cj4gPj4+PiArCj4gPj4+PiArCWhkbWktPmhkbWlfZGF0YS5lbmNfaW5f YnVzX2Zvcm1hdCA9Cj4gPj4+PiArCQkJYnJpZGdlX3N0YXRlLT5pbnB1dF9idXNfY2ZnLmZvcm1h dDsKPiA+Pj4+ICsKPiA+Pj4+ICsJcmV0dXJuIDA7Cj4gPj4+PiArfQo+ID4+Pj4gKwo+ID4+Pj4g Cj4gPj4+PiAgc3RhdGljIGludCBkd19oZG1pX2JyaWRnZV9hdHRhY2goc3RydWN0IGRybV9icmlk Z2UgKmJyaWRnZSkKPiA+Pj4+ICB7Cj4gPj4+PiAgCj4gPj4+PiAgCXN0cnVjdCBkd19oZG1pICpo ZG1pID0gYnJpZGdlLT5kcml2ZXJfcHJpdmF0ZTsKPiA+Pj4+IAo+ID4+Pj4gQEAgLTI0OTksNiAr Mjc1OSw5IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2JyaWRnZV9mdW5jcwo+ID4+Pj4gZHdf aGRtaV9icmlkZ2VfZnVuY3MgPSB7IC5hdG9taWNfcmVzZXQgPQo+ID4+Pj4gZHJtX2F0b21pY19o ZWxwZXJfYnJpZGdlX3Jlc2V0LAo+ID4+Pj4gCj4gPj4+PiAgCS5hdHRhY2ggPSBkd19oZG1pX2Jy aWRnZV9hdHRhY2gsCj4gPj4+PiAgCS5kZXRhY2ggPSBkd19oZG1pX2JyaWRnZV9kZXRhY2gsCj4g Pj4+PiAKPiA+Pj4+ICsJLmF0b21pY19jaGVjayA9IGR3X2hkbWlfYnJpZGdlX2F0b21pY19jaGVj aywKPiA+Pj4+ICsJLmF0b21pY19nZXRfb3V0cHV0X2J1c19mbXRzID0KPiA+Pj4gCj4gPj4+IGR3 X2hkbWlfYnJpZGdlX2F0b21pY19nZXRfb3V0cHV0X2J1c19mbXRzLAo+ID4+PiAKPiA+Pj4+ICsJ LmF0b21pY19nZXRfaW5wdXRfYnVzX2ZtdHMgPQo+ID4+PiAKPiA+Pj4gZHdfaGRtaV9icmlkZ2Vf YXRvbWljX2dldF9pbnB1dF9idXNfZm10cywKPiA+Pj4gCj4gPj4+PiAgCS5lbmFibGUgPSBkd19o ZG1pX2JyaWRnZV9lbmFibGUsCj4gPj4+PiAgCS5kaXNhYmxlID0gZHdfaGRtaV9icmlkZ2VfZGlz YWJsZSwKPiA+Pj4+ICAJLm1vZGVfc2V0ID0gZHdfaGRtaV9icmlkZ2VfbW9kZV9zZXQsCj4gPj4+ PiAKPiA+Pj4+IEBAIC0yOTYzLDYgKzMyMjYsNyBAQCBfX2R3X2hkbWlfcHJvYmUoc3RydWN0IHBs YXRmb3JtX2RldmljZSAqcGRldiwKPiA+Pj4+IAo+ID4+Pj4gIAloZG1pLT5icmlkZ2UuZHJpdmVy X3ByaXZhdGUgPSBoZG1pOwo+ID4+Pj4gIAloZG1pLT5icmlkZ2UuZnVuY3MgPSAmZHdfaGRtaV9i cmlkZ2VfZnVuY3M7Cj4gPj4+PiAKPiA+Pj4+ICsKPiA+Pj4+IAo+ID4+Pj4gICNpZmRlZiBDT05G SUdfT0YKPiA+Pj4+ICAKPiA+Pj4+ICAJaGRtaS0+YnJpZGdlLm9mX25vZGUgPSBwZGV2LT5kZXYu b2Zfbm9kZTsKPiA+Pj4+ICAKPiA+Pj4+ICAjZW5kaWYKCgoKCgpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hbWxvZ2ljIG1haWxpbmcgbGlzdAps aW51eC1hbWxvZ2ljQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5v cmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hbWxvZ2ljCg==