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=-15.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 27BB7C4320A for ; Fri, 13 Aug 2021 12:16:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0369E610A4 for ; Fri, 13 Aug 2021 12:16:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229564AbhHMMRG (ORCPT ); Fri, 13 Aug 2021 08:17:06 -0400 Received: from perceval.ideasonboard.com ([213.167.242.64]:53180 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229474AbhHMMRG (ORCPT ); Fri, 13 Aug 2021 08:17:06 -0400 Received: from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 287B54A1; Fri, 13 Aug 2021 14:16:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628856998; bh=wfulRNt8yvhsGrhM4LjmQoomH8J3dxet9JJ7iWsN0LU=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=ogGzu+2sDe9V8+1LOOop+qHu3LgoZvcEnrY8tEOLQtc1/qgkkfaL8Q1sgIO73jyP+ BDFge6tJyCgSPGTuDHc23u6X4rvC1PMmjDYYAwaWyTXppXymYIyHw360FegVumaHU/ 2lseGF7hXKDM6ZCMjBGD2AmUJYjMa/+NHkg7ug+0= Date: Fri, 13 Aug 2021 15:16:33 +0300 From: Laurent Pinchart To: Inki Dae Cc: Sam Ravnborg , Jagan Teki , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , Andrzej Hajda , Neil Armstrong , Robert Foss , Frieder Schrempf , Daniel Vetter , Marek Vasut , Krzysztof Kozlowski , Fabio Estevam , devicetree@vger.kernel.org, linux-samsung-soc@vger.kernel.org, dri-devel@lists.freedesktop.org, NXP Linux Team , linux-amarula , linux-arm-kernel@lists.infradead.org Subject: Re: [RFC PATCH 06/17] drm/exynos: dsi: Handle exynos specifics via driver_data Message-ID: References: <20210704090230.26489-1-jagan@amarulasolutions.com> <20210704090230.26489-7-jagan@amarulasolutions.com> <79ef7f71-b167-2368-e0fd-d4ccaee596c2@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <79ef7f71-b167-2368-e0fd-d4ccaee596c2@samsung.com> Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Hi Inki, On Fri, Aug 13, 2021 at 03:50:56PM +0900, Inki Dae wrote: > 21. 7. 26. 오전 2:25에 Sam Ravnborg 이(가) 쓴 글: > > On Sun, Jul 04, 2021 at 02:32:19PM +0530, Jagan Teki wrote: > >> Exynos DSI driver is actually a Samsung MIPI DSIM bridge > >> IP which is also used in i.MX8MM platforms. > >> > >> Right now the existing driver has some exynos drm specific > >> code bases like te_irq, crtc and component_ops. > >> > >> In order to switch this driver into a common bridge driver > >> We can see 2 options to handle the exynos specific code. > >> > >> A. Drop the component_ops, and rework other specifics. > >> This may lead to more foundation work as it requires > >> more changes in exynos drm drivers stack. > >> > >> B. Handle the exynos specifics via driver data, and make > >> the common bridge work in different platforms and plan > >> for option A in future. > >> > >> So, this patch is trying to add option B) changes to handle > >> exynos specifics via driver_data. > > > > We really should find someone that has the time, energy, knowledge and > > hardware that can include device_link support once anf for all for > > bridges. > > Then we would avoid hacks like this. > > > > I see no other options at the moment, but look forward for a better > > solution. > > I'm not sure that it's correct to share this mipi dsi driver with > I.MX8MM SoC even though it's a same IP because this MIPI DSI device > isn't peripheral device but in SoC. > > It would mean that Exynos MIPI DSI device depends on SoC architecture, > and Exynos and I.MX series are totally different SoC. So if we share > the same driver for the MIPI DSI device then many things we didn't > predict may happen in the future. Isn't that true for external components true thought ? Any driver shared by multiple systems will face this issue, where it will be developed with some use cases in mind, and regressions may happen when the driver is then extended to support other use cases not required for the original platform. In general we don't want multiple drivers for the same IP core unless there are valid technical reasons for that. It's the whole point of the device tree, being able to describe how IP cores are integrated, so that code can be reused across platforms. Of course, integration differences between SoCs can sometimes vary wildly and require some amount of glue code. > I don't want to make Jagan's efforts > in vain for the community but clarify whether this is correct way or > not. If this is only the way we have to go then we could more focus on > actual solution not such hack. Impossible work with Jagan alone I > think. I do agree that we need more correct solutions and less hacks in general :-) The issues faced on Exynos also exist on other platforms, so it would be much better to solve them well once that duplicating implementations with less test coverage and reviews. There have been efforts in the past to address some of these issues, which have resulted in solutions such as the component framework. However, I'd argued that we've never taken it to the last step, and have always stopped with half solutions. The component framework, for instance, is painful to use, and the handling of .remove() in most drivers is completely broken because of that (not just because of that though, we have issues in the DRM core that make hot-unplug just impossible to handle safetly). > So let's get started with a question, > - Is MIPI-DSI bridge device or Encoder device? I think that MIPI-DSI > is a Encoder device managed by atomic KMS. If MIPI-DSI should be > handled as bridge device then does now drm bridge framework provide > everything to share one driver with one more SoC? I mean something > that drm bridge has to consider for such driver support, which is > shared with one more SoC. The DRM "encoder" concept was a bit of a historical mistake that we are stuck with as drm_encoder is exposed to userspace. It comes from a time where nobody was envisioning chaining multiple encoders. DRM is moving to modelling every component after the CRTC as a bridge. This brings much more flexibility, and in that model, the drm_encoder becomes more or less a stub. The DRM bridge API has been extended in the past to support more features, and if anything is still missing that makes it difficult to move away from drm_encoder, we can of course address the issues in drm_bridge. > And Display mode - VIDEO and COMMAND mode - is generic type of MIPI > DSI, and also componentised subsystem is a generic solution to resolve > probing order issue not Exynos specific feature. These are driver > specific ones not Exynos SoC I think. As SoC specific things should be > considered, I think MIPI DSI Driver - interrupt handler and probing > order things are really specific to device driver - should be > separated but we could share the control part of the device. > > I was busy with other projects so didn't care of Linux DRM world so > there may be my missing something. > > >> Signed-off-by: Jagan Teki > >> --- > >> drivers/gpu/drm/exynos/exynos_drm_dsi.c | 37 +++++++++++++++++++------ > >> 1 file changed, 29 insertions(+), 8 deletions(-) > >> > >> diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c > >> index 99a1b8c22313..53d878d4d2d7 100644 > >> --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c > >> +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c > >> @@ -250,6 +250,7 @@ struct exynos_dsi_driver_data { > >> unsigned int wait_for_reset; > >> unsigned int num_bits_resol; > >> const unsigned int *reg_values; > >> + bool exynos_specific; > >> }; > >> > >> struct exynos_dsi { > >> @@ -459,6 +460,7 @@ static const struct exynos_dsi_driver_data exynos3_dsi_driver_data = { > >> .wait_for_reset = 1, > >> .num_bits_resol = 11, > >> .reg_values = reg_values, > >> + .exynos_specific = true, > >> }; > >> > >> static const struct exynos_dsi_driver_data exynos4_dsi_driver_data = { > >> @@ -471,6 +473,7 @@ static const struct exynos_dsi_driver_data exynos4_dsi_driver_data = { > >> .wait_for_reset = 1, > >> .num_bits_resol = 11, > >> .reg_values = reg_values, > >> + .exynos_specific = true, > >> }; > >> > >> static const struct exynos_dsi_driver_data exynos5_dsi_driver_data = { > >> @@ -481,6 +484,7 @@ static const struct exynos_dsi_driver_data exynos5_dsi_driver_data = { > >> .wait_for_reset = 1, > >> .num_bits_resol = 11, > >> .reg_values = reg_values, > >> + .exynos_specific = true, > >> }; > >> > >> static const struct exynos_dsi_driver_data exynos5433_dsi_driver_data = { > >> @@ -492,6 +496,7 @@ static const struct exynos_dsi_driver_data exynos5433_dsi_driver_data = { > >> .wait_for_reset = 0, > >> .num_bits_resol = 12, > >> .reg_values = exynos5433_reg_values, > >> + .exynos_specific = true, > >> }; > >> > >> static const struct exynos_dsi_driver_data exynos5422_dsi_driver_data = { > >> @@ -503,6 +508,7 @@ static const struct exynos_dsi_driver_data exynos5422_dsi_driver_data = { > >> .wait_for_reset = 1, > >> .num_bits_resol = 12, > >> .reg_values = exynos5422_reg_values, > >> + .exynos_specific = true, > >> }; > >> > >> static const struct of_device_id exynos_dsi_of_match[] = { > >> @@ -1484,7 +1490,8 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host, > >> * If attached panel device is for command mode one, dsi should register > >> * TE interrupt handler. > >> */ > >> - if (!(device->mode_flags & MIPI_DSI_MODE_VIDEO)) { > >> + if (dsi->driver_data->exynos_specific && > >> + !(device->mode_flags & MIPI_DSI_MODE_VIDEO)) { > >> int ret = exynos_dsi_register_te_irq(dsi, &device->dev); > >> if (ret) > >> return ret; > >> @@ -1495,8 +1502,9 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host, > >> dsi->lanes = device->lanes; > >> dsi->format = device->format; > >> dsi->mode_flags = device->mode_flags; > >> - exynos_drm_crtc_get_by_type(drm, EXYNOS_DISPLAY_TYPE_LCD)->i80_mode = > >> - !(dsi->mode_flags & MIPI_DSI_MODE_VIDEO); > >> + if (dsi->driver_data->exynos_specific) > >> + exynos_drm_crtc_get_by_type(drm, EXYNOS_DISPLAY_TYPE_LCD)->i80_mode = > >> + !(dsi->mode_flags & MIPI_DSI_MODE_VIDEO); > >> > >> mutex_unlock(&drm->mode_config.mutex); > >> > >> @@ -1515,7 +1523,8 @@ static int exynos_dsi_host_detach(struct mipi_dsi_host *host, > >> if (drm->mode_config.poll_enabled) > >> drm_kms_helper_hotplug_event(drm); > >> > >> - exynos_dsi_unregister_te_irq(dsi); > >> + if (dsi->driver_data->exynos_specific) > >> + exynos_dsi_unregister_te_irq(dsi); > >> > >> return 0; > >> } > >> @@ -1737,6 +1746,15 @@ static int exynos_dsi_probe(struct platform_device *pdev) > >> if (ret) > >> return ret; > >> > >> + if (!dsi->driver_data->exynos_specific) { > >> + ret = mipi_dsi_host_register(&dsi->dsi_host); > >> + if (ret) { > >> + dev_err(dev, "failed to register mipi dsi host: %d\n", > >> + ret); > >> + return ret; > >> + } > >> + } > >> + > >> platform_set_drvdata(pdev, dsi); > >> > >> pm_runtime_enable(dev); > >> @@ -1747,9 +1765,11 @@ static int exynos_dsi_probe(struct platform_device *pdev) > >> > >> drm_bridge_add(&dsi->bridge); > >> > >> - ret = component_add(dev, &exynos_dsi_component_ops); > >> - if (ret) > >> - goto err_disable_runtime; > >> + if (dsi->driver_data->exynos_specific) { > >> + ret = component_add(dev, &exynos_dsi_component_ops); > >> + if (ret) > >> + goto err_disable_runtime; > >> + } > >> > >> return 0; > >> > >> @@ -1767,7 +1787,8 @@ static int exynos_dsi_remove(struct platform_device *pdev) > >> > >> pm_runtime_disable(&pdev->dev); > >> > >> - component_del(&pdev->dev, &exynos_dsi_component_ops); > >> + if (dsi->driver_data->exynos_specific) > >> + component_del(&pdev->dev, &exynos_dsi_component_ops); > >> > >> return 0; > >> } -- Regards, Laurent Pinchart 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=-14.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 DC3F9C4338F for ; Fri, 13 Aug 2021 12:19:08 +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 9E6C1610A4 for ; Fri, 13 Aug 2021 12:19:08 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 9E6C1610A4 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ideasonboard.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=qN4TC68cpJfz0lkUr4F/pQvP15xRwv+OlEJzfVYGDy4=; b=lUaL1zyo69B4hN kkrRBUT+WlcduzphaeNP2P5G/jGa9uMxgO4joYF1B0W6wo63ZxrFM0gSKkGLzphFxiJu0wPL9v51F ukfi+xEv9fc+IRAic8/QmybfgWJLgMA7gQpctp3T4zfugETY42gBTzEOzlyUNp/PFMPcCZP5iyYr9 8Uj2pNXn+EVRIHi8nYKA7BY/3Wm+c1HZjGeES9GCzOCgIB1SjWq9x++LWvCQ4JAiNmXEsQwwoRmHl YZZJkEbxeHAMZyzD73sR32XvqLZs0H4RRiPz3hRIGOnG8jSThfXixu6/UikyeFRJuJxjCB8u+0kny v2RG7X8adECzVNHV6VgA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mEW7H-00Cahq-42; Fri, 13 Aug 2021 12:16:51 +0000 Received: from perceval.ideasonboard.com ([213.167.242.64]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mEW79-00CagW-RB for linux-arm-kernel@lists.infradead.org; Fri, 13 Aug 2021 12:16:48 +0000 Received: from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 287B54A1; Fri, 13 Aug 2021 14:16:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628856998; bh=wfulRNt8yvhsGrhM4LjmQoomH8J3dxet9JJ7iWsN0LU=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=ogGzu+2sDe9V8+1LOOop+qHu3LgoZvcEnrY8tEOLQtc1/qgkkfaL8Q1sgIO73jyP+ BDFge6tJyCgSPGTuDHc23u6X4rvC1PMmjDYYAwaWyTXppXymYIyHw360FegVumaHU/ 2lseGF7hXKDM6ZCMjBGD2AmUJYjMa/+NHkg7ug+0= Date: Fri, 13 Aug 2021 15:16:33 +0300 From: Laurent Pinchart To: Inki Dae Cc: Sam Ravnborg , Jagan Teki , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , Andrzej Hajda , Neil Armstrong , Robert Foss , Frieder Schrempf , Daniel Vetter , Marek Vasut , Krzysztof Kozlowski , Fabio Estevam , devicetree@vger.kernel.org, linux-samsung-soc@vger.kernel.org, dri-devel@lists.freedesktop.org, NXP Linux Team , linux-amarula , linux-arm-kernel@lists.infradead.org Subject: Re: [RFC PATCH 06/17] drm/exynos: dsi: Handle exynos specifics via driver_data Message-ID: References: <20210704090230.26489-1-jagan@amarulasolutions.com> <20210704090230.26489-7-jagan@amarulasolutions.com> <79ef7f71-b167-2368-e0fd-d4ccaee596c2@samsung.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <79ef7f71-b167-2368-e0fd-d4ccaee596c2@samsung.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210813_051644_093415_43A62E31 X-CRM114-Status: GOOD ( 59.96 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgSW5raSwKCk9uIEZyaSwgQXVnIDEzLCAyMDIxIGF0IDAzOjUwOjU2UE0gKzA5MDAsIElua2kg RGFlIHdyb3RlOgo+IDIxLiA3LiAyNi4g7Jik7KCEIDI6MjXsl5AgU2FtIFJhdm5ib3JnIOydtCjq sIApIOyTtCDquIA6Cj4gPiBPbiBTdW4sIEp1bCAwNCwgMjAyMSBhdCAwMjozMjoxOVBNICswNTMw LCBKYWdhbiBUZWtpIHdyb3RlOgo+ID4+IEV4eW5vcyBEU0kgZHJpdmVyIGlzIGFjdHVhbGx5IGEg U2Ftc3VuZyBNSVBJIERTSU0gYnJpZGdlCj4gPj4gSVAgd2hpY2ggaXMgYWxzbyB1c2VkIGluIGku TVg4TU0gcGxhdGZvcm1zLgo+ID4+Cj4gPj4gUmlnaHQgbm93IHRoZSBleGlzdGluZyBkcml2ZXIg aGFzIHNvbWUgZXh5bm9zIGRybSBzcGVjaWZpYwo+ID4+IGNvZGUgYmFzZXMgbGlrZSB0ZV9pcnEs IGNydGMgYW5kIGNvbXBvbmVudF9vcHMuCj4gPj4KPiA+PiBJbiBvcmRlciB0byBzd2l0Y2ggdGhp cyBkcml2ZXIgaW50byBhIGNvbW1vbiBicmlkZ2UgZHJpdmVyCj4gPj4gV2UgY2FuIHNlZSAyIG9w dGlvbnMgdG8gaGFuZGxlIHRoZSBleHlub3Mgc3BlY2lmaWMgY29kZS4KPiA+Pgo+ID4+IEEuIERy b3AgdGhlIGNvbXBvbmVudF9vcHMsIGFuZCByZXdvcmsgb3RoZXIgc3BlY2lmaWNzLgo+ID4+ICAg IFRoaXMgbWF5IGxlYWQgdG8gbW9yZSBmb3VuZGF0aW9uIHdvcmsgYXMgaXQgcmVxdWlyZXMKPiA+ PiAgICBtb3JlIGNoYW5nZXMgaW4gZXh5bm9zIGRybSBkcml2ZXJzIHN0YWNrLgo+ID4+Cj4gPj4g Qi4gSGFuZGxlIHRoZSBleHlub3Mgc3BlY2lmaWNzIHZpYSBkcml2ZXIgZGF0YSwgYW5kIG1ha2UK PiA+PiAgICB0aGUgY29tbW9uIGJyaWRnZSB3b3JrIGluIGRpZmZlcmVudCBwbGF0Zm9ybXMgYW5k IHBsYW4KPiA+PiAgICBmb3Igb3B0aW9uIEEgaW4gZnV0dXJlLgo+ID4+Cj4gPj4gU28sIHRoaXMg cGF0Y2ggaXMgdHJ5aW5nIHRvIGFkZCBvcHRpb24gQikgY2hhbmdlcyB0byBoYW5kbGUKPiA+PiBl eHlub3Mgc3BlY2lmaWNzIHZpYSBkcml2ZXJfZGF0YS4KPiA+IAo+ID4gV2UgcmVhbGx5IHNob3Vs ZCBmaW5kIHNvbWVvbmUgdGhhdCBoYXMgdGhlIHRpbWUsIGVuZXJneSwga25vd2xlZGdlIGFuZAo+ ID4gaGFyZHdhcmUgdGhhdCBjYW4gaW5jbHVkZSBkZXZpY2VfbGluayBzdXBwb3J0IG9uY2UgYW5m IGZvciBhbGwgZm9yCj4gPiBicmlkZ2VzLgo+ID4gVGhlbiB3ZSB3b3VsZCBhdm9pZCBoYWNrcyBs aWtlIHRoaXMuCj4gPiAKPiA+IEkgc2VlIG5vIG90aGVyIG9wdGlvbnMgYXQgdGhlIG1vbWVudCwg YnV0IGxvb2sgZm9yd2FyZCBmb3IgYSBiZXR0ZXIKPiA+IHNvbHV0aW9uLgo+IAo+IEknbSBub3Qg c3VyZSB0aGF0IGl0J3MgY29ycmVjdCB0byBzaGFyZSB0aGlzIG1pcGkgZHNpIGRyaXZlciB3aXRo Cj4gSS5NWDhNTSBTb0MgZXZlbiB0aG91Z2ggaXQncyBhIHNhbWUgSVAgYmVjYXVzZSB0aGlzIE1J UEkgRFNJIGRldmljZQo+IGlzbid0IHBlcmlwaGVyYWwgZGV2aWNlIGJ1dCBpbiBTb0MuCj4KPiBJ dCB3b3VsZCBtZWFuIHRoYXQgRXh5bm9zIE1JUEkgRFNJIGRldmljZSBkZXBlbmRzIG9uIFNvQyBh cmNoaXRlY3R1cmUsCj4gYW5kIEV4eW5vcyBhbmQgSS5NWCBzZXJpZXMgYXJlIHRvdGFsbHkgZGlm ZmVyZW50IFNvQy4gU28gaWYgd2Ugc2hhcmUKPiB0aGUgc2FtZSBkcml2ZXIgZm9yIHRoZSBNSVBJ IERTSSBkZXZpY2UgdGhlbiBtYW55IHRoaW5ncyB3ZSBkaWRuJ3QKPiBwcmVkaWN0IG1heSBoYXBw ZW4gaW4gdGhlIGZ1dHVyZS4KCklzbid0IHRoYXQgdHJ1ZSBmb3IgZXh0ZXJuYWwgY29tcG9uZW50 cyB0cnVlIHRob3VnaHQgPyBBbnkgZHJpdmVyIHNoYXJlZApieSBtdWx0aXBsZSBzeXN0ZW1zIHdp bGwgZmFjZSB0aGlzIGlzc3VlLCB3aGVyZSBpdCB3aWxsIGJlIGRldmVsb3BlZAp3aXRoIHNvbWUg dXNlIGNhc2VzIGluIG1pbmQsIGFuZCByZWdyZXNzaW9ucyBtYXkgaGFwcGVuIHdoZW4gdGhlIGRy aXZlcgppcyB0aGVuIGV4dGVuZGVkIHRvIHN1cHBvcnQgb3RoZXIgdXNlIGNhc2VzIG5vdCByZXF1 aXJlZCBmb3IgdGhlCm9yaWdpbmFsIHBsYXRmb3JtLgoKSW4gZ2VuZXJhbCB3ZSBkb24ndCB3YW50 IG11bHRpcGxlIGRyaXZlcnMgZm9yIHRoZSBzYW1lIElQIGNvcmUgdW5sZXNzCnRoZXJlIGFyZSB2 YWxpZCB0ZWNobmljYWwgcmVhc29ucyBmb3IgdGhhdC4gSXQncyB0aGUgd2hvbGUgcG9pbnQgb2Yg dGhlCmRldmljZSB0cmVlLCBiZWluZyBhYmxlIHRvIGRlc2NyaWJlIGhvdyBJUCBjb3JlcyBhcmUg aW50ZWdyYXRlZCwgc28gdGhhdApjb2RlIGNhbiBiZSByZXVzZWQgYWNyb3NzIHBsYXRmb3Jtcy4g T2YgY291cnNlLCBpbnRlZ3JhdGlvbiBkaWZmZXJlbmNlcwpiZXR3ZWVuIFNvQ3MgY2FuIHNvbWV0 aW1lcyB2YXJ5IHdpbGRseSBhbmQgcmVxdWlyZSBzb21lIGFtb3VudCBvZiBnbHVlCmNvZGUuCgo+ IEkgZG9uJ3Qgd2FudCB0byBtYWtlIEphZ2FuJ3MgZWZmb3J0cwo+IGluIHZhaW4gZm9yIHRoZSBj b21tdW5pdHkgYnV0IGNsYXJpZnkgd2hldGhlciB0aGlzIGlzIGNvcnJlY3Qgd2F5IG9yCj4gbm90 LiBJZiB0aGlzIGlzIG9ubHkgdGhlIHdheSB3ZSBoYXZlIHRvIGdvIHRoZW4gd2UgY291bGQgbW9y ZSBmb2N1cyBvbgo+IGFjdHVhbCBzb2x1dGlvbiBub3Qgc3VjaCBoYWNrLiBJbXBvc3NpYmxlIHdv cmsgd2l0aCBKYWdhbiBhbG9uZSBJCj4gdGhpbmsuCgpJIGRvIGFncmVlIHRoYXQgd2UgbmVlZCBt b3JlIGNvcnJlY3Qgc29sdXRpb25zIGFuZCBsZXNzIGhhY2tzIGluIGdlbmVyYWwKOi0pIFRoZSBp c3N1ZXMgZmFjZWQgb24gRXh5bm9zIGFsc28gZXhpc3Qgb24gb3RoZXIgcGxhdGZvcm1zLCBzbyBp dAp3b3VsZCBiZSBtdWNoIGJldHRlciB0byBzb2x2ZSB0aGVtIHdlbGwgb25jZSB0aGF0IGR1cGxp Y2F0aW5nCmltcGxlbWVudGF0aW9ucyB3aXRoIGxlc3MgdGVzdCBjb3ZlcmFnZSBhbmQgcmV2aWV3 cy4gVGhlcmUgaGF2ZSBiZWVuCmVmZm9ydHMgaW4gdGhlIHBhc3QgdG8gYWRkcmVzcyBzb21lIG9m IHRoZXNlIGlzc3Vlcywgd2hpY2ggaGF2ZSByZXN1bHRlZAppbiBzb2x1dGlvbnMgc3VjaCBhcyB0 aGUgY29tcG9uZW50IGZyYW1ld29yay4gSG93ZXZlciwgSSdkIGFyZ3VlZCB0aGF0CndlJ3ZlIG5l dmVyIHRha2VuIGl0IHRvIHRoZSBsYXN0IHN0ZXAsIGFuZCBoYXZlIGFsd2F5cyBzdG9wcGVkIHdp dGggaGFsZgpzb2x1dGlvbnMuIFRoZSBjb21wb25lbnQgZnJhbWV3b3JrLCBmb3IgaW5zdGFuY2Us IGlzIHBhaW5mdWwgdG8gdXNlLCBhbmQKdGhlIGhhbmRsaW5nIG9mIC5yZW1vdmUoKSBpbiBtb3N0 IGRyaXZlcnMgaXMgY29tcGxldGVseSBicm9rZW4gYmVjYXVzZQpvZiB0aGF0IChub3QganVzdCBi ZWNhdXNlIG9mIHRoYXQgdGhvdWdoLCB3ZSBoYXZlIGlzc3VlcyBpbiB0aGUgRFJNIGNvcmUKdGhh dCBtYWtlIGhvdC11bnBsdWcganVzdCBpbXBvc3NpYmxlIHRvIGhhbmRsZSBzYWZldGx5KS4KCj4g U28gbGV0J3MgZ2V0IHN0YXJ0ZWQgd2l0aCBhIHF1ZXN0aW9uLAo+IC0gSXMgTUlQSS1EU0kgYnJp ZGdlIGRldmljZSBvciBFbmNvZGVyIGRldmljZT8gSSB0aGluayB0aGF0IE1JUEktRFNJCj4gaXMg YSBFbmNvZGVyIGRldmljZSBtYW5hZ2VkIGJ5IGF0b21pYyBLTVMuIElmIE1JUEktRFNJIHNob3Vs ZCBiZQo+IGhhbmRsZWQgYXMgYnJpZGdlIGRldmljZSB0aGVuIGRvZXMgbm93IGRybSBicmlkZ2Ug ZnJhbWV3b3JrIHByb3ZpZGUKPiBldmVyeXRoaW5nIHRvIHNoYXJlIG9uZSBkcml2ZXIgd2l0aCBv bmUgbW9yZSBTb0M/IEkgbWVhbiBzb21ldGhpbmcKPiB0aGF0IGRybSBicmlkZ2UgaGFzIHRvIGNv bnNpZGVyIGZvciBzdWNoIGRyaXZlciBzdXBwb3J0LCB3aGljaCBpcwo+IHNoYXJlZCB3aXRoIG9u ZSBtb3JlIFNvQy4KClRoZSBEUk0gImVuY29kZXIiIGNvbmNlcHQgd2FzIGEgYml0IG9mIGEgaGlz dG9yaWNhbCBtaXN0YWtlIHRoYXQgd2UgYXJlCnN0dWNrIHdpdGggYXMgZHJtX2VuY29kZXIgaXMg ZXhwb3NlZCB0byB1c2Vyc3BhY2UuIEl0IGNvbWVzIGZyb20gYSB0aW1lCndoZXJlIG5vYm9keSB3 YXMgZW52aXNpb25pbmcgY2hhaW5pbmcgbXVsdGlwbGUgZW5jb2RlcnMuIERSTSBpcyBtb3ZpbmcK dG8gbW9kZWxsaW5nIGV2ZXJ5IGNvbXBvbmVudCBhZnRlciB0aGUgQ1JUQyBhcyBhIGJyaWRnZS4g VGhpcyBicmluZ3MKbXVjaCBtb3JlIGZsZXhpYmlsaXR5LCBhbmQgaW4gdGhhdCBtb2RlbCwgdGhl IGRybV9lbmNvZGVyIGJlY29tZXMgbW9yZQpvciBsZXNzIGEgc3R1Yi4KClRoZSBEUk0gYnJpZGdl IEFQSSBoYXMgYmVlbiBleHRlbmRlZCBpbiB0aGUgcGFzdCB0byBzdXBwb3J0IG1vcmUKZmVhdHVy ZXMsIGFuZCBpZiBhbnl0aGluZyBpcyBzdGlsbCBtaXNzaW5nIHRoYXQgbWFrZXMgaXQgZGlmZmlj dWx0IHRvCm1vdmUgYXdheSBmcm9tIGRybV9lbmNvZGVyLCB3ZSBjYW4gb2YgY291cnNlIGFkZHJl c3MgdGhlIGlzc3VlcyBpbgpkcm1fYnJpZGdlLgoKPiBBbmQgRGlzcGxheSBtb2RlIC0gVklERU8g YW5kIENPTU1BTkQgbW9kZSAtIGlzIGdlbmVyaWMgdHlwZSBvZiBNSVBJCj4gRFNJLCBhbmQgYWxz byBjb21wb25lbnRpc2VkIHN1YnN5c3RlbSBpcyBhIGdlbmVyaWMgc29sdXRpb24gdG8gcmVzb2x2 ZQo+IHByb2Jpbmcgb3JkZXIgaXNzdWUgbm90IEV4eW5vcyBzcGVjaWZpYyBmZWF0dXJlLiBUaGVz ZSBhcmUgZHJpdmVyCj4gc3BlY2lmaWMgb25lcyBub3QgRXh5bm9zIFNvQyBJIHRoaW5rLiBBcyBT b0Mgc3BlY2lmaWMgdGhpbmdzIHNob3VsZCBiZQo+IGNvbnNpZGVyZWQsIEkgdGhpbmsgTUlQSSBE U0kgRHJpdmVyIC0gaW50ZXJydXB0IGhhbmRsZXIgYW5kIHByb2JpbmcKPiBvcmRlciB0aGluZ3Mg YXJlIHJlYWxseSBzcGVjaWZpYyB0byBkZXZpY2UgZHJpdmVyIC0gc2hvdWxkIGJlCj4gc2VwYXJh dGVkIGJ1dCB3ZSBjb3VsZCBzaGFyZSB0aGUgY29udHJvbCBwYXJ0IG9mIHRoZSBkZXZpY2UuCj4g Cj4gSSB3YXMgYnVzeSB3aXRoIG90aGVyIHByb2plY3RzIHNvIGRpZG4ndCBjYXJlIG9mIExpbnV4 IERSTSB3b3JsZCBzbwo+IHRoZXJlIG1heSBiZSBteSBtaXNzaW5nIHNvbWV0aGluZy4KPiAKPiA+ PiBTaWduZWQtb2ZmLWJ5OiBKYWdhbiBUZWtpIDxqYWdhbkBhbWFydWxhc29sdXRpb25zLmNvbT4K PiA+PiAtLS0KPiA+PiAgZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2RzaS5jIHwg MzcgKysrKysrKysrKysrKysrKysrKy0tLS0tLQo+ID4+ICAxIGZpbGUgY2hhbmdlZCwgMjkgaW5z ZXJ0aW9ucygrKSwgOCBkZWxldGlvbnMoLSkKPiA+Pgo+ID4+IGRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHNpLmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9z L2V4eW5vc19kcm1fZHNpLmMKPiA+PiBpbmRleCA5OWExYjhjMjIzMTMuLjUzZDg3OGQ0ZDJkNyAx MDA2NDQKPiA+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHNpLmMK PiA+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHNpLmMKPiA+PiBA QCAtMjUwLDYgKzI1MCw3IEBAIHN0cnVjdCBleHlub3NfZHNpX2RyaXZlcl9kYXRhIHsKPiA+PiAg CXVuc2lnbmVkIGludCB3YWl0X2Zvcl9yZXNldDsKPiA+PiAgCXVuc2lnbmVkIGludCBudW1fYml0 c19yZXNvbDsKPiA+PiAgCWNvbnN0IHVuc2lnbmVkIGludCAqcmVnX3ZhbHVlczsKPiA+PiArCWJv b2wgZXh5bm9zX3NwZWNpZmljOwo+ID4+ICB9Owo+ID4+ICAKPiA+PiAgc3RydWN0IGV4eW5vc19k c2kgewo+ID4+IEBAIC00NTksNiArNDYwLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBleHlub3Nf ZHNpX2RyaXZlcl9kYXRhIGV4eW5vczNfZHNpX2RyaXZlcl9kYXRhID0gewo+ID4+ICAJLndhaXRf Zm9yX3Jlc2V0ID0gMSwKPiA+PiAgCS5udW1fYml0c19yZXNvbCA9IDExLAo+ID4+ICAJLnJlZ192 YWx1ZXMgPSByZWdfdmFsdWVzLAo+ID4+ICsJLmV4eW5vc19zcGVjaWZpYyA9IHRydWUsCj4gPj4g IH07Cj4gPj4gIAo+ID4+ICBzdGF0aWMgY29uc3Qgc3RydWN0IGV4eW5vc19kc2lfZHJpdmVyX2Rh dGEgZXh5bm9zNF9kc2lfZHJpdmVyX2RhdGEgPSB7Cj4gPj4gQEAgLTQ3MSw2ICs0NzMsNyBAQCBz dGF0aWMgY29uc3Qgc3RydWN0IGV4eW5vc19kc2lfZHJpdmVyX2RhdGEgZXh5bm9zNF9kc2lfZHJp dmVyX2RhdGEgPSB7Cj4gPj4gIAkud2FpdF9mb3JfcmVzZXQgPSAxLAo+ID4+ICAJLm51bV9iaXRz X3Jlc29sID0gMTEsCj4gPj4gIAkucmVnX3ZhbHVlcyA9IHJlZ192YWx1ZXMsCj4gPj4gKwkuZXh5 bm9zX3NwZWNpZmljID0gdHJ1ZSwKPiA+PiAgfTsKPiA+PiAgCj4gPj4gIHN0YXRpYyBjb25zdCBz dHJ1Y3QgZXh5bm9zX2RzaV9kcml2ZXJfZGF0YSBleHlub3M1X2RzaV9kcml2ZXJfZGF0YSA9IHsK PiA+PiBAQCAtNDgxLDYgKzQ4NCw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXh5bm9zX2RzaV9k cml2ZXJfZGF0YSBleHlub3M1X2RzaV9kcml2ZXJfZGF0YSA9IHsKPiA+PiAgCS53YWl0X2Zvcl9y ZXNldCA9IDEsCj4gPj4gIAkubnVtX2JpdHNfcmVzb2wgPSAxMSwKPiA+PiAgCS5yZWdfdmFsdWVz ID0gcmVnX3ZhbHVlcywKPiA+PiArCS5leHlub3Nfc3BlY2lmaWMgPSB0cnVlLAo+ID4+ICB9Owo+ ID4+ICAKPiA+PiAgc3RhdGljIGNvbnN0IHN0cnVjdCBleHlub3NfZHNpX2RyaXZlcl9kYXRhIGV4 eW5vczU0MzNfZHNpX2RyaXZlcl9kYXRhID0gewo+ID4+IEBAIC00OTIsNiArNDk2LDcgQEAgc3Rh dGljIGNvbnN0IHN0cnVjdCBleHlub3NfZHNpX2RyaXZlcl9kYXRhIGV4eW5vczU0MzNfZHNpX2Ry aXZlcl9kYXRhID0gewo+ID4+ICAJLndhaXRfZm9yX3Jlc2V0ID0gMCwKPiA+PiAgCS5udW1fYml0 c19yZXNvbCA9IDEyLAo+ID4+ICAJLnJlZ192YWx1ZXMgPSBleHlub3M1NDMzX3JlZ192YWx1ZXMs Cj4gPj4gKwkuZXh5bm9zX3NwZWNpZmljID0gdHJ1ZSwKPiA+PiAgfTsKPiA+PiAgCj4gPj4gIHN0 YXRpYyBjb25zdCBzdHJ1Y3QgZXh5bm9zX2RzaV9kcml2ZXJfZGF0YSBleHlub3M1NDIyX2RzaV9k cml2ZXJfZGF0YSA9IHsKPiA+PiBAQCAtNTAzLDYgKzUwOCw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1 Y3QgZXh5bm9zX2RzaV9kcml2ZXJfZGF0YSBleHlub3M1NDIyX2RzaV9kcml2ZXJfZGF0YSA9IHsK PiA+PiAgCS53YWl0X2Zvcl9yZXNldCA9IDEsCj4gPj4gIAkubnVtX2JpdHNfcmVzb2wgPSAxMiwK PiA+PiAgCS5yZWdfdmFsdWVzID0gZXh5bm9zNTQyMl9yZWdfdmFsdWVzLAo+ID4+ICsJLmV4eW5v c19zcGVjaWZpYyA9IHRydWUsCj4gPj4gIH07Cj4gPj4gIAo+ID4+ICBzdGF0aWMgY29uc3Qgc3Ry dWN0IG9mX2RldmljZV9pZCBleHlub3NfZHNpX29mX21hdGNoW10gPSB7Cj4gPj4gQEAgLTE0ODQs NyArMTQ5MCw4IEBAIHN0YXRpYyBpbnQgZXh5bm9zX2RzaV9ob3N0X2F0dGFjaChzdHJ1Y3QgbWlw aV9kc2lfaG9zdCAqaG9zdCwKPiA+PiAgCSAqIElmIGF0dGFjaGVkIHBhbmVsIGRldmljZSBpcyBm b3IgY29tbWFuZCBtb2RlIG9uZSwgZHNpIHNob3VsZCByZWdpc3Rlcgo+ID4+ICAJICogVEUgaW50 ZXJydXB0IGhhbmRsZXIuCj4gPj4gIAkgKi8KPiA+PiAtCWlmICghKGRldmljZS0+bW9kZV9mbGFn cyAmIE1JUElfRFNJX01PREVfVklERU8pKSB7Cj4gPj4gKwlpZiAoZHNpLT5kcml2ZXJfZGF0YS0+ ZXh5bm9zX3NwZWNpZmljICYmCj4gPj4gKwkgICAgIShkZXZpY2UtPm1vZGVfZmxhZ3MgJiBNSVBJ X0RTSV9NT0RFX1ZJREVPKSkgewo+ID4+ICAJCWludCByZXQgPSBleHlub3NfZHNpX3JlZ2lzdGVy X3RlX2lycShkc2ksICZkZXZpY2UtPmRldik7Cj4gPj4gIAkJaWYgKHJldCkKPiA+PiAgCQkJcmV0 dXJuIHJldDsKPiA+PiBAQCAtMTQ5NSw4ICsxNTAyLDkgQEAgc3RhdGljIGludCBleHlub3NfZHNp X2hvc3RfYXR0YWNoKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAo+ID4+ICAJZHNpLT5sYW5l cyA9IGRldmljZS0+bGFuZXM7Cj4gPj4gIAlkc2ktPmZvcm1hdCA9IGRldmljZS0+Zm9ybWF0Owo+ ID4+ICAJZHNpLT5tb2RlX2ZsYWdzID0gZGV2aWNlLT5tb2RlX2ZsYWdzOwo+ID4+IC0JZXh5bm9z X2RybV9jcnRjX2dldF9ieV90eXBlKGRybSwgRVhZTk9TX0RJU1BMQVlfVFlQRV9MQ0QpLT5pODBf bW9kZSA9Cj4gPj4gLQkJCSEoZHNpLT5tb2RlX2ZsYWdzICYgTUlQSV9EU0lfTU9ERV9WSURFTyk7 Cj4gPj4gKwlpZiAoZHNpLT5kcml2ZXJfZGF0YS0+ZXh5bm9zX3NwZWNpZmljKQo+ID4+ICsJCWV4 eW5vc19kcm1fY3J0Y19nZXRfYnlfdHlwZShkcm0sIEVYWU5PU19ESVNQTEFZX1RZUEVfTENEKS0+ aTgwX21vZGUgPQo+ID4+ICsJCQkJCSAgICAhKGRzaS0+bW9kZV9mbGFncyAmIE1JUElfRFNJX01P REVfVklERU8pOwo+ID4+ICAKPiA+PiAgCW11dGV4X3VubG9jaygmZHJtLT5tb2RlX2NvbmZpZy5t dXRleCk7Cj4gPj4gIAo+ID4+IEBAIC0xNTE1LDcgKzE1MjMsOCBAQCBzdGF0aWMgaW50IGV4eW5v c19kc2lfaG9zdF9kZXRhY2goc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCj4gPj4gIAlpZiAo ZHJtLT5tb2RlX2NvbmZpZy5wb2xsX2VuYWJsZWQpCj4gPj4gIAkJZHJtX2ttc19oZWxwZXJfaG90 cGx1Z19ldmVudChkcm0pOwo+ID4+ICAKPiA+PiAtCWV4eW5vc19kc2lfdW5yZWdpc3Rlcl90ZV9p cnEoZHNpKTsKPiA+PiArCWlmIChkc2ktPmRyaXZlcl9kYXRhLT5leHlub3Nfc3BlY2lmaWMpCj4g Pj4gKwkJZXh5bm9zX2RzaV91bnJlZ2lzdGVyX3RlX2lycShkc2kpOwo+ID4+ICAKPiA+PiAgCXJl dHVybiAwOwo+ID4+ICB9Cj4gPj4gQEAgLTE3MzcsNiArMTc0NiwxNSBAQCBzdGF0aWMgaW50IGV4 eW5vc19kc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+PiAgCWlmIChy ZXQpCj4gPj4gIAkJcmV0dXJuIHJldDsKPiA+PiAgCj4gPj4gKwlpZiAoIWRzaS0+ZHJpdmVyX2Rh dGEtPmV4eW5vc19zcGVjaWZpYykgewo+ID4+ICsJCXJldCA9IG1pcGlfZHNpX2hvc3RfcmVnaXN0 ZXIoJmRzaS0+ZHNpX2hvc3QpOwo+ID4+ICsJCWlmIChyZXQpIHsKPiA+PiArCQkJZGV2X2Vycihk ZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgbWlwaSBkc2kgaG9zdDogJWRcbiIsCj4gPj4gKwkJCQly ZXQpOwo+ID4+ICsJCQlyZXR1cm4gcmV0Owo+ID4+ICsJCX0KPiA+PiArCX0KPiA+PiArCj4gPj4g IAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkc2kpOwo+ID4+ICAKPiA+PiAgCXBtX3J1bnRp bWVfZW5hYmxlKGRldik7Cj4gPj4gQEAgLTE3NDcsOSArMTc2NSwxMSBAQCBzdGF0aWMgaW50IGV4 eW5vc19kc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+PiAgCj4gPj4g IAlkcm1fYnJpZGdlX2FkZCgmZHNpLT5icmlkZ2UpOwo+ID4+ICAKPiA+PiAtCXJldCA9IGNvbXBv bmVudF9hZGQoZGV2LCAmZXh5bm9zX2RzaV9jb21wb25lbnRfb3BzKTsKPiA+PiAtCWlmIChyZXQp Cj4gPj4gLQkJZ290byBlcnJfZGlzYWJsZV9ydW50aW1lOwo+ID4+ICsJaWYgKGRzaS0+ZHJpdmVy X2RhdGEtPmV4eW5vc19zcGVjaWZpYykgewo+ID4+ICsJCXJldCA9IGNvbXBvbmVudF9hZGQoZGV2 LCAmZXh5bm9zX2RzaV9jb21wb25lbnRfb3BzKTsKPiA+PiArCQlpZiAocmV0KQo+ID4+ICsJCQln b3RvIGVycl9kaXNhYmxlX3J1bnRpbWU7Cj4gPj4gKwl9Cj4gPj4gIAo+ID4+ICAJcmV0dXJuIDA7 Cj4gPj4gIAo+ID4+IEBAIC0xNzY3LDcgKzE3ODcsOCBAQCBzdGF0aWMgaW50IGV4eW5vc19kc2lf cmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPj4gIAo+ID4+ICAJcG1fcnVu dGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwo+ID4+ICAKPiA+PiAtCWNvbXBvbmVudF9kZWwoJnBk ZXYtPmRldiwgJmV4eW5vc19kc2lfY29tcG9uZW50X29wcyk7Cj4gPj4gKwlpZiAoZHNpLT5kcml2 ZXJfZGF0YS0+ZXh5bm9zX3NwZWNpZmljKQo+ID4+ICsJCWNvbXBvbmVudF9kZWwoJnBkZXYtPmRl diwgJmV4eW5vc19kc2lfY29tcG9uZW50X29wcyk7Cj4gPj4gIAo+ID4+ICAJcmV0dXJuIDA7Cj4g Pj4gIH0KCi0tIApSZWdhcmRzLAoKTGF1cmVudCBQaW5jaGFydAoKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxp c3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZy YWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=