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=-9.3 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 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 9B6DAC433E9 for ; Thu, 4 Mar 2021 21:47:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 78A016500D for ; Thu, 4 Mar 2021 21:47:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239681AbhCDVqt (ORCPT ); Thu, 4 Mar 2021 16:46:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44758 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241290AbhCDVqf (ORCPT ); Thu, 4 Mar 2021 16:46:35 -0500 Received: from mail-lf1-x133.google.com (mail-lf1-x133.google.com [IPv6:2a00:1450:4864:20::133]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C47D2C06175F; Thu, 4 Mar 2021 13:45:54 -0800 (PST) Received: by mail-lf1-x133.google.com with SMTP id v5so226619lft.13; Thu, 04 Mar 2021 13:45:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=XP/a7TGjJBsSgYnX2lmLJ5ngvwoGMReI4BSNcyw6ebk=; b=nOI46XFXRCBsSUvbRvIKRFbGspjtclGzVGrrcNy0gjoIXsNY5ILmAE7F9U/EwJSK89 zVlFxV7Lpzo20sy3jvZYE2fxR3FzJ1t1icwJps0GDinMxkg+myufub1YrQ4srUgc9Tgj FJgZt75J0Z22tfaAFHQQieKIjUpFeVwcqWqnn8m8D+3TeAHxzYYIEe8bJEgF3OeanSIQ mhhZMJ/xfsxBXfrB+oElfttz0xHOpAocwsNrDkJqhPLpuxDIVPanLBDljzrG66L41XRp Hpze9TkcVcyQRWVmpgMUmdknKPeKpDD2JAD3cra0IDCkJANwUxw69TBdPB2n0WJO7ACN GZ3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=XP/a7TGjJBsSgYnX2lmLJ5ngvwoGMReI4BSNcyw6ebk=; b=Xdv7UrfxEfyYyjWOO+s+xqyj9HExRVJtq+n6zDhSwlkSQic7yPSWQHMB7+RAI9585L ZRH5mH/TPs9X1zQJwsKrn5mT1u5aHwQP3R26dTTZsU5HRZBYuK1EphQFYhf3ntdqsWgQ aVw3IshFDWbLz0VrPmIK+kGehkXBDCV4Qog7wMcN6FYG9Dgn7Fejpx6rwuSJZbu8HTnu 7pZ1bB9pLwRWwFxOrJBQOgJN9rxm5DIpyRTuJeIKds8UpmGTWM0l7FRvbCoZUOaFtmWI f2F1Z/pzOmpeFQnb7ojxwXkHmhgK3W7jQ9hZ9px0eGjFelrHbgAP0wvqp9URvy8yVTxK 0iwQ== X-Gm-Message-State: AOAM530+6foPo2KuxK3LkqYuoPhhjVsX0/jaIgtTA6f1qEHh9Z/WEqNE zBZtl4C6Bzv/gfhI17GQXYPcbuXSOEk= X-Google-Smtp-Source: ABdhPJxa5Ga/1VP7ae9n+Gjm6IJEdSNjZCFSl4lVJSoFVNiX66SfK9IQTTFNi1oLAEsaQ49/wksTcA== X-Received: by 2002:a05:6512:2289:: with SMTP id f9mr3612444lfu.362.1614894353207; Thu, 04 Mar 2021 13:45:53 -0800 (PST) Received: from [192.168.2.145] (109-252-193-52.dynamic.spd-mgts.ru. [109.252.193.52]) by smtp.googlemail.com with ESMTPSA id z11sm65181lfd.98.2021.03.04.13.45.52 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 04 Mar 2021 13:45:52 -0800 (PST) Subject: Re: [PATCH v13 1/2] drm/tegra: dc: Support memory bandwidth management To: =?UTF-8?B?TWljaGHFgiBNaXJvc8WCYXc=?= Cc: Thierry Reding , Jonathan Hunter , Matt Merhar , Peter Geis , Nicolas Chauvet , linux-tegra@vger.kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org References: <20210302124445.29444-1-digetx@gmail.com> <20210302124445.29444-2-digetx@gmail.com> <20210303230827.GA22628@qmqm.qmqm.pl> From: Dmitry Osipenko Message-ID: <1b352c7e-cc72-ba08-32ba-08c05cc3aa03@gmail.com> Date: Fri, 5 Mar 2021 00:45:51 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.4.2 MIME-Version: 1.0 In-Reply-To: <20210303230827.GA22628@qmqm.qmqm.pl> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org 04.03.2021 02:08, Michał Mirosław пишет: > On Tue, Mar 02, 2021 at 03:44:44PM +0300, Dmitry Osipenko wrote: >> Display controller (DC) performs isochronous memory transfers, and thus, >> has a requirement for a minimum memory bandwidth that shall be fulfilled, >> otherwise framebuffer data can't be fetched fast enough and this results >> in a DC's data-FIFO underflow that follows by a visual corruption. >> >> The Memory Controller drivers provide facility for memory bandwidth >> management via interconnect API. Let's wire up the interconnect API >> support to the DC driver in order to fix the distorted display output >> on T30 Ouya, T124 TK1 and other Tegra devices. > > I did a read on the code. I have put some thoughts and nits inbetween the > diff, but here are more general questions about the patch: Hello, Michał! Thank you very much for taking a look at the patch! > Is there a reason why the bandwidth is allocated per plane instead of just > using one peak and average for the whole configuration? Or is there a need > to expose all the planes as interconnect channels and allocate their > bandwidth individually? Each display plane has individual memory client on Tegra, memory ICC paths are specified per memory client. This is how memory ICCs are defined in the DT binding and that's what memory drivers are expecting to deal with. It is also nice to see in ICC debugfs how much memory bandwidth is consumed by each individual memory client. > From algorithmic part I see that the plane overlaps are calculated twice > (A vs B and later B vs A). The cursor plane is ignored, but nevertheless > its overlap mask is calculated before being thrown away. The algorithm assumes that we have a fixed number of planes to care about and it's not executed in a hot code path, hence it's more optimal to have a simpler and smaller code rather than try to optimize it without gaining any benefits, IMO. > The bandwidths > are also calculated twice: once for pre-commit and then again for > post-commit. Is setting bandwidth for an interconnect expensive when > re-setting a value that was already set? The code seems to avoid this > case, but maybe unnecessarily? The CCF discards dummy rate-changes in the end of ICC code path. Besides, we're not performing it in a hot code paths, hence performance isn't a concern in this patch. The tegra_crtc_update_memory_bandwidth() relies on being called before and after the atomic commit. For example CRTC's "active" state is updated only after the completion of commit-tail phase. Earlier versions of this patch had checks that tried to avoid setting bandwidth in both 'begin' and 'end' phases of a commit, but then I found that it was buggy in regards to DPMS handling and it was much more optimal to remove the unnecessary "optimizations" since code was blowing up in complexity when I tried to fix it. The tegra_crtc_update_memory_bandwidth() still checks whether old BW = new BW, hence in practice actual ICC changes are only performed when plane is turned on/off. > [...cut the big and interesting part...] > > [...] >> @@ -65,7 +75,9 @@ struct tegra_dc_soc_info { >> unsigned int num_overlay_formats; >> const u64 *modifiers; >> bool has_win_a_without_filters; >> + bool has_win_b_vfilter_mem_client; >> bool has_win_c_without_vert_filter; >> + unsigned int plane_tiled_memory_bandwidth_x2; > > This looks more like bool in the code using it. Good catch, thank you! > [...] >> --- a/drivers/gpu/drm/tegra/plane.c >> +++ b/drivers/gpu/drm/tegra/plane.c > [...] >> +static int tegra_plane_check_memory_bandwidth(struct drm_plane_state *state) > > The function's body looks more like 'update' or 'recalculate' rather > than 'check' the memory bandwidth. The 'check' in the name is intended to show that function belongs to atomic-state checking. But tegra_plane_calculate_memory_bandwidth_state() also is a good variant. I'll consider the renaming, thanks! >> + struct tegra_plane_state *tegra_state = to_tegra_plane_state(state); >> + unsigned int i, bpp, bpp_plane, dst_w, src_w, src_h, mul; >> + const struct tegra_dc_soc_info *soc; >> + const struct drm_format_info *fmt; >> + struct drm_crtc_state *crtc_state; >> + u32 avg_bandwidth, peak_bandwidth; >> + >> + if (!state->visible) >> + return 0; >> + >> + crtc_state = drm_atomic_get_new_crtc_state(state->state, state->crtc); >> + if (!crtc_state) >> + return -EINVAL; >> + >> + src_w = drm_rect_width(&state->src) >> 16; >> + src_h = drm_rect_height(&state->src) >> 16; >> + dst_w = drm_rect_width(&state->dst); >> + >> + fmt = state->fb->format; >> + soc = to_tegra_dc(state->crtc)->soc; >> + >> + /* >> + * Note that real memory bandwidth vary depending on format and >> + * memory layout, we are not taking that into account because small >> + * estimation error isn't important since bandwidth is rounded up >> + * anyway. >> + */ >> + for (i = 0, bpp = 0; i < fmt->num_planes; i++) { >> + bpp_plane = fmt->cpp[i] * 8; > > Nit: you could declare the bpp_plane here. > >> + /* >> + * Sub-sampling is relevant for chroma planes only and vertical >> + * readouts are not cached, hence only horizontal sub-sampling >> + * matters. >> + */ >> + if (i > 0) >> + bpp_plane /= fmt->hsub; >> + >> + bpp += bpp_plane; >> + } >> + >> + /* >> + * Horizontal downscale takes extra bandwidth which roughly depends >> + * on the scaled width. >> + */ >> + if (src_w > dst_w) >> + mul = (src_w - dst_w) * bpp / 2048 + 1; >> + else >> + mul = 1; > > Does it really need more bandwidth to scale down? Does it read the same > data multiple times just to throw it away? The hardware isn't optimized for downscale, it indeed takes more bandwidth. You'll witness a severe underflow of plane's memory FIFO buffer on trying to downscale 1080p plane to 50x50. It's more optimal to make a 2d blit to intermediate framebuffer for a large downscales. >> + /* average bandwidth in bytes/s */ >> + avg_bandwidth = src_w * src_h * bpp / 8 * mul; >> + avg_bandwidth *= drm_mode_vrefresh(&crtc_state->mode); >> + >> + /* mode.clock in kHz, peak bandwidth in kbit/s */ >> + peak_bandwidth = crtc_state->mode.clock * bpp * mul; > > I would guess that (src_w * bpp / 8) needs rounding up unless the plane > is continuous. Or you could just add the max rounding error here and > get a safe overestimated value. Maybe this would be better done when > summing per-plane widths. Looks like indeed it should be good to add a round-up, thanks. >> + /* ICC bandwidth in kbyte/s */ >> + peak_bandwidth = kbps_to_icc(peak_bandwidth); >> + avg_bandwidth = Bps_to_icc(avg_bandwidth); > > This could be merged with the assignments after the following 'if' block. Seem so, thanks. >> + /* >> + * Tegra30/114 Memory Controller can't interleave DC memory requests >> + * and DC uses 16-bytes atom for the tiled windows, while DDR3 uses 32 >> + * bytes atom. Hence there is x2 memory overfetch for tiled framebuffer >> + * and DDR3 on older SoCs. >> + */ >> + if (soc->plane_tiled_memory_bandwidth_x2 && >> + tegra_state->tiling.mode == TEGRA_BO_TILING_MODE_TILED) { >> + peak_bandwidth *= 2; >> + avg_bandwidth *= 2; >> + } >> + >> + tegra_state->peak_memory_bandwidth = peak_bandwidth; >> + tegra_state->avg_memory_bandwidth = avg_bandwidth; >> + >> + return 0; >> +} > > [...] >> +static const char * const tegra_plane_icc_names[] = { >> + "wina", "winb", "winc", "", "", "", "cursor", >> +}; >> + >> +int tegra_plane_interconnect_init(struct tegra_plane *plane) >> +{ >> + const char *icc_name = tegra_plane_icc_names[plane->index]; > > Is plane->index guaranteed to be <= 6? I would guess so, but maybe > BUILD_BUG_ON(sizeof(icc_names)==TEGRA_DC_LEGACY_PLANES_NUM) or some > other check could document this? The maximum index should always stay 6 for older h/w. It should be fine to add extra sanity check to prevent an explicit misuse of the function, just in a case. Thank you for the suggestion. 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=-7.0 required=3.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=no 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 5AD0EC433DB for ; Thu, 4 Mar 2021 21:45:57 +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 095B064FF0 for ; Thu, 4 Mar 2021 21:45:56 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 095B064FF0 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com 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 7F6A26EA78; Thu, 4 Mar 2021 21:45:56 +0000 (UTC) Received: from mail-lf1-x134.google.com (mail-lf1-x134.google.com [IPv6:2a00:1450:4864:20::134]) by gabe.freedesktop.org (Postfix) with ESMTPS id 1B3106EA78 for ; Thu, 4 Mar 2021 21:45:55 +0000 (UTC) Received: by mail-lf1-x134.google.com with SMTP id n16so315204lfb.4 for ; Thu, 04 Mar 2021 13:45:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=XP/a7TGjJBsSgYnX2lmLJ5ngvwoGMReI4BSNcyw6ebk=; b=nOI46XFXRCBsSUvbRvIKRFbGspjtclGzVGrrcNy0gjoIXsNY5ILmAE7F9U/EwJSK89 zVlFxV7Lpzo20sy3jvZYE2fxR3FzJ1t1icwJps0GDinMxkg+myufub1YrQ4srUgc9Tgj FJgZt75J0Z22tfaAFHQQieKIjUpFeVwcqWqnn8m8D+3TeAHxzYYIEe8bJEgF3OeanSIQ mhhZMJ/xfsxBXfrB+oElfttz0xHOpAocwsNrDkJqhPLpuxDIVPanLBDljzrG66L41XRp Hpze9TkcVcyQRWVmpgMUmdknKPeKpDD2JAD3cra0IDCkJANwUxw69TBdPB2n0WJO7ACN GZ3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=XP/a7TGjJBsSgYnX2lmLJ5ngvwoGMReI4BSNcyw6ebk=; b=ivm+s7vBx8XWgjqK+OunNa1ed5s0pkplVy3uBzDep6jzoONJEF0XGdmON19fEwBUcM wHLQbHYKChAXZ7qntYCxaB8uWUvLOoalLMydufiBDzSwruRRUvNzVNAtgH0XALhJwSzy DVvn33Vm26KbZwLTKiMODlu310IA86yXRsk/NwHqbk3XDFCXmt/QtMiecIQ/WLBQ6OxT NLg5I9uDzjip+U14aaBULsLQW9++LG4dn+JsoNT7Kr+xqR3qvh+yd5yTj5xRgvGVCEgI cBxT2wevwbxqmqQDVMsOuDcYRrwTDDdCjfHKaP06A56CEn44mgiVqcqTrZfRWeAZq/rA YUXg== X-Gm-Message-State: AOAM531zZJm2Xn+V4KJ+3Hpp8XauDPQAz9YyLcAZJCAyX38IIb9BZj3l DnE+ZYK6LI+qf1g+j1qpbj/ki5eoG5A= X-Google-Smtp-Source: ABdhPJxa5Ga/1VP7ae9n+Gjm6IJEdSNjZCFSl4lVJSoFVNiX66SfK9IQTTFNi1oLAEsaQ49/wksTcA== X-Received: by 2002:a05:6512:2289:: with SMTP id f9mr3612444lfu.362.1614894353207; Thu, 04 Mar 2021 13:45:53 -0800 (PST) Received: from [192.168.2.145] (109-252-193-52.dynamic.spd-mgts.ru. [109.252.193.52]) by smtp.googlemail.com with ESMTPSA id z11sm65181lfd.98.2021.03.04.13.45.52 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 04 Mar 2021 13:45:52 -0800 (PST) Subject: Re: [PATCH v13 1/2] drm/tegra: dc: Support memory bandwidth management To: =?UTF-8?B?TWljaGHFgiBNaXJvc8WCYXc=?= References: <20210302124445.29444-1-digetx@gmail.com> <20210302124445.29444-2-digetx@gmail.com> <20210303230827.GA22628@qmqm.qmqm.pl> From: Dmitry Osipenko Message-ID: <1b352c7e-cc72-ba08-32ba-08c05cc3aa03@gmail.com> Date: Fri, 5 Mar 2021 00:45:51 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.4.2 MIME-Version: 1.0 In-Reply-To: <20210303230827.GA22628@qmqm.qmqm.pl> Content-Language: en-US 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-pm@vger.kernel.org, Nicolas Chauvet , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Jonathan Hunter , Thierry Reding , Matt Merhar , Peter Geis , linux-tegra@vger.kernel.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" MDQuMDMuMjAyMSAwMjowOCwgTWljaGHFgiBNaXJvc8WCYXcg0L/QuNGI0LXRgjoKPiBPbiBUdWUs IE1hciAwMiwgMjAyMSBhdCAwMzo0NDo0NFBNICswMzAwLCBEbWl0cnkgT3NpcGVua28gd3JvdGU6 Cj4+IERpc3BsYXkgY29udHJvbGxlciAoREMpIHBlcmZvcm1zIGlzb2Nocm9ub3VzIG1lbW9yeSB0 cmFuc2ZlcnMsIGFuZCB0aHVzLAo+PiBoYXMgYSByZXF1aXJlbWVudCBmb3IgYSBtaW5pbXVtIG1l bW9yeSBiYW5kd2lkdGggdGhhdCBzaGFsbCBiZSBmdWxmaWxsZWQsCj4+IG90aGVyd2lzZSBmcmFt ZWJ1ZmZlciBkYXRhIGNhbid0IGJlIGZldGNoZWQgZmFzdCBlbm91Z2ggYW5kIHRoaXMgcmVzdWx0 cwo+PiBpbiBhIERDJ3MgZGF0YS1GSUZPIHVuZGVyZmxvdyB0aGF0IGZvbGxvd3MgYnkgYSB2aXN1 YWwgY29ycnVwdGlvbi4KPj4KPj4gVGhlIE1lbW9yeSBDb250cm9sbGVyIGRyaXZlcnMgcHJvdmlk ZSBmYWNpbGl0eSBmb3IgbWVtb3J5IGJhbmR3aWR0aAo+PiBtYW5hZ2VtZW50IHZpYSBpbnRlcmNv bm5lY3QgQVBJLiBMZXQncyB3aXJlIHVwIHRoZSBpbnRlcmNvbm5lY3QgQVBJCj4+IHN1cHBvcnQg dG8gdGhlIERDIGRyaXZlciBpbiBvcmRlciB0byBmaXggdGhlIGRpc3RvcnRlZCBkaXNwbGF5IG91 dHB1dAo+PiBvbiBUMzAgT3V5YSwgVDEyNCBUSzEgYW5kIG90aGVyIFRlZ3JhIGRldmljZXMuCj4g Cj4gSSBkaWQgYSByZWFkIG9uIHRoZSBjb2RlLiBJIGhhdmUgcHV0IHNvbWUgdGhvdWdodHMgYW5k IG5pdHMgaW5iZXR3ZWVuIHRoZQo+IGRpZmYsIGJ1dCBoZXJlIGFyZSBtb3JlIGdlbmVyYWwgcXVl c3Rpb25zIGFib3V0IHRoZSBwYXRjaDoKCkhlbGxvLCBNaWNoYcWCISBUaGFuayB5b3UgdmVyeSBt dWNoIGZvciB0YWtpbmcgYSBsb29rIGF0IHRoZSBwYXRjaCEKCj4gSXMgdGhlcmUgYSByZWFzb24g d2h5IHRoZSBiYW5kd2lkdGggaXMgYWxsb2NhdGVkIHBlciBwbGFuZSBpbnN0ZWFkIG9mIGp1c3QK PiB1c2luZyBvbmUgcGVhayBhbmQgYXZlcmFnZSBmb3IgdGhlIHdob2xlIGNvbmZpZ3VyYXRpb24/ IE9yIGlzIHRoZXJlIGEgbmVlZAo+IHRvIGV4cG9zZSBhbGwgdGhlIHBsYW5lcyBhcyBpbnRlcmNv bm5lY3QgY2hhbm5lbHMgYW5kIGFsbG9jYXRlIHRoZWlyCj4gYmFuZHdpZHRoIGluZGl2aWR1YWxs eT8KCkVhY2ggZGlzcGxheSBwbGFuZSBoYXMgaW5kaXZpZHVhbCBtZW1vcnkgY2xpZW50IG9uIFRl Z3JhLCBtZW1vcnkgSUNDCnBhdGhzIGFyZSBzcGVjaWZpZWQgcGVyIG1lbW9yeSBjbGllbnQuIFRo aXMgaXMgaG93IG1lbW9yeSBJQ0NzIGFyZQpkZWZpbmVkIGluIHRoZSBEVCBiaW5kaW5nIGFuZCB0 aGF0J3Mgd2hhdCBtZW1vcnkgZHJpdmVycyBhcmUgZXhwZWN0aW5nCnRvIGRlYWwgd2l0aC4gSXQg aXMgYWxzbyBuaWNlIHRvIHNlZSBpbiBJQ0MgZGVidWdmcyBob3cgbXVjaCBtZW1vcnkKYmFuZHdp ZHRoIGlzIGNvbnN1bWVkIGJ5IGVhY2ggaW5kaXZpZHVhbCBtZW1vcnkgY2xpZW50LgoKPiBGcm9t IGFsZ29yaXRobWljIHBhcnQgSSBzZWUgdGhhdCB0aGUgcGxhbmUgb3ZlcmxhcHMgYXJlIGNhbGN1 bGF0ZWQgdHdpY2UKPiAoQSB2cyBCIGFuZCBsYXRlciBCIHZzIEEpLiBUaGUgY3Vyc29yIHBsYW5l IGlzIGlnbm9yZWQsIGJ1dCBuZXZlcnRoZWxlc3MKPiBpdHMgb3ZlcmxhcCBtYXNrIGlzIGNhbGN1 bGF0ZWQgYmVmb3JlIGJlaW5nIHRocm93biBhd2F5LgoKVGhlIGFsZ29yaXRobSBhc3N1bWVzIHRo YXQgd2UgaGF2ZSBhIGZpeGVkIG51bWJlciBvZiBwbGFuZXMgdG8gY2FyZQphYm91dCBhbmQgaXQn cyBub3QgZXhlY3V0ZWQgaW4gYSBob3QgY29kZSBwYXRoLCBoZW5jZSBpdCdzIG1vcmUgb3B0aW1h bAp0byBoYXZlIGEgc2ltcGxlciBhbmQgc21hbGxlciBjb2RlIHJhdGhlciB0aGFuIHRyeSB0byBv cHRpbWl6ZSBpdAp3aXRob3V0IGdhaW5pbmcgYW55IGJlbmVmaXRzLCBJTU8uCgo+IFRoZSBiYW5k d2lkdGhzCj4gYXJlIGFsc28gY2FsY3VsYXRlZCB0d2ljZTogb25jZSBmb3IgcHJlLWNvbW1pdCBh bmQgdGhlbiBhZ2FpbiBmb3IKPiBwb3N0LWNvbW1pdC4gIElzIHNldHRpbmcgYmFuZHdpZHRoIGZv ciBhbiBpbnRlcmNvbm5lY3QgZXhwZW5zaXZlIHdoZW4KPiByZS1zZXR0aW5nIGEgdmFsdWUgdGhh dCB3YXMgYWxyZWFkeSBzZXQ/IFRoZSBjb2RlIHNlZW1zIHRvIGF2b2lkIHRoaXMKPiBjYXNlLCBi dXQgbWF5YmUgdW5uZWNlc3NhcmlseT8KClRoZSBDQ0YgZGlzY2FyZHMgZHVtbXkgcmF0ZS1jaGFu Z2VzIGluIHRoZSBlbmQgb2YgSUNDIGNvZGUgcGF0aC4KQmVzaWRlcywgd2UncmUgbm90IHBlcmZv cm1pbmcgaXQgaW4gYSBob3QgY29kZSBwYXRocywgaGVuY2UgcGVyZm9ybWFuY2UKaXNuJ3QgYSBj b25jZXJuIGluIHRoaXMgcGF0Y2guCgpUaGUgdGVncmFfY3J0Y191cGRhdGVfbWVtb3J5X2JhbmR3 aWR0aCgpIHJlbGllcyBvbiBiZWluZyBjYWxsZWQgYmVmb3JlCmFuZCBhZnRlciB0aGUgYXRvbWlj IGNvbW1pdC4gRm9yIGV4YW1wbGUgQ1JUQydzICJhY3RpdmUiIHN0YXRlIGlzCnVwZGF0ZWQgb25s eSBhZnRlciB0aGUgY29tcGxldGlvbiBvZiBjb21taXQtdGFpbCBwaGFzZS4KCkVhcmxpZXIgdmVy c2lvbnMgb2YgdGhpcyBwYXRjaCBoYWQgY2hlY2tzIHRoYXQgdHJpZWQgdG8gYXZvaWQgc2V0dGlu ZwpiYW5kd2lkdGggaW4gYm90aCAnYmVnaW4nIGFuZCAnZW5kJyBwaGFzZXMgb2YgYSBjb21taXQs IGJ1dCB0aGVuIEkgZm91bmQKdGhhdCBpdCB3YXMgYnVnZ3kgaW4gcmVnYXJkcyB0byBEUE1TIGhh bmRsaW5nIGFuZCBpdCB3YXMgbXVjaCBtb3JlCm9wdGltYWwgdG8gcmVtb3ZlIHRoZSB1bm5lY2Vz c2FyeSAib3B0aW1pemF0aW9ucyIgc2luY2UgY29kZSB3YXMgYmxvd2luZwp1cCBpbiBjb21wbGV4 aXR5IHdoZW4gSSB0cmllZCB0byBmaXggaXQuCgpUaGUgdGVncmFfY3J0Y191cGRhdGVfbWVtb3J5 X2JhbmR3aWR0aCgpIHN0aWxsIGNoZWNrcyB3aGV0aGVyIG9sZCBCVyA9Cm5ldyBCVywgaGVuY2Ug aW4gcHJhY3RpY2UgYWN0dWFsIElDQyBjaGFuZ2VzIGFyZSBvbmx5IHBlcmZvcm1lZCB3aGVuCnBs YW5lIGlzIHR1cm5lZCBvbi9vZmYuCgo+IFsuLi5jdXQgdGhlIGJpZyBhbmQgaW50ZXJlc3Rpbmcg cGFydC4uLl0KPiAKPiBbLi4uXQo+PiBAQCAtNjUsNyArNzUsOSBAQCBzdHJ1Y3QgdGVncmFfZGNf c29jX2luZm8gewo+PiAgCXVuc2lnbmVkIGludCBudW1fb3ZlcmxheV9mb3JtYXRzOwo+PiAgCWNv bnN0IHU2NCAqbW9kaWZpZXJzOwo+PiAgCWJvb2wgaGFzX3dpbl9hX3dpdGhvdXRfZmlsdGVyczsK Pj4gKwlib29sIGhhc193aW5fYl92ZmlsdGVyX21lbV9jbGllbnQ7Cj4+ICAJYm9vbCBoYXNfd2lu X2Nfd2l0aG91dF92ZXJ0X2ZpbHRlcjsKPj4gKwl1bnNpZ25lZCBpbnQgcGxhbmVfdGlsZWRfbWVt b3J5X2JhbmR3aWR0aF94MjsKPiAKPiBUaGlzIGxvb2tzIG1vcmUgbGlrZSBib29sIGluIHRoZSBj b2RlIHVzaW5nIGl0LgoKR29vZCBjYXRjaCwgdGhhbmsgeW91IQoKPiBbLi4uXQo+PiAtLS0gYS9k cml2ZXJzL2dwdS9kcm0vdGVncmEvcGxhbmUuYwo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vdGVn cmEvcGxhbmUuYwo+IFsuLi5dCj4+ICtzdGF0aWMgaW50IHRlZ3JhX3BsYW5lX2NoZWNrX21lbW9y eV9iYW5kd2lkdGgoc3RydWN0IGRybV9wbGFuZV9zdGF0ZSAqc3RhdGUpCj4gCj4gVGhlIGZ1bmN0 aW9uJ3MgYm9keSBsb29rcyBtb3JlIGxpa2UgJ3VwZGF0ZScgb3IgJ3JlY2FsY3VsYXRlJyByYXRo ZXIKPiB0aGFuICdjaGVjaycgdGhlIG1lbW9yeSBiYW5kd2lkdGguCgpUaGUgJ2NoZWNrJyBpbiB0 aGUgbmFtZSBpcyBpbnRlbmRlZCB0byBzaG93IHRoYXQgZnVuY3Rpb24gYmVsb25ncyB0bwphdG9t aWMtc3RhdGUgY2hlY2tpbmcuCgpCdXQgdGVncmFfcGxhbmVfY2FsY3VsYXRlX21lbW9yeV9iYW5k d2lkdGhfc3RhdGUoKSBhbHNvIGlzIGEgZ29vZAp2YXJpYW50LiBJJ2xsIGNvbnNpZGVyIHRoZSBy ZW5hbWluZywgdGhhbmtzIQoKPj4gKwlzdHJ1Y3QgdGVncmFfcGxhbmVfc3RhdGUgKnRlZ3JhX3N0 YXRlID0gdG9fdGVncmFfcGxhbmVfc3RhdGUoc3RhdGUpOwo+PiArCXVuc2lnbmVkIGludCBpLCBi cHAsIGJwcF9wbGFuZSwgZHN0X3csIHNyY193LCBzcmNfaCwgbXVsOwo+PiArCWNvbnN0IHN0cnVj dCB0ZWdyYV9kY19zb2NfaW5mbyAqc29jOwo+PiArCWNvbnN0IHN0cnVjdCBkcm1fZm9ybWF0X2lu Zm8gKmZtdDsKPj4gKwlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGU7Cj4+ICsJdTMy IGF2Z19iYW5kd2lkdGgsIHBlYWtfYmFuZHdpZHRoOwo+PiArCj4+ICsJaWYgKCFzdGF0ZS0+dmlz aWJsZSkKPj4gKwkJcmV0dXJuIDA7Cj4+ICsKPj4gKwljcnRjX3N0YXRlID0gZHJtX2F0b21pY19n ZXRfbmV3X2NydGNfc3RhdGUoc3RhdGUtPnN0YXRlLCBzdGF0ZS0+Y3J0Yyk7Cj4+ICsJaWYgKCFj cnRjX3N0YXRlKQo+PiArCQlyZXR1cm4gLUVJTlZBTDsKPj4gKwo+PiArCXNyY193ID0gZHJtX3Jl Y3Rfd2lkdGgoJnN0YXRlLT5zcmMpID4+IDE2Owo+PiArCXNyY19oID0gZHJtX3JlY3RfaGVpZ2h0 KCZzdGF0ZS0+c3JjKSA+PiAxNjsKPj4gKwlkc3RfdyA9IGRybV9yZWN0X3dpZHRoKCZzdGF0ZS0+ ZHN0KTsKPj4gKwo+PiArCWZtdCA9IHN0YXRlLT5mYi0+Zm9ybWF0Owo+PiArCXNvYyA9IHRvX3Rl Z3JhX2RjKHN0YXRlLT5jcnRjKS0+c29jOwo+PiArCj4+ICsJLyoKPj4gKwkgKiBOb3RlIHRoYXQg cmVhbCBtZW1vcnkgYmFuZHdpZHRoIHZhcnkgZGVwZW5kaW5nIG9uIGZvcm1hdCBhbmQKPj4gKwkg KiBtZW1vcnkgbGF5b3V0LCB3ZSBhcmUgbm90IHRha2luZyB0aGF0IGludG8gYWNjb3VudCBiZWNh dXNlIHNtYWxsCj4+ICsJICogZXN0aW1hdGlvbiBlcnJvciBpc24ndCBpbXBvcnRhbnQgc2luY2Ug YmFuZHdpZHRoIGlzIHJvdW5kZWQgdXAKPj4gKwkgKiBhbnl3YXkuCj4+ICsJICovCj4+ICsJZm9y IChpID0gMCwgYnBwID0gMDsgaSA8IGZtdC0+bnVtX3BsYW5lczsgaSsrKSB7Cj4+ICsJCWJwcF9w bGFuZSA9IGZtdC0+Y3BwW2ldICogODsKPiAKPiBOaXQ6IHlvdSBjb3VsZCBkZWNsYXJlIHRoZSBi cHBfcGxhbmUgaGVyZS4KPiAKPj4gKwkJLyoKPj4gKwkJICogU3ViLXNhbXBsaW5nIGlzIHJlbGV2 YW50IGZvciBjaHJvbWEgcGxhbmVzIG9ubHkgYW5kIHZlcnRpY2FsCj4+ICsJCSAqIHJlYWRvdXRz IGFyZSBub3QgY2FjaGVkLCBoZW5jZSBvbmx5IGhvcml6b250YWwgc3ViLXNhbXBsaW5nCj4+ICsJ CSAqIG1hdHRlcnMuCj4+ICsJCSAqLwo+PiArCQlpZiAoaSA+IDApCj4+ICsJCQlicHBfcGxhbmUg Lz0gZm10LT5oc3ViOwo+PiArCj4+ICsJCWJwcCArPSBicHBfcGxhbmU7Cj4+ICsJfQo+PiArCj4+ ICsJLyoKPj4gKwkgKiBIb3Jpem9udGFsIGRvd25zY2FsZSB0YWtlcyBleHRyYSBiYW5kd2lkdGgg d2hpY2ggcm91Z2hseSBkZXBlbmRzCj4+ICsJICogb24gdGhlIHNjYWxlZCB3aWR0aC4KPj4gKwkg Ki8KPj4gKwlpZiAoc3JjX3cgPiBkc3RfdykKPj4gKwkJbXVsID0gKHNyY193IC0gZHN0X3cpICog YnBwIC8gMjA0OCArIDE7Cj4+ICsJZWxzZQo+PiArCQltdWwgPSAxOwo+IAo+IERvZXMgaXQgcmVh bGx5IG5lZWQgbW9yZSBiYW5kd2lkdGggdG8gc2NhbGUgZG93bj8gRG9lcyBpdCByZWFkIHRoZSBz YW1lCj4gZGF0YSBtdWx0aXBsZSB0aW1lcyBqdXN0IHRvIHRocm93IGl0IGF3YXk/CgpUaGUgaGFy ZHdhcmUgaXNuJ3Qgb3B0aW1pemVkIGZvciBkb3duc2NhbGUsIGl0IGluZGVlZCB0YWtlcyBtb3Jl CmJhbmR3aWR0aC4gWW91J2xsIHdpdG5lc3MgYSBzZXZlcmUgdW5kZXJmbG93IG9mIHBsYW5lJ3Mg bWVtb3J5IEZJRk8KYnVmZmVyIG9uIHRyeWluZyB0byBkb3duc2NhbGUgMTA4MHAgcGxhbmUgdG8g NTB4NTAuIEl0J3MgbW9yZSBvcHRpbWFsIHRvCm1ha2UgYSAyZCBibGl0IHRvIGludGVybWVkaWF0 ZSBmcmFtZWJ1ZmZlciBmb3IgYSBsYXJnZSBkb3duc2NhbGVzLgoKPj4gKwkvKiBhdmVyYWdlIGJh bmR3aWR0aCBpbiBieXRlcy9zICovCj4+ICsJYXZnX2JhbmR3aWR0aCAgPSBzcmNfdyAqIHNyY19o ICogYnBwIC8gOCAqIG11bDsKPj4gKwlhdmdfYmFuZHdpZHRoICo9IGRybV9tb2RlX3ZyZWZyZXNo KCZjcnRjX3N0YXRlLT5tb2RlKTsKPj4gKwo+PiArCS8qIG1vZGUuY2xvY2sgaW4ga0h6LCBwZWFr IGJhbmR3aWR0aCBpbiBrYml0L3MgKi8KPj4gKwlwZWFrX2JhbmR3aWR0aCA9IGNydGNfc3RhdGUt Pm1vZGUuY2xvY2sgKiBicHAgKiBtdWw7Cj4gCj4gSSB3b3VsZCBndWVzcyB0aGF0IChzcmNfdyAq IGJwcCAvIDgpIG5lZWRzIHJvdW5kaW5nIHVwIHVubGVzcyB0aGUgcGxhbmUKPiBpcyBjb250aW51 b3VzLiBPciB5b3UgY291bGQganVzdCBhZGQgdGhlIG1heCByb3VuZGluZyBlcnJvciBoZXJlIGFu ZAo+IGdldCBhIHNhZmUgb3ZlcmVzdGltYXRlZCB2YWx1ZS4gTWF5YmUgdGhpcyB3b3VsZCBiZSBi ZXR0ZXIgZG9uZSB3aGVuCj4gc3VtbWluZyBwZXItcGxhbmUgd2lkdGhzLgoKTG9va3MgbGlrZSBp bmRlZWQgaXQgc2hvdWxkIGJlIGdvb2QgdG8gYWRkIGEgcm91bmQtdXAsIHRoYW5rcy4KCj4+ICsJ LyogSUNDIGJhbmR3aWR0aCBpbiBrYnl0ZS9zICovCj4+ICsJcGVha19iYW5kd2lkdGggPSBrYnBz X3RvX2ljYyhwZWFrX2JhbmR3aWR0aCk7Cj4+ICsJYXZnX2JhbmR3aWR0aCAgPSBCcHNfdG9faWNj KGF2Z19iYW5kd2lkdGgpOwo+IAo+IFRoaXMgY291bGQgYmUgbWVyZ2VkIHdpdGggdGhlIGFzc2ln bm1lbnRzIGFmdGVyIHRoZSBmb2xsb3dpbmcgJ2lmJyBibG9jay4KClNlZW0gc28sIHRoYW5rcy4K Cj4+ICsJLyoKPj4gKwkgKiBUZWdyYTMwLzExNCBNZW1vcnkgQ29udHJvbGxlciBjYW4ndCBpbnRl cmxlYXZlIERDIG1lbW9yeSByZXF1ZXN0cwo+PiArCSAqIGFuZCBEQyB1c2VzIDE2LWJ5dGVzIGF0 b20gZm9yIHRoZSB0aWxlZCB3aW5kb3dzLCB3aGlsZSBERFIzIHVzZXMgMzIKPj4gKwkgKiBieXRl cyBhdG9tLiBIZW5jZSB0aGVyZSBpcyB4MiBtZW1vcnkgb3ZlcmZldGNoIGZvciB0aWxlZCBmcmFt ZWJ1ZmZlcgo+PiArCSAqIGFuZCBERFIzIG9uIG9sZGVyIFNvQ3MuCj4+ICsJICovCj4+ICsJaWYg KHNvYy0+cGxhbmVfdGlsZWRfbWVtb3J5X2JhbmR3aWR0aF94MiAmJgo+PiArCSAgICB0ZWdyYV9z dGF0ZS0+dGlsaW5nLm1vZGUgPT0gVEVHUkFfQk9fVElMSU5HX01PREVfVElMRUQpIHsKPj4gKwkJ cGVha19iYW5kd2lkdGggKj0gMjsKPj4gKwkJYXZnX2JhbmR3aWR0aCAqPSAyOwo+PiArCX0KPj4g Kwo+PiArCXRlZ3JhX3N0YXRlLT5wZWFrX21lbW9yeV9iYW5kd2lkdGggPSBwZWFrX2JhbmR3aWR0 aDsKPj4gKwl0ZWdyYV9zdGF0ZS0+YXZnX21lbW9yeV9iYW5kd2lkdGggPSBhdmdfYmFuZHdpZHRo Owo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4gCj4gWy4uLl0KPj4gK3N0YXRpYyBjb25zdCBj aGFyICogY29uc3QgdGVncmFfcGxhbmVfaWNjX25hbWVzW10gPSB7Cj4+ICsJIndpbmEiLCAid2lu YiIsICJ3aW5jIiwgIiIsICIiLCAiIiwgImN1cnNvciIsCj4+ICt9Owo+PiArCj4+ICtpbnQgdGVn cmFfcGxhbmVfaW50ZXJjb25uZWN0X2luaXQoc3RydWN0IHRlZ3JhX3BsYW5lICpwbGFuZSkKPj4g K3sKPj4gKwljb25zdCBjaGFyICppY2NfbmFtZSA9IHRlZ3JhX3BsYW5lX2ljY19uYW1lc1twbGFu ZS0+aW5kZXhdOwo+IAo+IElzIHBsYW5lLT5pbmRleCBndWFyYW50ZWVkIHRvIGJlIDw9IDY/IEkg d291bGQgZ3Vlc3Mgc28sIGJ1dCBtYXliZQo+IEJVSUxEX0JVR19PTihzaXplb2YoaWNjX25hbWVz KT09VEVHUkFfRENfTEVHQUNZX1BMQU5FU19OVU0pIG9yIHNvbWUKPiBvdGhlciBjaGVjayBjb3Vs ZCBkb2N1bWVudCB0aGlzPwoKVGhlIG1heGltdW0gaW5kZXggc2hvdWxkIGFsd2F5cyBzdGF5IDYg Zm9yIG9sZGVyIGgvdy4gSXQgc2hvdWxkIGJlIGZpbmUKdG8gYWRkIGV4dHJhIHNhbml0eSBjaGVj ayB0byBwcmV2ZW50IGFuIGV4cGxpY2l0IG1pc3VzZSBvZiB0aGUgZnVuY3Rpb24sCmp1c3QgaW4g YSBjYXNlLiBUaGFuayB5b3UgZm9yIHRoZSBzdWdnZXN0aW9uLgpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1k ZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcv bWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK