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=-6.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,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 6D824C3A5A9 for ; Mon, 4 May 2020 20:45:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 44B5620721 for ; Mon, 4 May 2020 20:45:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726338AbgEDUpQ (ORCPT ); Mon, 4 May 2020 16:45:16 -0400 Received: from relay12.mail.gandi.net ([217.70.178.232]:46301 "EHLO relay12.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726334AbgEDUpQ (ORCPT ); Mon, 4 May 2020 16:45:16 -0400 Received: from localhost (lfbn-lyo-1-9-35.w86-202.abo.wanadoo.fr [86.202.105.35]) (Authenticated sender: alexandre.belloni@bootlin.com) by relay12.mail.gandi.net (Postfix) with ESMTPSA id 50374200005; Mon, 4 May 2020 20:44:47 +0000 (UTC) Date: Mon, 4 May 2020 22:44:47 +0200 From: Alexandre Belloni To: =?utf-8?B?TWljaGHFgiBNaXJvc8WCYXc=?= Cc: Ludovic Desroches , Michael Turquette , Nicolas Ferre , Rob Herring , Stephen Boyd , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v6 2/3] clk: at91: allow setting PCKx parent via DT Message-ID: <20200504204447.GL34497@piout.net> References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org On 04/05/2020 22:19:17+0200, Michał Mirosław wrote: > This exposes PROGx clocks for use in assigned-clocks DeviceTree property > for selecting PCKx parent clock. > > Signed-off-by: Michał Mirosław > Acked-by: Alexandre Belloni > --- > v2: rebase and update to clk/clk-at91 branch > v3: rebase > v4: no changes > v5: no changes > v6: no changes > --- > drivers/clk/at91/at91rm9200.c | 6 ++++-- > drivers/clk/at91/at91sam9260.c | 5 ++++- > drivers/clk/at91/at91sam9g45.c | 6 ++++-- > drivers/clk/at91/at91sam9n12.c | 6 ++++-- > drivers/clk/at91/at91sam9rl.c | 4 +++- > drivers/clk/at91/at91sam9x5.c | 4 +++- > drivers/clk/at91/pmc.c | 12 ++++++++++-- > drivers/clk/at91/pmc.h | 5 ++++- > drivers/clk/at91/sam9x60.c | 4 +++- > drivers/clk/at91/sama5d2.c | 4 +++- > drivers/clk/at91/sama5d3.c | 6 ++++-- > drivers/clk/at91/sama5d4.c | 4 +++- > include/dt-bindings/clock/at91.h | 1 + > 13 files changed, 50 insertions(+), 17 deletions(-) > > diff --git a/drivers/clk/at91/at91rm9200.c b/drivers/clk/at91/at91rm9200.c > index c44a431b6c97..8da88e9a95d8 100644 > --- a/drivers/clk/at91/at91rm9200.c > +++ b/drivers/clk/at91/at91rm9200.c > @@ -100,7 +100,7 @@ static void __init at91rm9200_pmc_setup(struct device_node *np) > > at91rm9200_pmc = pmc_data_allocate(PMC_MAIN + 1, > nck(at91rm9200_systemck), > - nck(at91rm9200_periphck), 0); > + nck(at91rm9200_periphck), 0, 4); > if (!at91rm9200_pmc) > return; > > @@ -159,6 +159,8 @@ static void __init at91rm9200_pmc_setup(struct device_node *np) > &at91rm9200_programmable_layout); > if (IS_ERR(hw)) > goto err_free; > + > + at91rm9200_pmc->pchws[i] = hw; > } > > for (i = 0; i < ARRAY_SIZE(at91rm9200_systemck); i++) { > @@ -187,7 +189,7 @@ static void __init at91rm9200_pmc_setup(struct device_node *np) > return; > > err_free: > - pmc_data_free(at91rm9200_pmc); > + kfree(at91rm9200_pmc); I missed that in the previous review but shouldn't that change be part of the previous patch for bisectability ? > } > /* > * While the TCB can be used as the clocksource, the system timer is most likely > diff --git a/drivers/clk/at91/at91sam9260.c b/drivers/clk/at91/at91sam9260.c > index 946f03a09858..7e5ff252fffc 100644 > --- a/drivers/clk/at91/at91sam9260.c > +++ b/drivers/clk/at91/at91sam9260.c > @@ -354,7 +354,8 @@ static void __init at91sam926x_pmc_setup(struct device_node *np, > > at91sam9260_pmc = pmc_data_allocate(PMC_MAIN + 1, > ndck(data->sck, data->num_sck), > - ndck(data->pck, data->num_pck), 0); > + ndck(data->pck, data->num_pck), > + 0, data->num_progck); > if (!at91sam9260_pmc) > return; > > @@ -434,6 +435,8 @@ static void __init at91sam926x_pmc_setup(struct device_node *np, > &at91rm9200_programmable_layout); > if (IS_ERR(hw)) > goto err_free; > + > + at91sam9260_pmc->pchws[i] = hw; > } > > for (i = 0; i < data->num_sck; i++) { > diff --git a/drivers/clk/at91/at91sam9g45.c b/drivers/clk/at91/at91sam9g45.c > index 38a7d2d2df0c..5d18eb04c218 100644 > --- a/drivers/clk/at91/at91sam9g45.c > +++ b/drivers/clk/at91/at91sam9g45.c > @@ -117,7 +117,7 @@ static void __init at91sam9g45_pmc_setup(struct device_node *np) > > at91sam9g45_pmc = pmc_data_allocate(PMC_MAIN + 1, > nck(at91sam9g45_systemck), > - nck(at91sam9g45_periphck), 0); > + nck(at91sam9g45_periphck), 0, 2); > if (!at91sam9g45_pmc) > return; > > @@ -182,6 +182,8 @@ static void __init at91sam9g45_pmc_setup(struct device_node *np) > &at91sam9g45_programmable_layout); > if (IS_ERR(hw)) > goto err_free; > + > + at91sam9g45_pmc->pchws[i] = hw; > } > > for (i = 0; i < ARRAY_SIZE(at91sam9g45_systemck); i++) { > @@ -210,7 +212,7 @@ static void __init at91sam9g45_pmc_setup(struct device_node *np) > return; > > err_free: > - pmc_data_free(at91sam9g45_pmc); > + kfree(at91sam9g45_pmc); Ditto > } > /* > * The TCB is used as the clocksource so its clock is needed early. This means > diff --git a/drivers/clk/at91/at91sam9n12.c b/drivers/clk/at91/at91sam9n12.c > index 8bb39d2ba84b..3a2564c2f724 100644 > --- a/drivers/clk/at91/at91sam9n12.c > +++ b/drivers/clk/at91/at91sam9n12.c > @@ -129,7 +129,7 @@ static void __init at91sam9n12_pmc_setup(struct device_node *np) > return; > > at91sam9n12_pmc = pmc_data_allocate(PMC_MAIN + 1, > - nck(at91sam9n12_systemck), 31, 0); > + nck(at91sam9n12_systemck), 31, 0, 2); > if (!at91sam9n12_pmc) > return; > > @@ -198,6 +198,8 @@ static void __init at91sam9n12_pmc_setup(struct device_node *np) > &at91sam9x5_programmable_layout); > if (IS_ERR(hw)) > goto err_free; > + > + at91sam9n12_pmc->pchws[i] = hw; > } > > for (i = 0; i < ARRAY_SIZE(at91sam9n12_systemck); i++) { > @@ -228,7 +230,7 @@ static void __init at91sam9n12_pmc_setup(struct device_node *np) > return; > > err_free: > - pmc_data_free(at91sam9n12_pmc); > + kfree(at91sam9n12_pmc); Ditto > } > /* > * The TCB is used as the clocksource so its clock is needed early. This means > diff --git a/drivers/clk/at91/at91sam9rl.c b/drivers/clk/at91/at91sam9rl.c > index cc739d214ae3..bcf07f6a0e0e 100644 > --- a/drivers/clk/at91/at91sam9rl.c > +++ b/drivers/clk/at91/at91sam9rl.c > @@ -89,7 +89,7 @@ static void __init at91sam9rl_pmc_setup(struct device_node *np) > > at91sam9rl_pmc = pmc_data_allocate(PMC_MAIN + 1, > nck(at91sam9rl_systemck), > - nck(at91sam9rl_periphck), 0); > + nck(at91sam9rl_periphck), 0, 2); > if (!at91sam9rl_pmc) > return; > > @@ -138,6 +138,8 @@ static void __init at91sam9rl_pmc_setup(struct device_node *np) > &at91rm9200_programmable_layout); > if (IS_ERR(hw)) > goto err_free; > + > + at91sam9rl_pmc->pchws[i] = hw; > } > > for (i = 0; i < ARRAY_SIZE(at91sam9rl_systemck); i++) { > diff --git a/drivers/clk/at91/at91sam9x5.c b/drivers/clk/at91/at91sam9x5.c > index aac99d699568..f13756b407e2 100644 > --- a/drivers/clk/at91/at91sam9x5.c > +++ b/drivers/clk/at91/at91sam9x5.c > @@ -151,7 +151,7 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np, > return; > > at91sam9x5_pmc = pmc_data_allocate(PMC_MAIN + 1, > - nck(at91sam9x5_systemck), 31, 0); > + nck(at91sam9x5_systemck), 31, 0, 2); > if (!at91sam9x5_pmc) > return; > > @@ -227,6 +227,8 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np, > &at91sam9x5_programmable_layout); > if (IS_ERR(hw)) > goto err_free; > + > + at91sam9x5_pmc->pchws[i] = hw; > } > > for (i = 0; i < ARRAY_SIZE(at91sam9x5_systemck); i++) { > diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c > index ac46ea1b9fda..8a1577e2c2fd 100644 > --- a/drivers/clk/at91/pmc.c > +++ b/drivers/clk/at91/pmc.c > @@ -67,6 +67,10 @@ struct clk_hw *of_clk_hw_pmc_get(struct of_phandle_args *clkspec, void *data) > if (idx < pmc_data->ngck) > return pmc_data->ghws[idx]; > break; > + case PMC_TYPE_PROGRAMMABLE: > + if (idx < pmc_data->npck) > + return pmc_data->pchws[idx]; > + break; > default: > break; > } > @@ -77,9 +81,10 @@ struct clk_hw *of_clk_hw_pmc_get(struct of_phandle_args *clkspec, void *data) > } > > struct pmc_data *pmc_data_allocate(unsigned int ncore, unsigned int nsystem, > - unsigned int nperiph, unsigned int ngck) > + unsigned int nperiph, unsigned int ngck, > + unsigned int npck) > { > - unsigned int num_clks = ncore + nsystem + nperiph + ngck; > + unsigned int num_clks = ncore + nsystem + nperiph + ngck + npck; > struct pmc_data *pmc_data; > > pmc_data = kzalloc(struct_size(pmc_data, hwtable, num_clks), > @@ -99,6 +104,9 @@ struct pmc_data *pmc_data_allocate(unsigned int ncore, unsigned int nsystem, > pmc_data->ngck = ngck; > pmc_data->ghws = pmc_data->phws + nperiph; > > + pmc_data->npck = npck; > + pmc_data->pchws = pmc_data->ghws + ngck; > + > return pmc_data; > } > > diff --git a/drivers/clk/at91/pmc.h b/drivers/clk/at91/pmc.h > index fc3ef772b9d9..df616f2937e7 100644 > --- a/drivers/clk/at91/pmc.h > +++ b/drivers/clk/at91/pmc.h > @@ -24,6 +24,8 @@ struct pmc_data { > struct clk_hw **phws; > unsigned int ngck; > struct clk_hw **ghws; > + unsigned int npck; > + struct clk_hw **pchws; > > struct clk_hw *hwtable[]; > }; > @@ -96,7 +98,8 @@ struct clk_pcr_layout { > #define ndck(a, s) (a[s - 1].id + 1) > #define nck(a) (a[ARRAY_SIZE(a) - 1].id + 1) > struct pmc_data *pmc_data_allocate(unsigned int ncore, unsigned int nsystem, > - unsigned int nperiph, unsigned int ngck); > + unsigned int nperiph, unsigned int ngck, > + unsigned int npck); > > int of_at91_get_clk_range(struct device_node *np, const char *propname, > struct clk_range *range); > diff --git a/drivers/clk/at91/sam9x60.c b/drivers/clk/at91/sam9x60.c > index a7d4f648db26..db14e0427c7f 100644 > --- a/drivers/clk/at91/sam9x60.c > +++ b/drivers/clk/at91/sam9x60.c > @@ -185,7 +185,7 @@ static void __init sam9x60_pmc_setup(struct device_node *np) > sam9x60_pmc = pmc_data_allocate(PMC_MAIN + 1, > nck(sam9x60_systemck), > nck(sam9x60_periphck), > - nck(sam9x60_gck)); > + nck(sam9x60_gck), 8); > if (!sam9x60_pmc) > return; > > @@ -255,6 +255,8 @@ static void __init sam9x60_pmc_setup(struct device_node *np) > &sam9x60_programmable_layout); > if (IS_ERR(hw)) > goto err_free; > + > + sam9x60_pmc->pchws[i] = hw; > } > > for (i = 0; i < ARRAY_SIZE(sam9x60_systemck); i++) { > diff --git a/drivers/clk/at91/sama5d2.c b/drivers/clk/at91/sama5d2.c > index b2560670e5af..ae5e83cadb3d 100644 > --- a/drivers/clk/at91/sama5d2.c > +++ b/drivers/clk/at91/sama5d2.c > @@ -169,7 +169,7 @@ static void __init sama5d2_pmc_setup(struct device_node *np) > sama5d2_pmc = pmc_data_allocate(PMC_I2S1_MUX + 1, > nck(sama5d2_systemck), > nck(sama5d2_periph32ck), > - nck(sama5d2_gck)); > + nck(sama5d2_gck), 3); > if (!sama5d2_pmc) > return; > > @@ -267,6 +267,8 @@ static void __init sama5d2_pmc_setup(struct device_node *np) > &sama5d2_programmable_layout); > if (IS_ERR(hw)) > goto err_free; > + > + sama5d2_pmc->pchws[i] = hw; > } > > for (i = 0; i < ARRAY_SIZE(sama5d2_systemck); i++) { > diff --git a/drivers/clk/at91/sama5d3.c b/drivers/clk/at91/sama5d3.c > index 88506f909c08..507eef6797f1 100644 > --- a/drivers/clk/at91/sama5d3.c > +++ b/drivers/clk/at91/sama5d3.c > @@ -127,7 +127,7 @@ static void __init sama5d3_pmc_setup(struct device_node *np) > > sama5d3_pmc = pmc_data_allocate(PMC_MAIN + 1, > nck(sama5d3_systemck), > - nck(sama5d3_periphck), 0); > + nck(sama5d3_periphck), 0, 3); > if (!sama5d3_pmc) > return; > > @@ -201,6 +201,8 @@ static void __init sama5d3_pmc_setup(struct device_node *np) > &at91sam9x5_programmable_layout); > if (IS_ERR(hw)) > goto err_free; > + > + sama5d3_pmc->pchws[i] = hw; > } > > for (i = 0; i < ARRAY_SIZE(sama5d3_systemck); i++) { > @@ -231,7 +233,7 @@ static void __init sama5d3_pmc_setup(struct device_node *np) > return; > > err_free: > - pmc_data_free(sama5d3_pmc); > + kfree(sama5d3_pmc); > } > /* > * The TCB is used as the clocksource so its clock is needed early. This means > diff --git a/drivers/clk/at91/sama5d4.c b/drivers/clk/at91/sama5d4.c > index 4ca9a4619500..80692902b4e4 100644 > --- a/drivers/clk/at91/sama5d4.c > +++ b/drivers/clk/at91/sama5d4.c > @@ -142,7 +142,7 @@ static void __init sama5d4_pmc_setup(struct device_node *np) > > sama5d4_pmc = pmc_data_allocate(PMC_MCK2 + 1, > nck(sama5d4_systemck), > - nck(sama5d4_periph32ck), 0); > + nck(sama5d4_periph32ck), 0, 3); > if (!sama5d4_pmc) > return; > > @@ -224,6 +224,8 @@ static void __init sama5d4_pmc_setup(struct device_node *np) > &at91sam9x5_programmable_layout); > if (IS_ERR(hw)) > goto err_free; > + > + sama5d4_pmc->pchws[i] = hw; > } > > for (i = 0; i < ARRAY_SIZE(sama5d4_systemck); i++) { > diff --git a/include/dt-bindings/clock/at91.h b/include/dt-bindings/clock/at91.h > index 38b5554153c8..c3f4aa6a2d29 100644 > --- a/include/dt-bindings/clock/at91.h > +++ b/include/dt-bindings/clock/at91.h > @@ -12,6 +12,7 @@ > #define PMC_TYPE_SYSTEM 1 > #define PMC_TYPE_PERIPHERAL 2 > #define PMC_TYPE_GCK 3 > +#define PMC_TYPE_PROGRAMMABLE 4 > > #define PMC_SLOW 0 > #define PMC_MCK 1 > -- > 2.20.1 > -- Alexandre Belloni, Bootlin Embedded Linux and Kernel engineering https://bootlin.com 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=-6.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, 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 E0D15C3A5A9 for ; Mon, 4 May 2020 20:45:23 +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 B099F206A4 for ; Mon, 4 May 2020 20:45:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="a3h6PgFA" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B099F206A4 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=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:In-Reply-To:MIME-Version:References: Message-ID:Subject: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=zun6DDcbJTSzhDrf3jSs54TI3sFMGcm65WC6rh9+z8E=; b=a3h6PgFACJx0nS T0mCv3+Hb9udbHVbn+WqZPg3mvZS7KGvLK9GSSRYTjibX7IAv/DE/VeQUv91BXX/kH3j5GaM5G0Lj XHiF3vElEluop7YkAbKQ78Kpmguxz2+xh4u6AKIBLxhtTgdBL7SsfQsDRcLNHPiuDej6xAuWuOsV3 HBypPQeqBhlu3AkQoPKeBHpMlK2azhsFLfey9uxSANqDORHf6W14hmin3qsgP11cgkO4i7zF6CtNz opURiy0x4E0x9sxKJfww3AxqXJieUNNRNzhkyfuNjIsjaszoVE69//GaErRzsYTW+Hg9ESrXGVmjB pmotXtBm/JDoEj5so5bQ==; 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 1jVhxr-0005hs-6o; Mon, 04 May 2020 20:45:23 +0000 Received: from relay12.mail.gandi.net ([217.70.178.232]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jVhxk-0005av-5b for linux-arm-kernel@lists.infradead.org; Mon, 04 May 2020 20:45:21 +0000 Received: from localhost (lfbn-lyo-1-9-35.w86-202.abo.wanadoo.fr [86.202.105.35]) (Authenticated sender: alexandre.belloni@bootlin.com) by relay12.mail.gandi.net (Postfix) with ESMTPSA id 50374200005; Mon, 4 May 2020 20:44:47 +0000 (UTC) Date: Mon, 4 May 2020 22:44:47 +0200 From: Alexandre Belloni To: =?utf-8?B?TWljaGHFgiBNaXJvc8WCYXc=?= Subject: Re: [PATCH v6 2/3] clk: at91: allow setting PCKx parent via DT Message-ID: <20200504204447.GL34497@piout.net> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200504_134518_719098_1E588BCB X-CRM114-Status: GOOD ( 20.10 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, Stephen Boyd , Michael Turquette , linux-kernel@vger.kernel.org, Ludovic Desroches , Rob Herring , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMDQvMDUvMjAyMCAyMjoxOToxNyswMjAwLCBNaWNoYcWCIE1pcm9zxYJhdyB3cm90ZToKPiBU aGlzIGV4cG9zZXMgUFJPR3ggY2xvY2tzIGZvciB1c2UgaW4gYXNzaWduZWQtY2xvY2tzIERldmlj ZVRyZWUgcHJvcGVydHkKPiBmb3Igc2VsZWN0aW5nIFBDS3ggcGFyZW50IGNsb2NrLgo+IAo+IFNp Z25lZC1vZmYtYnk6IE1pY2hhxYIgTWlyb3PFgmF3IDxtaXJxLWxpbnV4QHJlcmUucW1xbS5wbD4K PiBBY2tlZC1ieTogQWxleGFuZHJlIEJlbGxvbmkgPGFsZXhhbmRyZS5iZWxsb25pQGJvb3RsaW4u Y29tPgo+IC0tLQo+IHYyOiByZWJhc2UgYW5kIHVwZGF0ZSB0byBjbGsvY2xrLWF0OTEgYnJhbmNo Cj4gdjM6IHJlYmFzZQo+IHY0OiBubyBjaGFuZ2VzCj4gdjU6IG5vIGNoYW5nZXMKPiB2Njogbm8g Y2hhbmdlcwo+IC0tLQo+ICBkcml2ZXJzL2Nsay9hdDkxL2F0OTFybTkyMDAuYyAgICB8ICA2ICsr KystLQo+ICBkcml2ZXJzL2Nsay9hdDkxL2F0OTFzYW05MjYwLmMgICB8ICA1ICsrKystCj4gIGRy aXZlcnMvY2xrL2F0OTEvYXQ5MXNhbTlnNDUuYyAgIHwgIDYgKysrKy0tCj4gIGRyaXZlcnMvY2xr L2F0OTEvYXQ5MXNhbTluMTIuYyAgIHwgIDYgKysrKy0tCj4gIGRyaXZlcnMvY2xrL2F0OTEvYXQ5 MXNhbTlybC5jICAgIHwgIDQgKysrLQo+ICBkcml2ZXJzL2Nsay9hdDkxL2F0OTFzYW05eDUuYyAg ICB8ICA0ICsrKy0KPiAgZHJpdmVycy9jbGsvYXQ5MS9wbWMuYyAgICAgICAgICAgfCAxMiArKysr KysrKysrLS0KPiAgZHJpdmVycy9jbGsvYXQ5MS9wbWMuaCAgICAgICAgICAgfCAgNSArKysrLQo+ ICBkcml2ZXJzL2Nsay9hdDkxL3NhbTl4NjAuYyAgICAgICB8ICA0ICsrKy0KPiAgZHJpdmVycy9j bGsvYXQ5MS9zYW1hNWQyLmMgICAgICAgfCAgNCArKystCj4gIGRyaXZlcnMvY2xrL2F0OTEvc2Ft YTVkMy5jICAgICAgIHwgIDYgKysrKy0tCj4gIGRyaXZlcnMvY2xrL2F0OTEvc2FtYTVkNC5jICAg ICAgIHwgIDQgKysrLQo+ICBpbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2F0OTEuaCB8ICAxICsK PiAgMTMgZmlsZXMgY2hhbmdlZCwgNTAgaW5zZXJ0aW9ucygrKSwgMTcgZGVsZXRpb25zKC0pCj4g Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvYXQ5MXJtOTIwMC5jIGIvZHJpdmVycy9j bGsvYXQ5MS9hdDkxcm05MjAwLmMKPiBpbmRleCBjNDRhNDMxYjZjOTcuLjhkYTg4ZTlhOTVkOCAx MDA2NDQKPiAtLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2F0OTFybTkyMDAuYwo+ICsrKyBiL2RyaXZl cnMvY2xrL2F0OTEvYXQ5MXJtOTIwMC5jCj4gQEAgLTEwMCw3ICsxMDAsNyBAQCBzdGF0aWMgdm9p ZCBfX2luaXQgYXQ5MXJtOTIwMF9wbWNfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKPiAg Cj4gIAlhdDkxcm05MjAwX3BtYyA9IHBtY19kYXRhX2FsbG9jYXRlKFBNQ19NQUlOICsgMSwKPiAg CQkJCQkgICAgbmNrKGF0OTFybTkyMDBfc3lzdGVtY2spLAo+IC0JCQkJCSAgICBuY2soYXQ5MXJt OTIwMF9wZXJpcGhjayksIDApOwo+ICsJCQkJCSAgICBuY2soYXQ5MXJtOTIwMF9wZXJpcGhjayks IDAsIDQpOwo+ICAJaWYgKCFhdDkxcm05MjAwX3BtYykKPiAgCQlyZXR1cm47Cj4gIAo+IEBAIC0x NTksNiArMTU5LDggQEAgc3RhdGljIHZvaWQgX19pbml0IGF0OTFybTkyMDBfcG1jX3NldHVwKHN0 cnVjdCBkZXZpY2Vfbm9kZSAqbnApCj4gIAkJCQkJCSAgICAmYXQ5MXJtOTIwMF9wcm9ncmFtbWFi bGVfbGF5b3V0KTsKPiAgCQlpZiAoSVNfRVJSKGh3KSkKPiAgCQkJZ290byBlcnJfZnJlZTsKPiAr Cj4gKwkJYXQ5MXJtOTIwMF9wbWMtPnBjaHdzW2ldID0gaHc7Cj4gIAl9Cj4gIAo+ICAJZm9yIChp ID0gMDsgaSA8IEFSUkFZX1NJWkUoYXQ5MXJtOTIwMF9zeXN0ZW1jayk7IGkrKykgewo+IEBAIC0x ODcsNyArMTg5LDcgQEAgc3RhdGljIHZvaWQgX19pbml0IGF0OTFybTkyMDBfcG1jX3NldHVwKHN0 cnVjdCBkZXZpY2Vfbm9kZSAqbnApCj4gIAlyZXR1cm47Cj4gIAo+ICBlcnJfZnJlZToKPiAtCXBt Y19kYXRhX2ZyZWUoYXQ5MXJtOTIwMF9wbWMpOwo+ICsJa2ZyZWUoYXQ5MXJtOTIwMF9wbWMpOwoK SSBtaXNzZWQgdGhhdCBpbiB0aGUgcHJldmlvdXMgcmV2aWV3IGJ1dCBzaG91bGRuJ3QgdGhhdCBj aGFuZ2UgYmUgcGFydApvZiB0aGUgcHJldmlvdXMgcGF0Y2ggZm9yIGJpc2VjdGFiaWxpdHkgPwoK PiAgfQo+ICAvKgo+ICAgKiBXaGlsZSB0aGUgVENCIGNhbiBiZSB1c2VkIGFzIHRoZSBjbG9ja3Nv dXJjZSwgdGhlIHN5c3RlbSB0aW1lciBpcyBtb3N0IGxpa2VseQo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2Nsay9hdDkxL2F0OTFzYW05MjYwLmMgYi9kcml2ZXJzL2Nsay9hdDkxL2F0OTFzYW05MjYw LmMKPiBpbmRleCA5NDZmMDNhMDk4NTguLjdlNWZmMjUyZmZmYyAxMDA2NDQKPiAtLS0gYS9kcml2 ZXJzL2Nsay9hdDkxL2F0OTFzYW05MjYwLmMKPiArKysgYi9kcml2ZXJzL2Nsay9hdDkxL2F0OTFz YW05MjYwLmMKPiBAQCAtMzU0LDcgKzM1NCw4IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2Ft OTI2eF9wbWNfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCwKPiAgCj4gIAlhdDkxc2FtOTI2 MF9wbWMgPSBwbWNfZGF0YV9hbGxvY2F0ZShQTUNfTUFJTiArIDEsCj4gIAkJCQkJICAgIG5kY2so ZGF0YS0+c2NrLCBkYXRhLT5udW1fc2NrKSwKPiAtCQkJCQkgICAgbmRjayhkYXRhLT5wY2ssIGRh dGEtPm51bV9wY2spLCAwKTsKPiArCQkJCQkgICAgbmRjayhkYXRhLT5wY2ssIGRhdGEtPm51bV9w Y2spLAo+ICsJCQkJCSAgICAwLCBkYXRhLT5udW1fcHJvZ2NrKTsKPiAgCWlmICghYXQ5MXNhbTky NjBfcG1jKQo+ICAJCXJldHVybjsKPiAgCj4gQEAgLTQzNCw2ICs0MzUsOCBAQCBzdGF0aWMgdm9p ZCBfX2luaXQgYXQ5MXNhbTkyNnhfcG1jX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCj4g IAkJCQkJCSAgICAmYXQ5MXJtOTIwMF9wcm9ncmFtbWFibGVfbGF5b3V0KTsKPiAgCQlpZiAoSVNf RVJSKGh3KSkKPiAgCQkJZ290byBlcnJfZnJlZTsKPiArCj4gKwkJYXQ5MXNhbTkyNjBfcG1jLT5w Y2h3c1tpXSA9IGh3Owo+ICAJfQo+ICAKPiAgCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5udW1fc2Nr OyBpKyspIHsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9hdDkxc2FtOWc0NS5jIGIv ZHJpdmVycy9jbGsvYXQ5MS9hdDkxc2FtOWc0NS5jCj4gaW5kZXggMzhhN2QyZDJkZjBjLi41ZDE4 ZWIwNGMyMTggMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9hdDkxc2FtOWc0NS5jCj4g KysrIGIvZHJpdmVycy9jbGsvYXQ5MS9hdDkxc2FtOWc0NS5jCj4gQEAgLTExNyw3ICsxMTcsNyBA QCBzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXNhbTlnNDVfcG1jX3NldHVwKHN0cnVjdCBkZXZpY2Vf bm9kZSAqbnApCj4gIAo+ICAJYXQ5MXNhbTlnNDVfcG1jID0gcG1jX2RhdGFfYWxsb2NhdGUoUE1D X01BSU4gKyAxLAo+ICAJCQkJCSAgICBuY2soYXQ5MXNhbTlnNDVfc3lzdGVtY2spLAo+IC0JCQkJ CSAgICBuY2soYXQ5MXNhbTlnNDVfcGVyaXBoY2spLCAwKTsKPiArCQkJCQkgICAgbmNrKGF0OTFz YW05ZzQ1X3BlcmlwaGNrKSwgMCwgMik7Cj4gIAlpZiAoIWF0OTFzYW05ZzQ1X3BtYykKPiAgCQly ZXR1cm47Cj4gIAo+IEBAIC0xODIsNiArMTgyLDggQEAgc3RhdGljIHZvaWQgX19pbml0IGF0OTFz YW05ZzQ1X3BtY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQo+ICAJCQkJCQkgICAgJmF0 OTFzYW05ZzQ1X3Byb2dyYW1tYWJsZV9sYXlvdXQpOwo+ICAJCWlmIChJU19FUlIoaHcpKQo+ICAJ CQlnb3RvIGVycl9mcmVlOwo+ICsKPiArCQlhdDkxc2FtOWc0NV9wbWMtPnBjaHdzW2ldID0gaHc7 Cj4gIAl9Cj4gIAo+ICAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXQ5MXNhbTlnNDVfc3lz dGVtY2spOyBpKyspIHsKPiBAQCAtMjEwLDcgKzIxMiw3IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBh dDkxc2FtOWc0NV9wbWNfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKPiAgCXJldHVybjsK PiAgCj4gIGVycl9mcmVlOgo+IC0JcG1jX2RhdGFfZnJlZShhdDkxc2FtOWc0NV9wbWMpOwo+ICsJ a2ZyZWUoYXQ5MXNhbTlnNDVfcG1jKTsKCkRpdHRvCgo+ICB9Cj4gIC8qCj4gICAqIFRoZSBUQ0Ig aXMgdXNlZCBhcyB0aGUgY2xvY2tzb3VyY2Ugc28gaXRzIGNsb2NrIGlzIG5lZWRlZCBlYXJseS4g VGhpcyBtZWFucwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL2F0OTFzYW05bjEyLmMg Yi9kcml2ZXJzL2Nsay9hdDkxL2F0OTFzYW05bjEyLmMKPiBpbmRleCA4YmIzOWQyYmE4NGIuLjNh MjU2NGMyZjcyNCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2F0OTFzYW05bjEyLmMK PiArKysgYi9kcml2ZXJzL2Nsay9hdDkxL2F0OTFzYW05bjEyLmMKPiBAQCAtMTI5LDcgKzEyOSw3 IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOW4xMl9wbWNfc2V0dXAoc3RydWN0IGRldmlj ZV9ub2RlICpucCkKPiAgCQlyZXR1cm47Cj4gIAo+ICAJYXQ5MXNhbTluMTJfcG1jID0gcG1jX2Rh dGFfYWxsb2NhdGUoUE1DX01BSU4gKyAxLAo+IC0JCQkJCSAgIG5jayhhdDkxc2FtOW4xMl9zeXN0 ZW1jayksIDMxLCAwKTsKPiArCQkJCQkgICBuY2soYXQ5MXNhbTluMTJfc3lzdGVtY2spLCAzMSwg MCwgMik7Cj4gIAlpZiAoIWF0OTFzYW05bjEyX3BtYykKPiAgCQlyZXR1cm47Cj4gIAo+IEBAIC0x OTgsNiArMTk4LDggQEAgc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05bjEyX3BtY19zZXR1cChz dHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQo+ICAJCQkJCQkgICAgJmF0OTFzYW05eDVfcHJvZ3JhbW1h YmxlX2xheW91dCk7Cj4gIAkJaWYgKElTX0VSUihodykpCj4gIAkJCWdvdG8gZXJyX2ZyZWU7Cj4g Kwo+ICsJCWF0OTFzYW05bjEyX3BtYy0+cGNod3NbaV0gPSBodzsKPiAgCX0KPiAgCj4gIAlmb3Ig KGkgPSAwOyBpIDwgQVJSQVlfU0laRShhdDkxc2FtOW4xMl9zeXN0ZW1jayk7IGkrKykgewo+IEBA IC0yMjgsNyArMjMwLDcgQEAgc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05bjEyX3BtY19zZXR1 cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQo+ICAJcmV0dXJuOwo+ICAKPiAgZXJyX2ZyZWU6Cj4g LQlwbWNfZGF0YV9mcmVlKGF0OTFzYW05bjEyX3BtYyk7Cj4gKwlrZnJlZShhdDkxc2FtOW4xMl9w bWMpOwoKRGl0dG8KCj4gIH0KPiAgLyoKPiAgICogVGhlIFRDQiBpcyB1c2VkIGFzIHRoZSBjbG9j a3NvdXJjZSBzbyBpdHMgY2xvY2sgaXMgbmVlZGVkIGVhcmx5LiBUaGlzIG1lYW5zCj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvYXQ5MXNhbTlybC5jIGIvZHJpdmVycy9jbGsvYXQ5MS9h dDkxc2FtOXJsLmMKPiBpbmRleCBjYzczOWQyMTRhZTMuLmJjZjA3ZjZhMGUwZSAxMDA2NDQKPiAt LS0gYS9kcml2ZXJzL2Nsay9hdDkxL2F0OTFzYW05cmwuYwo+ICsrKyBiL2RyaXZlcnMvY2xrL2F0 OTEvYXQ5MXNhbTlybC5jCj4gQEAgLTg5LDcgKzg5LDcgQEAgc3RhdGljIHZvaWQgX19pbml0IGF0 OTFzYW05cmxfcG1jX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCj4gIAo+ICAJYXQ5MXNh bTlybF9wbWMgPSBwbWNfZGF0YV9hbGxvY2F0ZShQTUNfTUFJTiArIDEsCj4gIAkJCQkJICAgbmNr KGF0OTFzYW05cmxfc3lzdGVtY2spLAo+IC0JCQkJCSAgIG5jayhhdDkxc2FtOXJsX3BlcmlwaGNr KSwgMCk7Cj4gKwkJCQkJICAgbmNrKGF0OTFzYW05cmxfcGVyaXBoY2spLCAwLCAyKTsKPiAgCWlm ICghYXQ5MXNhbTlybF9wbWMpCj4gIAkJcmV0dXJuOwo+ICAKPiBAQCAtMTM4LDYgKzEzOCw4IEBA IHN0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOXJsX3BtY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25v ZGUgKm5wKQo+ICAJCQkJCQkgICAgJmF0OTFybTkyMDBfcHJvZ3JhbW1hYmxlX2xheW91dCk7Cj4g IAkJaWYgKElTX0VSUihodykpCj4gIAkJCWdvdG8gZXJyX2ZyZWU7Cj4gKwo+ICsJCWF0OTFzYW05 cmxfcG1jLT5wY2h3c1tpXSA9IGh3Owo+ICAJfQo+ICAKPiAgCWZvciAoaSA9IDA7IGkgPCBBUlJB WV9TSVpFKGF0OTFzYW05cmxfc3lzdGVtY2spOyBpKyspIHsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9jbGsvYXQ5MS9hdDkxc2FtOXg1LmMgYi9kcml2ZXJzL2Nsay9hdDkxL2F0OTFzYW05eDUuYwo+ IGluZGV4IGFhYzk5ZDY5OTU2OC4uZjEzNzU2YjQwN2UyIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMv Y2xrL2F0OTEvYXQ5MXNhbTl4NS5jCj4gKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9hdDkxc2FtOXg1 LmMKPiBAQCAtMTUxLDcgKzE1MSw3IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOXg1X3Bt Y19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAo+ICAJCXJldHVybjsKPiAgCj4gIAlhdDkx c2FtOXg1X3BtYyA9IHBtY19kYXRhX2FsbG9jYXRlKFBNQ19NQUlOICsgMSwKPiAtCQkJCQkgICBu Y2soYXQ5MXNhbTl4NV9zeXN0ZW1jayksIDMxLCAwKTsKPiArCQkJCQkgICBuY2soYXQ5MXNhbTl4 NV9zeXN0ZW1jayksIDMxLCAwLCAyKTsKPiAgCWlmICghYXQ5MXNhbTl4NV9wbWMpCj4gIAkJcmV0 dXJuOwo+ICAKPiBAQCAtMjI3LDYgKzIyNyw4IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2Ft OXg1X3BtY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAo+ICAJCQkJCQkgICAgJmF0OTFz YW05eDVfcHJvZ3JhbW1hYmxlX2xheW91dCk7Cj4gIAkJaWYgKElTX0VSUihodykpCj4gIAkJCWdv dG8gZXJyX2ZyZWU7Cj4gKwo+ICsJCWF0OTFzYW05eDVfcG1jLT5wY2h3c1tpXSA9IGh3Owo+ICAJ fQo+ICAKPiAgCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGF0OTFzYW05eDVfc3lzdGVtY2sp OyBpKyspIHsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9wbWMuYyBiL2RyaXZlcnMv Y2xrL2F0OTEvcG1jLmMKPiBpbmRleCBhYzQ2ZWExYjlmZGEuLjhhMTU3N2UyYzJmZCAxMDA2NDQK PiAtLS0gYS9kcml2ZXJzL2Nsay9hdDkxL3BtYy5jCj4gKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9w bWMuYwo+IEBAIC02Nyw2ICs2NywxMCBAQCBzdHJ1Y3QgY2xrX2h3ICpvZl9jbGtfaHdfcG1jX2dl dChzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpjbGtzcGVjLCB2b2lkICpkYXRhKQo+ICAJCWlmIChp ZHggPCBwbWNfZGF0YS0+bmdjaykKPiAgCQkJcmV0dXJuIHBtY19kYXRhLT5naHdzW2lkeF07Cj4g IAkJYnJlYWs7Cj4gKwljYXNlIFBNQ19UWVBFX1BST0dSQU1NQUJMRToKPiArCQlpZiAoaWR4IDwg cG1jX2RhdGEtPm5wY2spCj4gKwkJCXJldHVybiBwbWNfZGF0YS0+cGNod3NbaWR4XTsKPiArCQli cmVhazsKPiAgCWRlZmF1bHQ6Cj4gIAkJYnJlYWs7Cj4gIAl9Cj4gQEAgLTc3LDkgKzgxLDEwIEBA IHN0cnVjdCBjbGtfaHcgKm9mX2Nsa19od19wbWNfZ2V0KHN0cnVjdCBvZl9waGFuZGxlX2FyZ3Mg KmNsa3NwZWMsIHZvaWQgKmRhdGEpCj4gIH0KPiAgCj4gIHN0cnVjdCBwbWNfZGF0YSAqcG1jX2Rh dGFfYWxsb2NhdGUodW5zaWduZWQgaW50IG5jb3JlLCB1bnNpZ25lZCBpbnQgbnN5c3RlbSwKPiAt CQkJCSAgIHVuc2lnbmVkIGludCBucGVyaXBoLCB1bnNpZ25lZCBpbnQgbmdjaykKPiArCQkJCSAg IHVuc2lnbmVkIGludCBucGVyaXBoLCB1bnNpZ25lZCBpbnQgbmdjaywKPiArCQkJCSAgIHVuc2ln bmVkIGludCBucGNrKQo+ICB7Cj4gLQl1bnNpZ25lZCBpbnQgbnVtX2Nsa3MgPSBuY29yZSArIG5z eXN0ZW0gKyBucGVyaXBoICsgbmdjazsKPiArCXVuc2lnbmVkIGludCBudW1fY2xrcyA9IG5jb3Jl ICsgbnN5c3RlbSArIG5wZXJpcGggKyBuZ2NrICsgbnBjazsKPiAgCXN0cnVjdCBwbWNfZGF0YSAq cG1jX2RhdGE7Cj4gIAo+ICAJcG1jX2RhdGEgPSBremFsbG9jKHN0cnVjdF9zaXplKHBtY19kYXRh LCBod3RhYmxlLCBudW1fY2xrcyksCj4gQEAgLTk5LDYgKzEwNCw5IEBAIHN0cnVjdCBwbWNfZGF0 YSAqcG1jX2RhdGFfYWxsb2NhdGUodW5zaWduZWQgaW50IG5jb3JlLCB1bnNpZ25lZCBpbnQgbnN5 c3RlbSwKPiAgCXBtY19kYXRhLT5uZ2NrID0gbmdjazsKPiAgCXBtY19kYXRhLT5naHdzID0gcG1j X2RhdGEtPnBod3MgKyBucGVyaXBoOwo+ICAKPiArCXBtY19kYXRhLT5ucGNrID0gbnBjazsKPiAr CXBtY19kYXRhLT5wY2h3cyA9IHBtY19kYXRhLT5naHdzICsgbmdjazsKPiArCj4gIAlyZXR1cm4g cG1jX2RhdGE7Cj4gIH0KPiAgCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvcG1jLmgg Yi9kcml2ZXJzL2Nsay9hdDkxL3BtYy5oCj4gaW5kZXggZmMzZWY3NzJiOWQ5Li5kZjYxNmYyOTM3 ZTcgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9wbWMuaAo+ICsrKyBiL2RyaXZlcnMv Y2xrL2F0OTEvcG1jLmgKPiBAQCAtMjQsNiArMjQsOCBAQCBzdHJ1Y3QgcG1jX2RhdGEgewo+ICAJ c3RydWN0IGNsa19odyAqKnBod3M7Cj4gIAl1bnNpZ25lZCBpbnQgbmdjazsKPiAgCXN0cnVjdCBj bGtfaHcgKipnaHdzOwo+ICsJdW5zaWduZWQgaW50IG5wY2s7Cj4gKwlzdHJ1Y3QgY2xrX2h3ICoq cGNod3M7Cj4gIAo+ICAJc3RydWN0IGNsa19odyAqaHd0YWJsZVtdOwo+ICB9Owo+IEBAIC05Niw3 ICs5OCw4IEBAIHN0cnVjdCBjbGtfcGNyX2xheW91dCB7Cj4gICNkZWZpbmUgbmRjayhhLCBzKSAo YVtzIC0gMV0uaWQgKyAxKQo+ICAjZGVmaW5lIG5jayhhKSAoYVtBUlJBWV9TSVpFKGEpIC0gMV0u aWQgKyAxKQo+ICBzdHJ1Y3QgcG1jX2RhdGEgKnBtY19kYXRhX2FsbG9jYXRlKHVuc2lnbmVkIGlu dCBuY29yZSwgdW5zaWduZWQgaW50IG5zeXN0ZW0sCj4gLQkJCQkgICB1bnNpZ25lZCBpbnQgbnBl cmlwaCwgdW5zaWduZWQgaW50IG5nY2spOwo+ICsJCQkJICAgdW5zaWduZWQgaW50IG5wZXJpcGgs IHVuc2lnbmVkIGludCBuZ2NrLAo+ICsJCQkJICAgdW5zaWduZWQgaW50IG5wY2spOwo+ICAKPiAg aW50IG9mX2F0OTFfZ2V0X2Nsa19yYW5nZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBj aGFyICpwcm9wbmFtZSwKPiAgCQkJICBzdHJ1Y3QgY2xrX3JhbmdlICpyYW5nZSk7Cj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvc2FtOXg2MC5jIGIvZHJpdmVycy9jbGsvYXQ5MS9zYW05 eDYwLmMKPiBpbmRleCBhN2Q0ZjY0OGRiMjYuLmRiMTRlMDQyN2M3ZiAxMDA2NDQKPiAtLS0gYS9k cml2ZXJzL2Nsay9hdDkxL3NhbTl4NjAuYwo+ICsrKyBiL2RyaXZlcnMvY2xrL2F0OTEvc2FtOXg2 MC5jCj4gQEAgLTE4NSw3ICsxODUsNyBAQCBzdGF0aWMgdm9pZCBfX2luaXQgc2FtOXg2MF9wbWNf c2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKPiAgCXNhbTl4NjBfcG1jID0gcG1jX2RhdGFf YWxsb2NhdGUoUE1DX01BSU4gKyAxLAo+ICAJCQkJCW5jayhzYW05eDYwX3N5c3RlbWNrKSwKPiAg CQkJCQluY2soc2FtOXg2MF9wZXJpcGhjayksCj4gLQkJCQkJbmNrKHNhbTl4NjBfZ2NrKSk7Cj4g KwkJCQkJbmNrKHNhbTl4NjBfZ2NrKSwgOCk7Cj4gIAlpZiAoIXNhbTl4NjBfcG1jKQo+ICAJCXJl dHVybjsKPiAgCj4gQEAgLTI1NSw2ICsyNTUsOCBAQCBzdGF0aWMgdm9pZCBfX2luaXQgc2FtOXg2 MF9wbWNfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKPiAgCQkJCQkJICAgICZzYW05eDYw X3Byb2dyYW1tYWJsZV9sYXlvdXQpOwo+ICAJCWlmIChJU19FUlIoaHcpKQo+ICAJCQlnb3RvIGVy cl9mcmVlOwo+ICsKPiArCQlzYW05eDYwX3BtYy0+cGNod3NbaV0gPSBodzsKPiAgCX0KPiAgCj4g IAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzYW05eDYwX3N5c3RlbWNrKTsgaSsrKSB7Cj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvc2FtYTVkMi5jIGIvZHJpdmVycy9jbGsvYXQ5 MS9zYW1hNWQyLmMKPiBpbmRleCBiMjU2MDY3MGU1YWYuLmFlNWU4M2NhZGIzZCAxMDA2NDQKPiAt LS0gYS9kcml2ZXJzL2Nsay9hdDkxL3NhbWE1ZDIuYwo+ICsrKyBiL2RyaXZlcnMvY2xrL2F0OTEv c2FtYTVkMi5jCj4gQEAgLTE2OSw3ICsxNjksNyBAQCBzdGF0aWMgdm9pZCBfX2luaXQgc2FtYTVk Ml9wbWNfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKPiAgCXNhbWE1ZDJfcG1jID0gcG1j X2RhdGFfYWxsb2NhdGUoUE1DX0kyUzFfTVVYICsgMSwKPiAgCQkJCQluY2soc2FtYTVkMl9zeXN0 ZW1jayksCj4gIAkJCQkJbmNrKHNhbWE1ZDJfcGVyaXBoMzJjayksCj4gLQkJCQkJbmNrKHNhbWE1 ZDJfZ2NrKSk7Cj4gKwkJCQkJbmNrKHNhbWE1ZDJfZ2NrKSwgMyk7Cj4gIAlpZiAoIXNhbWE1ZDJf cG1jKQo+ICAJCXJldHVybjsKPiAgCj4gQEAgLTI2Nyw2ICsyNjcsOCBAQCBzdGF0aWMgdm9pZCBf X2luaXQgc2FtYTVkMl9wbWNfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKPiAgCQkJCQkJ ICAgICZzYW1hNWQyX3Byb2dyYW1tYWJsZV9sYXlvdXQpOwo+ICAJCWlmIChJU19FUlIoaHcpKQo+ ICAJCQlnb3RvIGVycl9mcmVlOwo+ICsKPiArCQlzYW1hNWQyX3BtYy0+cGNod3NbaV0gPSBodzsK PiAgCX0KPiAgCj4gIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzYW1hNWQyX3N5c3RlbWNr KTsgaSsrKSB7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvc2FtYTVkMy5jIGIvZHJp dmVycy9jbGsvYXQ5MS9zYW1hNWQzLmMKPiBpbmRleCA4ODUwNmY5MDljMDguLjUwN2VlZjY3OTdm MSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2Nsay9hdDkxL3NhbWE1ZDMuYwo+ICsrKyBiL2RyaXZl cnMvY2xrL2F0OTEvc2FtYTVkMy5jCj4gQEAgLTEyNyw3ICsxMjcsNyBAQCBzdGF0aWMgdm9pZCBf X2luaXQgc2FtYTVkM19wbWNfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKPiAgCj4gIAlz YW1hNWQzX3BtYyA9IHBtY19kYXRhX2FsbG9jYXRlKFBNQ19NQUlOICsgMSwKPiAgCQkJCQluY2so c2FtYTVkM19zeXN0ZW1jayksCj4gLQkJCQkJbmNrKHNhbWE1ZDNfcGVyaXBoY2spLCAwKTsKPiAr CQkJCQluY2soc2FtYTVkM19wZXJpcGhjayksIDAsIDMpOwo+ICAJaWYgKCFzYW1hNWQzX3BtYykK PiAgCQlyZXR1cm47Cj4gIAo+IEBAIC0yMDEsNiArMjAxLDggQEAgc3RhdGljIHZvaWQgX19pbml0 IHNhbWE1ZDNfcG1jX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCj4gIAkJCQkJCSAgICAm YXQ5MXNhbTl4NV9wcm9ncmFtbWFibGVfbGF5b3V0KTsKPiAgCQlpZiAoSVNfRVJSKGh3KSkKPiAg CQkJZ290byBlcnJfZnJlZTsKPiArCj4gKwkJc2FtYTVkM19wbWMtPnBjaHdzW2ldID0gaHc7Cj4g IAl9Cj4gIAo+ICAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2FtYTVkM19zeXN0ZW1jayk7 IGkrKykgewo+IEBAIC0yMzEsNyArMjMzLDcgQEAgc3RhdGljIHZvaWQgX19pbml0IHNhbWE1ZDNf cG1jX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCj4gIAlyZXR1cm47Cj4gIAo+ICBlcnJf ZnJlZToKPiAtCXBtY19kYXRhX2ZyZWUoc2FtYTVkM19wbWMpOwo+ICsJa2ZyZWUoc2FtYTVkM19w bWMpOwo+ICB9Cj4gIC8qCj4gICAqIFRoZSBUQ0IgaXMgdXNlZCBhcyB0aGUgY2xvY2tzb3VyY2Ug c28gaXRzIGNsb2NrIGlzIG5lZWRlZCBlYXJseS4gVGhpcyBtZWFucwo+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2Nsay9hdDkxL3NhbWE1ZDQuYyBiL2RyaXZlcnMvY2xrL2F0OTEvc2FtYTVkNC5jCj4g aW5kZXggNGNhOWE0NjE5NTAwLi44MDY5MjkwMmI0ZTQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9j bGsvYXQ5MS9zYW1hNWQ0LmMKPiArKysgYi9kcml2ZXJzL2Nsay9hdDkxL3NhbWE1ZDQuYwo+IEBA IC0xNDIsNyArMTQyLDcgQEAgc3RhdGljIHZvaWQgX19pbml0IHNhbWE1ZDRfcG1jX3NldHVwKHN0 cnVjdCBkZXZpY2Vfbm9kZSAqbnApCj4gIAo+ICAJc2FtYTVkNF9wbWMgPSBwbWNfZGF0YV9hbGxv Y2F0ZShQTUNfTUNLMiArIDEsCj4gIAkJCQkJbmNrKHNhbWE1ZDRfc3lzdGVtY2spLAo+IC0JCQkJ CW5jayhzYW1hNWQ0X3BlcmlwaDMyY2spLCAwKTsKPiArCQkJCQluY2soc2FtYTVkNF9wZXJpcGgz MmNrKSwgMCwgMyk7Cj4gIAlpZiAoIXNhbWE1ZDRfcG1jKQo+ICAJCXJldHVybjsKPiAgCj4gQEAg LTIyNCw2ICsyMjQsOCBAQCBzdGF0aWMgdm9pZCBfX2luaXQgc2FtYTVkNF9wbWNfc2V0dXAoc3Ry dWN0IGRldmljZV9ub2RlICpucCkKPiAgCQkJCQkJICAgICZhdDkxc2FtOXg1X3Byb2dyYW1tYWJs ZV9sYXlvdXQpOwo+ICAJCWlmIChJU19FUlIoaHcpKQo+ICAJCQlnb3RvIGVycl9mcmVlOwo+ICsK PiArCQlzYW1hNWQ0X3BtYy0+cGNod3NbaV0gPSBodzsKPiAgCX0KPiAgCj4gIAlmb3IgKGkgPSAw OyBpIDwgQVJSQVlfU0laRShzYW1hNWQ0X3N5c3RlbWNrKTsgaSsrKSB7Cj4gZGlmZiAtLWdpdCBh L2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svYXQ5MS5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9j bG9jay9hdDkxLmgKPiBpbmRleCAzOGI1NTU0MTUzYzguLmMzZjRhYTZhMmQyOSAxMDA2NDQKPiAt LS0gYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2F0OTEuaAo+ICsrKyBiL2luY2x1ZGUvZHQt YmluZGluZ3MvY2xvY2svYXQ5MS5oCj4gQEAgLTEyLDYgKzEyLDcgQEAKPiAgI2RlZmluZSBQTUNf VFlQRV9TWVNURU0JCTEKPiAgI2RlZmluZSBQTUNfVFlQRV9QRVJJUEhFUkFMCTIKPiAgI2RlZmlu ZSBQTUNfVFlQRV9HQ0sJCTMKPiArI2RlZmluZSBQTUNfVFlQRV9QUk9HUkFNTUFCTEUJNAo+ICAK PiAgI2RlZmluZSBQTUNfU0xPVwkJMAo+ICAjZGVmaW5lIFBNQ19NQ0sJCQkxCj4gLS0gCj4gMi4y MC4xCj4gCgotLSAKQWxleGFuZHJlIEJlbGxvbmksIEJvb3RsaW4KRW1iZWRkZWQgTGludXggYW5k IEtlcm5lbCBlbmdpbmVlcmluZwpodHRwczovL2Jvb3RsaW4uY29tCgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcg bGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmlu ZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==