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=-8.3 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,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 A8736ECE588 for ; Tue, 15 Oct 2019 11:54:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6A5482067B for ; Tue, 15 Oct 2019 11:54:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Zdl3c5hh" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729270AbfJOLyC (ORCPT ); Tue, 15 Oct 2019 07:54:02 -0400 Received: from perceval.ideasonboard.com ([213.167.242.64]:54760 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725790AbfJOLyB (ORCPT ); Tue, 15 Oct 2019 07:54:01 -0400 Received: from [192.168.0.20] (cpc89242-aztw30-2-0-cust488.18-1.cable.virginm.net [86.31.129.233]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id EBEE7324; Tue, 15 Oct 2019 13:53:57 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1571140438; bh=GOcxkzBHUdKgh7wgi7igSzOrX0FbKhs4iiGt/kI06yk=; h=Reply-To:Subject:To:Cc:References:From:Date:In-Reply-To:From; b=Zdl3c5hhhMFnXeJLnl2dqjS4huDIDJHrWT5Qb+oh7U9nW5Dumr70JgcYyd3MecrZz PqSs0mCBkTQVLoasJmGTavuebXGlWQXxNSuPBqExEYiCev9K3R1yjPmznPx9An7Dlo B2H5gg1nrwYAxCsr1uCkwimrLP19L5lH7ZNm11mY= Reply-To: kieran.bingham+renesas@ideasonboard.com Subject: Re: [PATCH v5 3/8] drm: rcar-du: Add support for CMM To: Jacopo Mondi , laurent.pinchart@ideasonboard.com, geert@linux-m68k.org, horms@verge.net.au, uli+renesas@fpond.eu, VenkataRajesh.Kalakodima@in.bosch.com Cc: airlied@linux.ie, daniel@ffwll.ch, koji.matsuoka.xm@renesas.com, muroya@ksk.co.jp, Harsha.ManjulaMallikarjun@in.bosch.com, ezequiel@collabora.com, seanpaul@chromium.org, linux-renesas-soc@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org References: <20191015104621.62514-1-jacopo+renesas@jmondi.org> <20191015104621.62514-4-jacopo+renesas@jmondi.org> From: Kieran Bingham Organization: Ideas on Board Message-ID: <2aefe646-45db-aafa-b22b-e1cf9616259d@ideasonboard.com> Date: Tue, 15 Oct 2019 12:53:55 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <20191015104621.62514-4-jacopo+renesas@jmondi.org> Content-Type: text/plain; charset=utf-8 Content-Language: en-GB Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Jacopo, On 15/10/2019 11:46, Jacopo Mondi wrote: > Add a driver for the R-Car Display Unit Color Correction Module. > > In most of Gen3 SoCs, each DU output channel is provided with a CMM unit > to perform image enhancement and color correction. > > Add support for CMM through a driver that supports configuration of > the 1-dimensional LUT table. More advanced CMM features will be > implemented on top of this initial one. > This is looking good to me. I have patches which start to add CLU on top of this, which refactor things slightly - but I don't think that refactoring needs to be in this series, and this version is independent and looks good ... thus: Reviewed-by: Kieran Bingham > Signed-off-by: Jacopo Mondi > --- > drivers/gpu/drm/rcar-du/Kconfig | 7 + > drivers/gpu/drm/rcar-du/Makefile | 1 + > drivers/gpu/drm/rcar-du/rcar_cmm.c | 198 +++++++++++++++++++++++++++++ > drivers/gpu/drm/rcar-du/rcar_cmm.h | 60 +++++++++ > 4 files changed, 266 insertions(+) > create mode 100644 drivers/gpu/drm/rcar-du/rcar_cmm.c > create mode 100644 drivers/gpu/drm/rcar-du/rcar_cmm.h > > diff --git a/drivers/gpu/drm/rcar-du/Kconfig b/drivers/gpu/drm/rcar-du/Kconfig > index 1529849e217e..539d232790d1 100644 > --- a/drivers/gpu/drm/rcar-du/Kconfig > +++ b/drivers/gpu/drm/rcar-du/Kconfig > @@ -13,6 +13,13 @@ config DRM_RCAR_DU > Choose this option if you have an R-Car chipset. > If M is selected the module will be called rcar-du-drm. > > +config DRM_RCAR_CMM > + bool "R-Car DU Color Management Module (CMM) Support" > + depends on DRM && OF > + depends on DRM_RCAR_DU DRM_RCAR_DU already depends on both DRM && OF, so I wonder if those are needed to be specified explicitly. Doesn't hurt of course, but I see DRM_RCAR_DW_HDMI does the same, and so does DRM_RCAR_LVDS, so I don't think you need to remove it. > + help > + Enable support for R-Car Color Management Module (CMM). > + > config DRM_RCAR_DW_HDMI > tristate "R-Car DU Gen3 HDMI Encoder Support" > depends on DRM && OF > diff --git a/drivers/gpu/drm/rcar-du/Makefile b/drivers/gpu/drm/rcar-du/Makefile > index 6c2ed9c46467..4d1187ccc3e5 100644 > --- a/drivers/gpu/drm/rcar-du/Makefile > +++ b/drivers/gpu/drm/rcar-du/Makefile > @@ -15,6 +15,7 @@ rcar-du-drm-$(CONFIG_DRM_RCAR_LVDS) += rcar_du_of.o \ > rcar-du-drm-$(CONFIG_DRM_RCAR_VSP) += rcar_du_vsp.o > rcar-du-drm-$(CONFIG_DRM_RCAR_WRITEBACK) += rcar_du_writeback.o > > +obj-$(CONFIG_DRM_RCAR_CMM) += rcar_cmm.o > obj-$(CONFIG_DRM_RCAR_DU) += rcar-du-drm.o > obj-$(CONFIG_DRM_RCAR_DW_HDMI) += rcar_dw_hdmi.o > obj-$(CONFIG_DRM_RCAR_LVDS) += rcar_lvds.o > diff --git a/drivers/gpu/drm/rcar-du/rcar_cmm.c b/drivers/gpu/drm/rcar-du/rcar_cmm.c > new file mode 100644 > index 000000000000..9675a8587dee > --- /dev/null > +++ b/drivers/gpu/drm/rcar-du/rcar_cmm.c > @@ -0,0 +1,198 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * rcar_cmm.c -- R-Car Display Unit Color Management Module > + * > + * Copyright (C) 2019 Jacopo Mondi > + */ > + > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +#include "rcar_cmm.h" > + > +#define CM2_LUT_CTRL 0x0000 > +#define CM2_LUT_CTRL_LUT_EN BIT(0) > +#define CM2_LUT_TBL_BASE 0x0600 > +#define CM2_LUT_TBL(__i) (CM2_LUT_TBL_BASE + (__i) * 4) > + > +struct rcar_cmm { > + void __iomem *base; > + > + /* > + * @lut: 1D-LUT status > + * @lut.enabled: 1D-LUT enabled flag > + */ > + struct { > + bool enabled; > + } lut; This used to be a more complex structure in an earlier version storing a cached version of the table. Now that the cached entry is removed, does this need to be such a complex structure rather than just say, a bool lut_enabled? (We will soon add an equivalent clu_enabled too, but I don't know what other per-table options we'll need.) In fact, we'll potentially have other options specific to the HGO, and CSC at some point in the future - so grouping by entity is indeed a good thing IMO. > +}; > + > +static inline int rcar_cmm_read(struct rcar_cmm *rcmm, u32 reg) > +{ > + return ioread32(rcmm->base + reg); > +} > + > +static inline void rcar_cmm_write(struct rcar_cmm *rcmm, u32 reg, u32 data) > +{ > + iowrite32(data, rcmm->base + reg); > +} > + > +/* > + * rcar_cmm_lut_write() - Scale the DRM LUT table entries to hardware precision > + * and write to the CMM registers. > + * @rcmm: Pointer to the CMM device > + * @drm_lut: Pointer to the DRM LUT table > + */ > +static void rcar_cmm_lut_write(struct rcar_cmm *rcmm, > + const struct drm_color_lut *drm_lut) > +{ > + unsigned int i; > + > + for (i = 0; i < CM2_LUT_SIZE; ++i) { > + u32 entry = drm_color_lut_extract(drm_lut[i].red, 8) << 16 > + | drm_color_lut_extract(drm_lut[i].green, 8) << 8 > + | drm_color_lut_extract(drm_lut[i].blue, 8); > + > + rcar_cmm_write(rcmm, CM2_LUT_TBL(i), entry); > + } > +} > + > +/* > + * rcar_cmm_setup() - Configure the CMM unit. > + * @pdev: The platform device associated with the CMM instance > + * @config: The CMM unit configuration > + * > + * Configure the CMM unit with the given configuration. Currently enabling, > + * disabling and programming of the 1-D LUT unit is supported. > + */ > +int rcar_cmm_setup(struct platform_device *pdev, > + const struct rcar_cmm_config *config) > +{ > + struct rcar_cmm *rcmm = platform_get_drvdata(pdev); > + > + /* Disable LUT if requested. */ > + if (!config->lut.enable) { > + if (rcmm->lut.enabled) { > + rcar_cmm_write(rcmm, CM2_LUT_CTRL, 0); > + rcmm->lut.enabled = false; > + } > + > + return 0; > + } > + > + /* Enable LUT and program the new gamma table values. */ > + if (!rcmm->lut.enabled) { > + rcar_cmm_write(rcmm, CM2_LUT_CTRL, CM2_LUT_CTRL_LUT_EN); > + rcmm->lut.enabled = true; > + } > + > + rcar_cmm_lut_write(rcmm, config->lut.table); > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(rcar_cmm_setup); > + > +/* > + * rcar_cmm_enable() - Enable the CMM unit. > + * @pdev: The platform device associated with the CMM instance > + * > + * Enable the CMM unit by enabling the parent clock. > + */ > +int rcar_cmm_enable(struct platform_device *pdev) > +{ > + int ret; > + > + ret = pm_runtime_get_sync(&pdev->dev); > + if (ret < 0) > + return ret; > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(rcar_cmm_enable); > + > +/* > + * rcar_cmm_disable() - Disable the CMM unit. > + * @pdev: The platform device associated with the CMM instance > + * > + * Disable the CMM unit by stopping the parent clock. > + */ > +void rcar_cmm_disable(struct platform_device *pdev) > +{ > + struct rcar_cmm *rcmm = platform_get_drvdata(pdev); > + > + rcar_cmm_write(rcmm, CM2_LUT_CTRL, 0); > + rcmm->lut.enabled = false; > + > + pm_runtime_put(&pdev->dev); > +} > +EXPORT_SYMBOL_GPL(rcar_cmm_disable); > + > +/* > + * rcar_cmm_init() - Initialize the CMM > + * @pdev: The platform device associated with the CMM instance > + * > + * Return: 0 on success, -EPROBE_DEFER if the CMM is not available yet, > + * -ENODEV if the DRM_RCAR_CMM config option is disabled > + */ > +int rcar_cmm_init(struct platform_device *pdev) > +{ > + struct rcar_cmm *rcmm = platform_get_drvdata(pdev); > + > + if (!rcmm) > + return -EPROBE_DEFER; > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(rcar_cmm_init); > + > +static int rcar_cmm_probe(struct platform_device *pdev) > +{ > + struct rcar_cmm *rcmm; > + > + rcmm = devm_kzalloc(&pdev->dev, sizeof(*rcmm), GFP_KERNEL); > + if (!rcmm) > + return -ENOMEM; > + platform_set_drvdata(pdev, rcmm); > + > + rcmm->base = devm_platform_ioremap_resource(pdev, 0); > + if (IS_ERR(rcmm->base)) > + return PTR_ERR(rcmm->base); > + > + pm_runtime_enable(&pdev->dev); > + > + return 0; > +} > + > +static int rcar_cmm_remove(struct platform_device *pdev) > +{ > + pm_runtime_disable(&pdev->dev); > + > + return 0; > +} > + > +static const struct of_device_id rcar_cmm_of_table[] = { > + { .compatible = "renesas,rcar-gen3-cmm", }, > + { .compatible = "renesas,rcar-gen2-cmm", }, > + { }, > +}; > +MODULE_DEVICE_TABLE(of, rcar_cmm_of_table); > + > +static struct platform_driver rcar_cmm_platform_driver = { > + .probe = rcar_cmm_probe, > + .remove = rcar_cmm_remove, > + .driver = { > + .name = "rcar-cmm", > + .of_match_table = rcar_cmm_of_table, > + }, > +}; > + > +module_platform_driver(rcar_cmm_platform_driver); > + > +MODULE_AUTHOR("Jacopo Mondi "); > +MODULE_DESCRIPTION("Renesas R-Car CMM Driver"); > +MODULE_LICENSE("GPL v2"); > diff --git a/drivers/gpu/drm/rcar-du/rcar_cmm.h b/drivers/gpu/drm/rcar-du/rcar_cmm.h > new file mode 100644 > index 000000000000..358ec03cf48a > --- /dev/null > +++ b/drivers/gpu/drm/rcar-du/rcar_cmm.h > @@ -0,0 +1,60 @@ > +/* SPDX-License-Identifier: GPL-2.0+ */ > +/* > + * rcar_cmm.h -- R-Car Display Unit Color Management Module > + * > + * Copyright (C) 2019 Jacopo Mondi > + */ > + > +#ifndef __RCAR_CMM_H__ > +#define __RCAR_CMM_H__ > + > +#define CM2_LUT_SIZE 256 > + > +struct drm_color_lut; > +struct platform_device; > + > +/** > + * struct rcar_cmm_config - CMM configuration > + * > + * @lut: 1D-LUT configuration > + * @lut.enable: 1D-LUT enable flag > + * @lut.table: 1D-LUT table entries > + */ > +struct rcar_cmm_config { > + struct { > + bool enable; > + struct drm_color_lut *table; > + } lut; > +}; > + > +#if IS_ENABLED(CONFIG_DRM_RCAR_CMM) > +int rcar_cmm_init(struct platform_device *pdev); > + > +int rcar_cmm_enable(struct platform_device *pdev); > +void rcar_cmm_disable(struct platform_device *pdev); > + > +int rcar_cmm_setup(struct platform_device *pdev, > + const struct rcar_cmm_config *config); > +#else > +static inline int rcar_cmm_init(struct platform_device *pdev) > +{ > + return -ENODEV; Excellent :-D > +} > + > +static inline int rcar_cmm_enable(struct platform_device *pdev) > +{ > + return 0; > +} > + > +static inline void rcar_cmm_disable(struct platform_device *pdev) > +{ > +} > + > +static inline int rcar_cmm_setup(struct platform_device *pdev, > + const struct rcar_cmm_config *config) > +{ > + return 0; > +} > +#endif /* IS_ENABLED(CONFIG_DRM_RCAR_CMM) */ > + > +#endif /* __RCAR_CMM_H__ */ > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kieran Bingham Subject: Re: [PATCH v5 3/8] drm: rcar-du: Add support for CMM Date: Tue, 15 Oct 2019 12:53:55 +0100 Message-ID: <2aefe646-45db-aafa-b22b-e1cf9616259d@ideasonboard.com> References: <20191015104621.62514-1-jacopo+renesas@jmondi.org> <20191015104621.62514-4-jacopo+renesas@jmondi.org> Reply-To: kieran.bingham+renesas@ideasonboard.com Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by gabe.freedesktop.org (Postfix) with ESMTPS id A1CDA6E22B for ; Tue, 15 Oct 2019 11:54:00 +0000 (UTC) In-Reply-To: <20191015104621.62514-4-jacopo+renesas@jmondi.org> Content-Language: en-GB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Jacopo Mondi , laurent.pinchart@ideasonboard.com, geert@linux-m68k.org, horms@verge.net.au, uli+renesas@fpond.eu, VenkataRajesh.Kalakodima@in.bosch.com Cc: muroya@ksk.co.jp, airlied@linux.ie, koji.matsuoka.xm@renesas.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, seanpaul@chromium.org, Harsha.ManjulaMallikarjun@in.bosch.com, ezequiel@collabora.com List-Id: dri-devel@lists.freedesktop.org SGkgSmFjb3BvLAoKT24gMTUvMTAvMjAxOSAxMTo0NiwgSmFjb3BvIE1vbmRpIHdyb3RlOgo+IEFk ZCBhIGRyaXZlciBmb3IgdGhlIFItQ2FyIERpc3BsYXkgVW5pdCBDb2xvciBDb3JyZWN0aW9uIE1v ZHVsZS4KPiAKPiBJbiBtb3N0IG9mIEdlbjMgU29DcywgZWFjaCBEVSBvdXRwdXQgY2hhbm5lbCBp cyBwcm92aWRlZCB3aXRoIGEgQ01NIHVuaXQKPiB0byBwZXJmb3JtIGltYWdlIGVuaGFuY2VtZW50 IGFuZCBjb2xvciBjb3JyZWN0aW9uLgo+IAo+IEFkZCBzdXBwb3J0IGZvciBDTU0gdGhyb3VnaCBh IGRyaXZlciB0aGF0IHN1cHBvcnRzIGNvbmZpZ3VyYXRpb24gb2YKPiB0aGUgMS1kaW1lbnNpb25h bCBMVVQgdGFibGUuIE1vcmUgYWR2YW5jZWQgQ01NIGZlYXR1cmVzIHdpbGwgYmUKPiBpbXBsZW1l bnRlZCBvbiB0b3Agb2YgdGhpcyBpbml0aWFsIG9uZS4KPiAKClRoaXMgaXMgbG9va2luZyBnb29k IHRvIG1lLgoKSSBoYXZlIHBhdGNoZXMgd2hpY2ggc3RhcnQgdG8gYWRkIENMVSBvbiB0b3Agb2Yg dGhpcywgd2hpY2ggcmVmYWN0b3IKdGhpbmdzIHNsaWdodGx5IC0gYnV0IEkgZG9uJ3QgdGhpbmsg dGhhdCByZWZhY3RvcmluZyBuZWVkcyB0byBiZSBpbiB0aGlzCnNlcmllcywgYW5kIHRoaXMgdmVy c2lvbiBpcyBpbmRlcGVuZGVudCBhbmQgbG9va3MgZ29vZCAuLi4gdGh1czoKClJldmlld2VkLWJ5 OiBLaWVyYW4gQmluZ2hhbSA8a2llcmFuLmJpbmdoYW0rcmVuZXNhc0BpZGVhc29uYm9hcmQuY29t PgoKCj4gU2lnbmVkLW9mZi1ieTogSmFjb3BvIE1vbmRpIDxqYWNvcG8rcmVuZXNhc0BqbW9uZGku b3JnPgo+IC0tLQo+ICBkcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9LY29uZmlnICAgIHwgICA3ICsK PiAgZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvTWFrZWZpbGUgICB8ICAgMSArCj4gIGRyaXZlcnMv Z3B1L2RybS9yY2FyLWR1L3JjYXJfY21tLmMgfCAxOTggKysrKysrKysrKysrKysrKysrKysrKysr KysrKysKPiAgZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9jbW0uaCB8ICA2MCArKysrKysr KysKPiAgNCBmaWxlcyBjaGFuZ2VkLCAyNjYgaW5zZXJ0aW9ucygrKQo+ICBjcmVhdGUgbW9kZSAx MDA2NDQgZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9jbW0uYwo+ICBjcmVhdGUgbW9kZSAx MDA2NDQgZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9jbW0uaAo+IAo+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL3JjYXIt ZHUvS2NvbmZpZwo+IGluZGV4IDE1Mjk4NDllMjE3ZS4uNTM5ZDIzMjc5MGQxIDEwMDY0NAo+IC0t LSBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L0tjb25maWcKPiArKysgYi9kcml2ZXJzL2dwdS9k cm0vcmNhci1kdS9LY29uZmlnCj4gQEAgLTEzLDYgKzEzLDEzIEBAIGNvbmZpZyBEUk1fUkNBUl9E VQo+ICAJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYW4gUi1DYXIgY2hpcHNldC4K PiAgCSAgSWYgTSBpcyBzZWxlY3RlZCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJjYXItZHUt ZHJtLgo+ICAKPiArY29uZmlnIERSTV9SQ0FSX0NNTQo+ICsJYm9vbCAiUi1DYXIgRFUgQ29sb3Ig TWFuYWdlbWVudCBNb2R1bGUgKENNTSkgU3VwcG9ydCIKPiArCWRlcGVuZHMgb24gRFJNICYmIE9G Cj4gKwlkZXBlbmRzIG9uIERSTV9SQ0FSX0RVCgoKRFJNX1JDQVJfRFUgYWxyZWFkeSBkZXBlbmRz IG9uIGJvdGggRFJNICYmIE9GLCBzbyBJIHdvbmRlciBpZiB0aG9zZSBhcmUKbmVlZGVkIHRvIGJl IHNwZWNpZmllZCBleHBsaWNpdGx5LgoKRG9lc24ndCBodXJ0IG9mIGNvdXJzZSwgYnV0IEkgc2Vl IERSTV9SQ0FSX0RXX0hETUkgZG9lcyB0aGUgc2FtZSwgYW5kIHNvCmRvZXMgRFJNX1JDQVJfTFZE Uywgc28gSSBkb24ndCB0aGluayB5b3UgbmVlZCB0byByZW1vdmUgaXQuCgo+ICsJaGVscAo+ICsJ ICBFbmFibGUgc3VwcG9ydCBmb3IgUi1DYXIgQ29sb3IgTWFuYWdlbWVudCBNb2R1bGUgKENNTSku Cj4gKwo+ICBjb25maWcgRFJNX1JDQVJfRFdfSERNSQo+ICAJdHJpc3RhdGUgIlItQ2FyIERVIEdl bjMgSERNSSBFbmNvZGVyIFN1cHBvcnQiCj4gIAlkZXBlbmRzIG9uIERSTSAmJiBPRgo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2Ry bS9yY2FyLWR1L01ha2VmaWxlCj4gaW5kZXggNmMyZWQ5YzQ2NDY3Li40ZDExODdjY2MzZTUgMTAw NjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvTWFrZWZpbGUKPiArKysgYi9kcml2 ZXJzL2dwdS9kcm0vcmNhci1kdS9NYWtlZmlsZQo+IEBAIC0xNSw2ICsxNSw3IEBAIHJjYXItZHUt ZHJtLSQoQ09ORklHX0RSTV9SQ0FSX0xWRFMpCSs9IHJjYXJfZHVfb2YubyBcCj4gIHJjYXItZHUt ZHJtLSQoQ09ORklHX0RSTV9SQ0FSX1ZTUCkJKz0gcmNhcl9kdV92c3Aubwo+ICByY2FyLWR1LWRy bS0kKENPTkZJR19EUk1fUkNBUl9XUklURUJBQ0spICs9IHJjYXJfZHVfd3JpdGViYWNrLm8KPiAg Cj4gK29iai0kKENPTkZJR19EUk1fUkNBUl9DTU0pCQkrPSByY2FyX2NtbS5vCj4gIG9iai0kKENP TkZJR19EUk1fUkNBUl9EVSkJCSs9IHJjYXItZHUtZHJtLm8KPiAgb2JqLSQoQ09ORklHX0RSTV9S Q0FSX0RXX0hETUkpCQkrPSByY2FyX2R3X2hkbWkubwo+ICBvYmotJChDT05GSUdfRFJNX1JDQVJf TFZEUykJCSs9IHJjYXJfbHZkcy5vCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yY2Fy LWR1L3JjYXJfY21tLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2NtbS5jCj4gbmV3 IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjk2NzVhODU4N2RlZQo+IC0t LSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2NtbS5jCj4g QEAgLTAsMCArMSwxOTggQEAKPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAr Cj4gKy8qCj4gKyAqIHJjYXJfY21tLmMgLS0gUi1DYXIgRGlzcGxheSBVbml0IENvbG9yIE1hbmFn ZW1lbnQgTW9kdWxlCj4gKyAqCj4gKyAqIENvcHlyaWdodCAoQykgMjAxOSBKYWNvcG8gTW9uZGkg PGphY29wbytyZW5lc2FzQGptb25kaS5vcmc+Cj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgPGxpbnV4 L2lvLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiArI2luY2x1ZGUgPGxpbnV4L29m Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiArI2luY2x1ZGUgPGxp bnV4L3BtX3J1bnRpbWUuaD4KPiArCj4gKyNpbmNsdWRlIDxkcm0vZHJtX2NvbG9yX21nbXQuaD4K PiArCj4gKyNpbmNsdWRlICJyY2FyX2NtbS5oIgo+ICsKPiArI2RlZmluZSBDTTJfTFVUX0NUUkwJ CTB4MDAwMAo+ICsjZGVmaW5lIENNMl9MVVRfQ1RSTF9MVVRfRU4JQklUKDApCj4gKyNkZWZpbmUg Q00yX0xVVF9UQkxfQkFTRQkweDA2MDAKPiArI2RlZmluZSBDTTJfTFVUX1RCTChfX2kpCShDTTJf TFVUX1RCTF9CQVNFICsgKF9faSkgKiA0KQo+ICsKPiArc3RydWN0IHJjYXJfY21tIHsKPiArCXZv aWQgX19pb21lbSAqYmFzZTsKPiArCj4gKwkvKgo+ICsJICogQGx1dDoJCTFELUxVVCBzdGF0dXMK PiArCSAqIEBsdXQuZW5hYmxlZDoJMUQtTFVUIGVuYWJsZWQgZmxhZwo+ICsJICovCj4gKwlzdHJ1 Y3Qgewo+ICsJCWJvb2wgZW5hYmxlZDsKPiArCX0gbHV0OwoKVGhpcyB1c2VkIHRvIGJlIGEgbW9y ZSBjb21wbGV4IHN0cnVjdHVyZSBpbiBhbiBlYXJsaWVyIHZlcnNpb24gc3RvcmluZyBhCmNhY2hl ZCB2ZXJzaW9uIG9mIHRoZSB0YWJsZS4gTm93IHRoYXQgdGhlIGNhY2hlZCBlbnRyeSBpcyByZW1v dmVkLCBkb2VzCnRoaXMgbmVlZCB0byBiZSBzdWNoIGEgY29tcGxleCBzdHJ1Y3R1cmUgcmF0aGVy IHRoYW4ganVzdCBzYXksIGEgYm9vbApsdXRfZW5hYmxlZD8KCihXZSB3aWxsIHNvb24gYWRkIGFu IGVxdWl2YWxlbnQgY2x1X2VuYWJsZWQgdG9vLCBidXQgSSBkb24ndCBrbm93IHdoYXQKb3RoZXIg cGVyLXRhYmxlIG9wdGlvbnMgd2UnbGwgbmVlZC4pCgpJbiBmYWN0LCB3ZSdsbCBwb3RlbnRpYWxs eSBoYXZlIG90aGVyIG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEhHTywgYW5kCkNTQyBhdCBzb21l IHBvaW50IGluIHRoZSBmdXR1cmUgLSBzbyBncm91cGluZyBieSBlbnRpdHkgaXMgaW5kZWVkIGEg Z29vZAp0aGluZyBJTU8uCgo+ICt9Owo+ICsKPiArc3RhdGljIGlubGluZSBpbnQgcmNhcl9jbW1f cmVhZChzdHJ1Y3QgcmNhcl9jbW0gKnJjbW0sIHUzMiByZWcpCj4gK3sKPiArCXJldHVybiBpb3Jl YWQzMihyY21tLT5iYXNlICsgcmVnKTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB2b2lkIHJj YXJfY21tX3dyaXRlKHN0cnVjdCByY2FyX2NtbSAqcmNtbSwgdTMyIHJlZywgdTMyIGRhdGEpCj4g K3sKPiArCWlvd3JpdGUzMihkYXRhLCByY21tLT5iYXNlICsgcmVnKTsKPiArfQo+ICsKPiArLyoK PiArICogcmNhcl9jbW1fbHV0X3dyaXRlKCkgLSBTY2FsZSB0aGUgRFJNIExVVCB0YWJsZSBlbnRy aWVzIHRvIGhhcmR3YXJlIHByZWNpc2lvbgo+ICsgKgkJCSAgYW5kIHdyaXRlIHRvIHRoZSBDTU0g cmVnaXN0ZXJzLgo+ICsgKiBAcmNtbTogUG9pbnRlciB0byB0aGUgQ01NIGRldmljZQo+ICsgKiBA ZHJtX2x1dDogUG9pbnRlciB0byB0aGUgRFJNIExVVCB0YWJsZQo+ICsgKi8KPiArc3RhdGljIHZv aWQgcmNhcl9jbW1fbHV0X3dyaXRlKHN0cnVjdCByY2FyX2NtbSAqcmNtbSwKPiArCQkJICAgICAg IGNvbnN0IHN0cnVjdCBkcm1fY29sb3JfbHV0ICpkcm1fbHV0KQo+ICt7Cj4gKwl1bnNpZ25lZCBp bnQgaTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgQ00yX0xVVF9TSVpFOyArK2kpIHsKPiArCQl1 MzIgZW50cnkgPSAgZHJtX2NvbG9yX2x1dF9leHRyYWN0KGRybV9sdXRbaV0ucmVkLCA4KSA8PCAx Ngo+ICsJCQkgIHwgZHJtX2NvbG9yX2x1dF9leHRyYWN0KGRybV9sdXRbaV0uZ3JlZW4sIDgpIDw8 IDgKPiArCQkJICB8IGRybV9jb2xvcl9sdXRfZXh0cmFjdChkcm1fbHV0W2ldLmJsdWUsIDgpOwo+ ICsKPiArCQlyY2FyX2NtbV93cml0ZShyY21tLCBDTTJfTFVUX1RCTChpKSwgZW50cnkpOwo+ICsJ fQo+ICt9Cj4gKwo+ICsvKgo+ICsgKiByY2FyX2NtbV9zZXR1cCgpIC0gQ29uZmlndXJlIHRoZSBD TU0gdW5pdC4KPiArICogQHBkZXY6IFRoZSBwbGF0Zm9ybSBkZXZpY2UgYXNzb2NpYXRlZCB3aXRo IHRoZSBDTU0gaW5zdGFuY2UKPiArICogQGNvbmZpZzogVGhlIENNTSB1bml0IGNvbmZpZ3VyYXRp b24KPiArICoKPiArICogQ29uZmlndXJlIHRoZSBDTU0gdW5pdCB3aXRoIHRoZSBnaXZlbiBjb25m aWd1cmF0aW9uLiBDdXJyZW50bHkgZW5hYmxpbmcsCj4gKyAqIGRpc2FibGluZyBhbmQgcHJvZ3Jh bW1pbmcgb2YgdGhlIDEtRCBMVVQgdW5pdCBpcyBzdXBwb3J0ZWQuCj4gKyAqLwo+ICtpbnQgcmNh cl9jbW1fc2V0dXAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKPiArCQkgICBjb25zdCBz dHJ1Y3QgcmNhcl9jbW1fY29uZmlnICpjb25maWcpCj4gK3sKPiArCXN0cnVjdCByY2FyX2NtbSAq cmNtbSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwo+ICsKPiArCS8qIERpc2FibGUgTFVU IGlmIHJlcXVlc3RlZC4gKi8KPiArCWlmICghY29uZmlnLT5sdXQuZW5hYmxlKSB7Cj4gKwkJaWYg KHJjbW0tPmx1dC5lbmFibGVkKSB7Cj4gKwkJCXJjYXJfY21tX3dyaXRlKHJjbW0sIENNMl9MVVRf Q1RSTCwgMCk7Cj4gKwkJCXJjbW0tPmx1dC5lbmFibGVkID0gZmFsc2U7Cj4gKwkJfQo+ICsKPiAr CQlyZXR1cm4gMDsKPiArCX0KPiArCj4gKwkvKiBFbmFibGUgTFVUIGFuZCBwcm9ncmFtIHRoZSBu ZXcgZ2FtbWEgdGFibGUgdmFsdWVzLiAqLwo+ICsJaWYgKCFyY21tLT5sdXQuZW5hYmxlZCkgewo+ ICsJCXJjYXJfY21tX3dyaXRlKHJjbW0sIENNMl9MVVRfQ1RSTCwgQ00yX0xVVF9DVFJMX0xVVF9F Tik7Cj4gKwkJcmNtbS0+bHV0LmVuYWJsZWQgPSB0cnVlOwo+ICsJfQo+ICsKPiArCXJjYXJfY21t X2x1dF93cml0ZShyY21tLCBjb25maWctPmx1dC50YWJsZSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4g K30KPiArRVhQT1JUX1NZTUJPTF9HUEwocmNhcl9jbW1fc2V0dXApOwo+ICsKPiArLyoKPiArICog cmNhcl9jbW1fZW5hYmxlKCkgLSBFbmFibGUgdGhlIENNTSB1bml0Lgo+ICsgKiBAcGRldjogVGhl IHBsYXRmb3JtIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIENNTSBpbnN0YW5jZQo+ICsgKgo+ ICsgKiBFbmFibGUgdGhlIENNTSB1bml0IGJ5IGVuYWJsaW5nIHRoZSBwYXJlbnQgY2xvY2suCj4g KyAqLwo+ICtpbnQgcmNhcl9jbW1fZW5hYmxlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYp Cj4gK3sKPiArCWludCByZXQ7Cj4gKwo+ICsJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmcGRl di0+ZGV2KTsKPiArCWlmIChyZXQgPCAwKQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJcmV0dXJu IDA7Cj4gK30KPiArRVhQT1JUX1NZTUJPTF9HUEwocmNhcl9jbW1fZW5hYmxlKTsKPiArCj4gKy8q Cj4gKyAqIHJjYXJfY21tX2Rpc2FibGUoKSAtIERpc2FibGUgdGhlIENNTSB1bml0Lgo+ICsgKiBA cGRldjogVGhlIHBsYXRmb3JtIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIENNTSBpbnN0YW5j ZQo+ICsgKgo+ICsgKiBEaXNhYmxlIHRoZSBDTU0gdW5pdCBieSBzdG9wcGluZyB0aGUgcGFyZW50 IGNsb2NrLgo+ICsgKi8KPiArdm9pZCByY2FyX2NtbV9kaXNhYmxlKHN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYpCj4gK3sKPiArCXN0cnVjdCByY2FyX2NtbSAqcmNtbSA9IHBsYXRmb3JtX2dl dF9kcnZkYXRhKHBkZXYpOwo+ICsKPiArCXJjYXJfY21tX3dyaXRlKHJjbW0sIENNMl9MVVRfQ1RS TCwgMCk7Cj4gKwlyY21tLT5sdXQuZW5hYmxlZCA9IGZhbHNlOwo+ICsKPiArCXBtX3J1bnRpbWVf cHV0KCZwZGV2LT5kZXYpOwo+ICt9Cj4gK0VYUE9SVF9TWU1CT0xfR1BMKHJjYXJfY21tX2Rpc2Fi bGUpOwo+ICsKPiArLyoKPiArICogcmNhcl9jbW1faW5pdCgpIC0gSW5pdGlhbGl6ZSB0aGUgQ01N Cj4gKyAqIEBwZGV2OiBUaGUgcGxhdGZvcm0gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ01N IGluc3RhbmNlCj4gKyAqCj4gKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRVBST0JFX0RFRkVS IGlmIHRoZSBDTU0gaXMgbm90IGF2YWlsYWJsZSB5ZXQsCj4gKyAqICAgICAgICAgLUVOT0RFViBp ZiB0aGUgRFJNX1JDQVJfQ01NIGNvbmZpZyBvcHRpb24gaXMgZGlzYWJsZWQKPiArICovCj4gK2lu dCByY2FyX2NtbV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gK3sKPiArCXN0 cnVjdCByY2FyX2NtbSAqcmNtbSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwo+ICsKPiAr CWlmICghcmNtbSkKPiArCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKPiArCj4gKwlyZXR1cm4gMDsK PiArfQo+ICtFWFBPUlRfU1lNQk9MX0dQTChyY2FyX2NtbV9pbml0KTsKPiArCj4gK3N0YXRpYyBp bnQgcmNhcl9jbW1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ICsJ c3RydWN0IHJjYXJfY21tICpyY21tOwo+ICsKPiArCXJjbW0gPSBkZXZtX2t6YWxsb2MoJnBkZXYt PmRldiwgc2l6ZW9mKCpyY21tKSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIXJjbW0pCj4gKwkJcmV0 dXJuIC1FTk9NRU07Cj4gKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCByY21tKTsKPiArCj4g KwlyY21tLT5iYXNlID0gZGV2bV9wbGF0Zm9ybV9pb3JlbWFwX3Jlc291cmNlKHBkZXYsIDApOwo+ ICsJaWYgKElTX0VSUihyY21tLT5iYXNlKSkKPiArCQlyZXR1cm4gUFRSX0VSUihyY21tLT5iYXNl KTsKPiArCj4gKwlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKPiArCj4gKwlyZXR1cm4g MDsKPiArfQo+ICsKPiArc3RhdGljIGludCByY2FyX2NtbV9yZW1vdmUoc3RydWN0IHBsYXRmb3Jt X2RldmljZSAqcGRldikKPiArewo+ICsJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwo+ ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2Rldmlj ZV9pZCByY2FyX2NtbV9vZl90YWJsZVtdID0gewo+ICsJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2Fz LHJjYXItZ2VuMy1jbW0iLCB9LAo+ICsJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHJjYXItZ2Vu Mi1jbW0iLCB9LAo+ICsJeyB9LAo+ICt9Owo+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByY2Fy X2NtbV9vZl90YWJsZSk7Cj4gKwo+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByY2Fy X2NtbV9wbGF0Zm9ybV9kcml2ZXIgPSB7Cj4gKwkucHJvYmUJCT0gcmNhcl9jbW1fcHJvYmUsCj4g KwkucmVtb3ZlCQk9IHJjYXJfY21tX3JlbW92ZSwKPiArCS5kcml2ZXIJCT0gewo+ICsJCS5uYW1l CT0gInJjYXItY21tIiwKPiArCQkub2ZfbWF0Y2hfdGFibGUgPSByY2FyX2NtbV9vZl90YWJsZSwK PiArCX0sCj4gK307Cj4gKwo+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJjYXJfY21tX3BsYXRm b3JtX2RyaXZlcik7Cj4gKwo+ICtNT0RVTEVfQVVUSE9SKCJKYWNvcG8gTW9uZGkgPGphY29wbyty ZW5lc2FzQGptb25kaS5vcmc+Iik7Cj4gK01PRFVMRV9ERVNDUklQVElPTigiUmVuZXNhcyBSLUNh ciBDTU0gRHJpdmVyIik7Cj4gK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9jbW0uaCBiL2RyaXZlcnMvZ3B1L2RybS9y Y2FyLWR1L3JjYXJfY21tLmgKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAw MDAwMC4uMzU4ZWMwM2NmNDhhCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9yY2FyLWR1L3JjYXJfY21tLmgKPiBAQCAtMCwwICsxLDYwIEBACj4gKy8qIFNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOiBHUEwtMi4wKyAqLwo+ICsvKgo+ICsgKiByY2FyX2NtbS5oIC0tIFItQ2Fy IERpc3BsYXkgVW5pdCBDb2xvciBNYW5hZ2VtZW50IE1vZHVsZQo+ICsgKgo+ICsgKiBDb3B5cmln aHQgKEMpIDIwMTkgSmFjb3BvIE1vbmRpIDxqYWNvcG8rcmVuZXNhc0BqbW9uZGkub3JnPgo+ICsg Ki8KPiArCj4gKyNpZm5kZWYgX19SQ0FSX0NNTV9IX18KPiArI2RlZmluZSBfX1JDQVJfQ01NX0hf Xwo+ICsKPiArI2RlZmluZSBDTTJfTFVUX1NJWkUJCTI1Ngo+ICsKPiArc3RydWN0IGRybV9jb2xv cl9sdXQ7Cj4gK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2U7Cj4gKwo+ICsvKioKPiArICogc3RydWN0 IHJjYXJfY21tX2NvbmZpZyAtIENNTSBjb25maWd1cmF0aW9uCj4gKyAqCj4gKyAqIEBsdXQ6CTFE LUxVVCBjb25maWd1cmF0aW9uCj4gKyAqIEBsdXQuZW5hYmxlOgkxRC1MVVQgZW5hYmxlIGZsYWcK PiArICogQGx1dC50YWJsZToJMUQtTFVUIHRhYmxlIGVudHJpZXMKPiArICovCj4gK3N0cnVjdCBy Y2FyX2NtbV9jb25maWcgewo+ICsJc3RydWN0IHsKPiArCQlib29sIGVuYWJsZTsKPiArCQlzdHJ1 Y3QgZHJtX2NvbG9yX2x1dCAqdGFibGU7Cj4gKwl9IGx1dDsKPiArfTsKPiArCj4gKyNpZiBJU19F TkFCTEVEKENPTkZJR19EUk1fUkNBUl9DTU0pCj4gK2ludCByY2FyX2NtbV9pbml0KHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwo+ICsKPiAraW50IHJjYXJfY21tX2VuYWJsZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKPiArdm9pZCByY2FyX2NtbV9kaXNhYmxlKHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwo+ICsKPiAraW50IHJjYXJfY21tX3NldHVwKHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYsCj4gKwkJICAgY29uc3Qgc3RydWN0IHJjYXJfY21tX2NvbmZp ZyAqY29uZmlnKTsKPiArI2Vsc2UKPiArc3RhdGljIGlubGluZSBpbnQgcmNhcl9jbW1faW5pdChz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKwlyZXR1cm4gLUVOT0RFVjsKCkV4 Y2VsbGVudCA6LUQKCj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgaW50IHJjYXJfY21tX2VuYWJs ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKwlyZXR1cm4gMDsKPiArfQo+ ICsKPiArc3RhdGljIGlubGluZSB2b2lkIHJjYXJfY21tX2Rpc2FibGUoc3RydWN0IHBsYXRmb3Jt X2RldmljZSAqcGRldikKPiArewo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5lIGludCByY2FyX2Nt bV9zZXR1cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAo+ICsJCQkJIGNvbnN0IHN0cnVj dCByY2FyX2NtbV9jb25maWcgKmNvbmZpZykKPiArewo+ICsJcmV0dXJuIDA7Cj4gK30KPiArI2Vu ZGlmIC8qIElTX0VOQUJMRUQoQ09ORklHX0RSTV9SQ0FSX0NNTSkgKi8KPiArCj4gKyNlbmRpZiAv KiBfX1JDQVJfQ01NX0hfXyAqLwo+IAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJl ZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGlu Zm8vZHJpLWRldmVs