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=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 CDCE5C3A5A9 for ; Mon, 4 May 2020 20:01:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AAC49206A5 for ; Mon, 4 May 2020 20:01:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727930AbgEDUBS (ORCPT ); Mon, 4 May 2020 16:01:18 -0400 Received: from relay6-d.mail.gandi.net ([217.70.183.198]:49679 "EHLO relay6-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726111AbgEDUBS (ORCPT ); Mon, 4 May 2020 16:01:18 -0400 X-Originating-IP: 86.202.105.35 Received: from localhost (lfbn-lyo-1-9-35.w86-202.abo.wanadoo.fr [86.202.105.35]) (Authenticated sender: alexandre.belloni@bootlin.com) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id B6B73C0003; Mon, 4 May 2020 20:01:13 +0000 (UTC) Date: Mon, 4 May 2020 22:01:13 +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 v4 2/3] clk: at91: allow setting PCKx parent via DT Message-ID: <20200504200113.GH34497@piout.net> References: <787d012c250cc2e9abb88a9848664336b6eb0174.1588526049.git.mirq-linux@rere.qmqm.pl> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <787d012c250cc2e9abb88a9848664336b6eb0174.1588526049.git.mirq-linux@rere.qmqm.pl> Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org On 03/05/2020 19:19:25+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 > --- > 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); > } > /* > * 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); > } > /* > * 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); > } > /* > * 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 77DB0C3A5A9 for ; Mon, 4 May 2020 20:01: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 409B2206A5 for ; Mon, 4 May 2020 20:01: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="eqW/Belo" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 409B2206A5 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=Y9E3U089OsY2XTgaat3yxPVZFYHmfbAWbJ/ckJCFTSM=; b=eqW/BeloK2aNc8 ZWdyhUeuQjmVPKNTYiMfMzng83suNSlIWso8gTmeAv2RVpGiaTQK6VDrYpb/FMB0mPqsgTLL1dHPs erdoyURgHNBEqtd38VNZ6hpeSwd+yLnUhVNNbgoOG3NrfnYZpybhJzIsZ4MjpYXDz6fCeKLBoXunj 5JYrVUSbqQlN6CnZcEzLLL6igIovYxEn0LQ+e6hqV4h+39S5oLyAukcGUMGzagm6vKbaxOzqpmGk1 9iEfq/6IKQS2MCrnSdz9GovyotXGxHt3E42XydEE4aV9QaPQoT32GqE5ADdKOpeIjEGOmSfKSGbaM E8Mw9Lsoa/IUDhYMJrow==; 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 1jVhHG-0003Js-Ql; Mon, 04 May 2020 20:01:22 +0000 Received: from relay6-d.mail.gandi.net ([217.70.183.198]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jVhHD-0003IY-5V for linux-arm-kernel@lists.infradead.org; Mon, 04 May 2020 20:01:21 +0000 X-Originating-IP: 86.202.105.35 Received: from localhost (lfbn-lyo-1-9-35.w86-202.abo.wanadoo.fr [86.202.105.35]) (Authenticated sender: alexandre.belloni@bootlin.com) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id B6B73C0003; Mon, 4 May 2020 20:01:13 +0000 (UTC) Date: Mon, 4 May 2020 22:01:13 +0200 From: Alexandre Belloni To: =?utf-8?B?TWljaGHFgiBNaXJvc8WCYXc=?= Subject: Re: [PATCH v4 2/3] clk: at91: allow setting PCKx parent via DT Message-ID: <20200504200113.GH34497@piout.net> References: <787d012c250cc2e9abb88a9848664336b6eb0174.1588526049.git.mirq-linux@rere.qmqm.pl> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <787d012c250cc2e9abb88a9848664336b6eb0174.1588526049.git.mirq-linux@rere.qmqm.pl> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200504_130119_491665_AB3D9FDB X-CRM114-Status: GOOD ( 18.99 ) 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 T24gMDMvMDUvMjAyMCAxOToxOToyNSswMjAwLCBNaWNoYcWCIE1pcm9zxYJhdyB3cm90ZToKPiBU aGlzIGV4cG9zZXMgUFJPR3ggY2xvY2tzIGZvciB1c2UgaW4gYXNzaWduZWQtY2xvY2tzIERldmlj ZVRyZWUgcHJvcGVydHkKPiBmb3Igc2VsZWN0aW5nIFBDS3ggcGFyZW50IGNsb2NrLgo+IAo+IFNp Z25lZC1vZmYtYnk6IE1pY2hhxYIgTWlyb3PFgmF3IDxtaXJxLWxpbnV4QHJlcmUucW1xbS5wbD4K QWNrZWQtYnk6IEFsZXhhbmRyZSBCZWxsb25pIDxhbGV4YW5kcmUuYmVsbG9uaUBib290bGluLmNv bT4KCj4gLS0tCj4gdjI6IHJlYmFzZSBhbmQgdXBkYXRlIHRvIGNsay9jbGstYXQ5MSBicmFuY2gK PiB2MzogcmViYXNlCj4gdjQ6IG5vIGNoYW5nZXMKPiAtLS0KPiAgZHJpdmVycy9jbGsvYXQ5MS9h dDkxcm05MjAwLmMgICAgfCAgNiArKysrLS0KPiAgZHJpdmVycy9jbGsvYXQ5MS9hdDkxc2FtOTI2 MC5jICAgfCAgNSArKysrLQo+ICBkcml2ZXJzL2Nsay9hdDkxL2F0OTFzYW05ZzQ1LmMgICB8ICA2 ICsrKystLQo+ICBkcml2ZXJzL2Nsay9hdDkxL2F0OTFzYW05bjEyLmMgICB8ICA2ICsrKystLQo+ ICBkcml2ZXJzL2Nsay9hdDkxL2F0OTFzYW05cmwuYyAgICB8ICA0ICsrKy0KPiAgZHJpdmVycy9j bGsvYXQ5MS9hdDkxc2FtOXg1LmMgICAgfCAgNCArKystCj4gIGRyaXZlcnMvY2xrL2F0OTEvcG1j LmMgICAgICAgICAgIHwgMTIgKysrKysrKysrKy0tCj4gIGRyaXZlcnMvY2xrL2F0OTEvcG1jLmgg ICAgICAgICAgIHwgIDUgKysrKy0KPiAgZHJpdmVycy9jbGsvYXQ5MS9zYW05eDYwLmMgICAgICAg fCAgNCArKystCj4gIGRyaXZlcnMvY2xrL2F0OTEvc2FtYTVkMi5jICAgICAgIHwgIDQgKysrLQo+ ICBkcml2ZXJzL2Nsay9hdDkxL3NhbWE1ZDMuYyAgICAgICB8ICA2ICsrKystLQo+ICBkcml2ZXJz L2Nsay9hdDkxL3NhbWE1ZDQuYyAgICAgICB8ICA0ICsrKy0KPiAgaW5jbHVkZS9kdC1iaW5kaW5n cy9jbG9jay9hdDkxLmggfCAgMSArCj4gIDEzIGZpbGVzIGNoYW5nZWQsIDUwIGluc2VydGlvbnMo KyksIDE3IGRlbGV0aW9ucygtKQo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL2F0 OTFybTkyMDAuYyBiL2RyaXZlcnMvY2xrL2F0OTEvYXQ5MXJtOTIwMC5jCj4gaW5kZXggYzQ0YTQz MWI2Yzk3Li44ZGE4OGU5YTk1ZDggMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9hdDkx cm05MjAwLmMKPiArKysgYi9kcml2ZXJzL2Nsay9hdDkxL2F0OTFybTkyMDAuYwo+IEBAIC0xMDAs NyArMTAwLDcgQEAgc3RhdGljIHZvaWQgX19pbml0IGF0OTFybTkyMDBfcG1jX3NldHVwKHN0cnVj dCBkZXZpY2Vfbm9kZSAqbnApCj4gIAo+ICAJYXQ5MXJtOTIwMF9wbWMgPSBwbWNfZGF0YV9hbGxv Y2F0ZShQTUNfTUFJTiArIDEsCj4gIAkJCQkJICAgIG5jayhhdDkxcm05MjAwX3N5c3RlbWNrKSwK PiAtCQkJCQkgICAgbmNrKGF0OTFybTkyMDBfcGVyaXBoY2spLCAwKTsKPiArCQkJCQkgICAgbmNr KGF0OTFybTkyMDBfcGVyaXBoY2spLCAwLCA0KTsKPiAgCWlmICghYXQ5MXJtOTIwMF9wbWMpCj4g IAkJcmV0dXJuOwo+ICAKPiBAQCAtMTU5LDYgKzE1OSw4IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBh dDkxcm05MjAwX3BtY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQo+ICAJCQkJCQkgICAg JmF0OTFybTkyMDBfcHJvZ3JhbW1hYmxlX2xheW91dCk7Cj4gIAkJaWYgKElTX0VSUihodykpCj4g IAkJCWdvdG8gZXJyX2ZyZWU7Cj4gKwo+ICsJCWF0OTFybTkyMDBfcG1jLT5wY2h3c1tpXSA9IGh3 Owo+ICAJfQo+ICAKPiAgCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGF0OTFybTkyMDBfc3lz dGVtY2spOyBpKyspIHsKPiBAQCAtMTg3LDcgKzE4OSw3IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBh dDkxcm05MjAwX3BtY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQo+ICAJcmV0dXJuOwo+ ICAKPiAgZXJyX2ZyZWU6Cj4gLQlwbWNfZGF0YV9mcmVlKGF0OTFybTkyMDBfcG1jKTsKPiArCWtm cmVlKGF0OTFybTkyMDBfcG1jKTsKPiAgfQo+ICAvKgo+ICAgKiBXaGlsZSB0aGUgVENCIGNhbiBi ZSB1c2VkIGFzIHRoZSBjbG9ja3NvdXJjZSwgdGhlIHN5c3RlbSB0aW1lciBpcyBtb3N0IGxpa2Vs eQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL2F0OTFzYW05MjYwLmMgYi9kcml2ZXJz L2Nsay9hdDkxL2F0OTFzYW05MjYwLmMKPiBpbmRleCA5NDZmMDNhMDk4NTguLjdlNWZmMjUyZmZm YyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2F0OTFzYW05MjYwLmMKPiArKysgYi9k cml2ZXJzL2Nsay9hdDkxL2F0OTFzYW05MjYwLmMKPiBAQCAtMzU0LDcgKzM1NCw4IEBAIHN0YXRp YyB2b2lkIF9faW5pdCBhdDkxc2FtOTI2eF9wbWNfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpu cCwKPiAgCj4gIAlhdDkxc2FtOTI2MF9wbWMgPSBwbWNfZGF0YV9hbGxvY2F0ZShQTUNfTUFJTiAr IDEsCj4gIAkJCQkJICAgIG5kY2soZGF0YS0+c2NrLCBkYXRhLT5udW1fc2NrKSwKPiAtCQkJCQkg ICAgbmRjayhkYXRhLT5wY2ssIGRhdGEtPm51bV9wY2spLCAwKTsKPiArCQkJCQkgICAgbmRjayhk YXRhLT5wY2ssIGRhdGEtPm51bV9wY2spLAo+ICsJCQkJCSAgICAwLCBkYXRhLT5udW1fcHJvZ2Nr KTsKPiAgCWlmICghYXQ5MXNhbTkyNjBfcG1jKQo+ICAJCXJldHVybjsKPiAgCj4gQEAgLTQzNCw2 ICs0MzUsOCBAQCBzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXNhbTkyNnhfcG1jX3NldHVwKHN0cnVj dCBkZXZpY2Vfbm9kZSAqbnAsCj4gIAkJCQkJCSAgICAmYXQ5MXJtOTIwMF9wcm9ncmFtbWFibGVf bGF5b3V0KTsKPiAgCQlpZiAoSVNfRVJSKGh3KSkKPiAgCQkJZ290byBlcnJfZnJlZTsKPiArCj4g KwkJYXQ5MXNhbTkyNjBfcG1jLT5wY2h3c1tpXSA9IGh3Owo+ICAJfQo+ICAKPiAgCWZvciAoaSA9 IDA7IGkgPCBkYXRhLT5udW1fc2NrOyBpKyspIHsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsv YXQ5MS9hdDkxc2FtOWc0NS5jIGIvZHJpdmVycy9jbGsvYXQ5MS9hdDkxc2FtOWc0NS5jCj4gaW5k ZXggMzhhN2QyZDJkZjBjLi41ZDE4ZWIwNGMyMTggMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9jbGsv YXQ5MS9hdDkxc2FtOWc0NS5jCj4gKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9hdDkxc2FtOWc0NS5j Cj4gQEAgLTExNyw3ICsxMTcsNyBAQCBzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXNhbTlnNDVfcG1j X3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCj4gIAo+ICAJYXQ5MXNhbTlnNDVfcG1jID0g cG1jX2RhdGFfYWxsb2NhdGUoUE1DX01BSU4gKyAxLAo+ICAJCQkJCSAgICBuY2soYXQ5MXNhbTln NDVfc3lzdGVtY2spLAo+IC0JCQkJCSAgICBuY2soYXQ5MXNhbTlnNDVfcGVyaXBoY2spLCAwKTsK PiArCQkJCQkgICAgbmNrKGF0OTFzYW05ZzQ1X3BlcmlwaGNrKSwgMCwgMik7Cj4gIAlpZiAoIWF0 OTFzYW05ZzQ1X3BtYykKPiAgCQlyZXR1cm47Cj4gIAo+IEBAIC0xODIsNiArMTgyLDggQEAgc3Rh dGljIHZvaWQgX19pbml0IGF0OTFzYW05ZzQ1X3BtY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUg Km5wKQo+ICAJCQkJCQkgICAgJmF0OTFzYW05ZzQ1X3Byb2dyYW1tYWJsZV9sYXlvdXQpOwo+ICAJ CWlmIChJU19FUlIoaHcpKQo+ICAJCQlnb3RvIGVycl9mcmVlOwo+ICsKPiArCQlhdDkxc2FtOWc0 NV9wbWMtPnBjaHdzW2ldID0gaHc7Cj4gIAl9Cj4gIAo+ICAJZm9yIChpID0gMDsgaSA8IEFSUkFZ X1NJWkUoYXQ5MXNhbTlnNDVfc3lzdGVtY2spOyBpKyspIHsKPiBAQCAtMjEwLDcgKzIxMiw3IEBA IHN0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOWc0NV9wbWNfc2V0dXAoc3RydWN0IGRldmljZV9u b2RlICpucCkKPiAgCXJldHVybjsKPiAgCj4gIGVycl9mcmVlOgo+IC0JcG1jX2RhdGFfZnJlZShh dDkxc2FtOWc0NV9wbWMpOwo+ICsJa2ZyZWUoYXQ5MXNhbTlnNDVfcG1jKTsKPiAgfQo+ICAvKgo+ ICAgKiBUaGUgVENCIGlzIHVzZWQgYXMgdGhlIGNsb2Nrc291cmNlIHNvIGl0cyBjbG9jayBpcyBu ZWVkZWQgZWFybHkuIFRoaXMgbWVhbnMKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9h dDkxc2FtOW4xMi5jIGIvZHJpdmVycy9jbGsvYXQ5MS9hdDkxc2FtOW4xMi5jCj4gaW5kZXggOGJi MzlkMmJhODRiLi4zYTI1NjRjMmY3MjQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9h dDkxc2FtOW4xMi5jCj4gKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9hdDkxc2FtOW4xMi5jCj4gQEAg LTEyOSw3ICsxMjksNyBAQCBzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXNhbTluMTJfcG1jX3NldHVw KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCj4gIAkJcmV0dXJuOwo+ICAKPiAgCWF0OTFzYW05bjEy X3BtYyA9IHBtY19kYXRhX2FsbG9jYXRlKFBNQ19NQUlOICsgMSwKPiAtCQkJCQkgICBuY2soYXQ5 MXNhbTluMTJfc3lzdGVtY2spLCAzMSwgMCk7Cj4gKwkJCQkJICAgbmNrKGF0OTFzYW05bjEyX3N5 c3RlbWNrKSwgMzEsIDAsIDIpOwo+ICAJaWYgKCFhdDkxc2FtOW4xMl9wbWMpCj4gIAkJcmV0dXJu Owo+ICAKPiBAQCAtMTk4LDYgKzE5OCw4IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOW4x Ml9wbWNfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKPiAgCQkJCQkJICAgICZhdDkxc2Ft OXg1X3Byb2dyYW1tYWJsZV9sYXlvdXQpOwo+ICAJCWlmIChJU19FUlIoaHcpKQo+ICAJCQlnb3Rv IGVycl9mcmVlOwo+ICsKPiArCQlhdDkxc2FtOW4xMl9wbWMtPnBjaHdzW2ldID0gaHc7Cj4gIAl9 Cj4gIAo+ICAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXQ5MXNhbTluMTJfc3lzdGVtY2sp OyBpKyspIHsKPiBAQCAtMjI4LDcgKzIzMCw3IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2Ft OW4xMl9wbWNfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKPiAgCXJldHVybjsKPiAgCj4g IGVycl9mcmVlOgo+IC0JcG1jX2RhdGFfZnJlZShhdDkxc2FtOW4xMl9wbWMpOwo+ICsJa2ZyZWUo YXQ5MXNhbTluMTJfcG1jKTsKPiAgfQo+ICAvKgo+ICAgKiBUaGUgVENCIGlzIHVzZWQgYXMgdGhl IGNsb2Nrc291cmNlIHNvIGl0cyBjbG9jayBpcyBuZWVkZWQgZWFybHkuIFRoaXMgbWVhbnMKPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9hdDkxc2FtOXJsLmMgYi9kcml2ZXJzL2Nsay9h dDkxL2F0OTFzYW05cmwuYwo+IGluZGV4IGNjNzM5ZDIxNGFlMy4uYmNmMDdmNmEwZTBlIDEwMDY0 NAo+IC0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvYXQ5MXNhbTlybC5jCj4gKysrIGIvZHJpdmVycy9j bGsvYXQ5MS9hdDkxc2FtOXJsLmMKPiBAQCAtODksNyArODksNyBAQCBzdGF0aWMgdm9pZCBfX2lu aXQgYXQ5MXNhbTlybF9wbWNfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKPiAgCj4gIAlh dDkxc2FtOXJsX3BtYyA9IHBtY19kYXRhX2FsbG9jYXRlKFBNQ19NQUlOICsgMSwKPiAgCQkJCQkg ICBuY2soYXQ5MXNhbTlybF9zeXN0ZW1jayksCj4gLQkJCQkJICAgbmNrKGF0OTFzYW05cmxfcGVy aXBoY2spLCAwKTsKPiArCQkJCQkgICBuY2soYXQ5MXNhbTlybF9wZXJpcGhjayksIDAsIDIpOwo+ ICAJaWYgKCFhdDkxc2FtOXJsX3BtYykKPiAgCQlyZXR1cm47Cj4gIAo+IEBAIC0xMzgsNiArMTM4 LDggQEAgc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05cmxfcG1jX3NldHVwKHN0cnVjdCBkZXZp Y2Vfbm9kZSAqbnApCj4gIAkJCQkJCSAgICAmYXQ5MXJtOTIwMF9wcm9ncmFtbWFibGVfbGF5b3V0 KTsKPiAgCQlpZiAoSVNfRVJSKGh3KSkKPiAgCQkJZ290byBlcnJfZnJlZTsKPiArCj4gKwkJYXQ5 MXNhbTlybF9wbWMtPnBjaHdzW2ldID0gaHc7Cj4gIAl9Cj4gIAo+ICAJZm9yIChpID0gMDsgaSA8 IEFSUkFZX1NJWkUoYXQ5MXNhbTlybF9zeXN0ZW1jayk7IGkrKykgewo+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2Nsay9hdDkxL2F0OTFzYW05eDUuYyBiL2RyaXZlcnMvY2xrL2F0OTEvYXQ5MXNhbTl4 NS5jCj4gaW5kZXggYWFjOTlkNjk5NTY4Li5mMTM3NTZiNDA3ZTIgMTAwNjQ0Cj4gLS0tIGEvZHJp dmVycy9jbGsvYXQ5MS9hdDkxc2FtOXg1LmMKPiArKysgYi9kcml2ZXJzL2Nsay9hdDkxL2F0OTFz YW05eDUuYwo+IEBAIC0xNTEsNyArMTUxLDcgQEAgc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05 eDVfcG1jX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCj4gIAkJcmV0dXJuOwo+ICAKPiAg CWF0OTFzYW05eDVfcG1jID0gcG1jX2RhdGFfYWxsb2NhdGUoUE1DX01BSU4gKyAxLAo+IC0JCQkJ CSAgIG5jayhhdDkxc2FtOXg1X3N5c3RlbWNrKSwgMzEsIDApOwo+ICsJCQkJCSAgIG5jayhhdDkx c2FtOXg1X3N5c3RlbWNrKSwgMzEsIDAsIDIpOwo+ICAJaWYgKCFhdDkxc2FtOXg1X3BtYykKPiAg CQlyZXR1cm47Cj4gIAo+IEBAIC0yMjcsNiArMjI3LDggQEAgc3RhdGljIHZvaWQgX19pbml0IGF0 OTFzYW05eDVfcG1jX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCj4gIAkJCQkJCSAgICAm YXQ5MXNhbTl4NV9wcm9ncmFtbWFibGVfbGF5b3V0KTsKPiAgCQlpZiAoSVNfRVJSKGh3KSkKPiAg CQkJZ290byBlcnJfZnJlZTsKPiArCj4gKwkJYXQ5MXNhbTl4NV9wbWMtPnBjaHdzW2ldID0gaHc7 Cj4gIAl9Cj4gIAo+ICAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXQ5MXNhbTl4NV9zeXN0 ZW1jayk7IGkrKykgewo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL3BtYy5jIGIvZHJp dmVycy9jbGsvYXQ5MS9wbWMuYwo+IGluZGV4IGFjNDZlYTFiOWZkYS4uOGExNTc3ZTJjMmZkIDEw MDY0NAo+IC0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvcG1jLmMKPiArKysgYi9kcml2ZXJzL2Nsay9h dDkxL3BtYy5jCj4gQEAgLTY3LDYgKzY3LDEwIEBAIHN0cnVjdCBjbGtfaHcgKm9mX2Nsa19od19w bWNfZ2V0KHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmNsa3NwZWMsIHZvaWQgKmRhdGEpCj4gIAkJ aWYgKGlkeCA8IHBtY19kYXRhLT5uZ2NrKQo+ICAJCQlyZXR1cm4gcG1jX2RhdGEtPmdod3NbaWR4 XTsKPiAgCQlicmVhazsKPiArCWNhc2UgUE1DX1RZUEVfUFJPR1JBTU1BQkxFOgo+ICsJCWlmIChp ZHggPCBwbWNfZGF0YS0+bnBjaykKPiArCQkJcmV0dXJuIHBtY19kYXRhLT5wY2h3c1tpZHhdOwo+ ICsJCWJyZWFrOwo+ICAJZGVmYXVsdDoKPiAgCQlicmVhazsKPiAgCX0KPiBAQCAtNzcsOSArODEs MTAgQEAgc3RydWN0IGNsa19odyAqb2ZfY2xrX2h3X3BtY19nZXQoc3RydWN0IG9mX3BoYW5kbGVf YXJncyAqY2xrc3BlYywgdm9pZCAqZGF0YSkKPiAgfQo+ICAKPiAgc3RydWN0IHBtY19kYXRhICpw bWNfZGF0YV9hbGxvY2F0ZSh1bnNpZ25lZCBpbnQgbmNvcmUsIHVuc2lnbmVkIGludCBuc3lzdGVt LAo+IC0JCQkJICAgdW5zaWduZWQgaW50IG5wZXJpcGgsIHVuc2lnbmVkIGludCBuZ2NrKQo+ICsJ CQkJICAgdW5zaWduZWQgaW50IG5wZXJpcGgsIHVuc2lnbmVkIGludCBuZ2NrLAo+ICsJCQkJICAg dW5zaWduZWQgaW50IG5wY2spCj4gIHsKPiAtCXVuc2lnbmVkIGludCBudW1fY2xrcyA9IG5jb3Jl ICsgbnN5c3RlbSArIG5wZXJpcGggKyBuZ2NrOwo+ICsJdW5zaWduZWQgaW50IG51bV9jbGtzID0g bmNvcmUgKyBuc3lzdGVtICsgbnBlcmlwaCArIG5nY2sgKyBucGNrOwo+ICAJc3RydWN0IHBtY19k YXRhICpwbWNfZGF0YTsKPiAgCj4gIAlwbWNfZGF0YSA9IGt6YWxsb2Moc3RydWN0X3NpemUocG1j X2RhdGEsIGh3dGFibGUsIG51bV9jbGtzKSwKPiBAQCAtOTksNiArMTA0LDkgQEAgc3RydWN0IHBt Y19kYXRhICpwbWNfZGF0YV9hbGxvY2F0ZSh1bnNpZ25lZCBpbnQgbmNvcmUsIHVuc2lnbmVkIGlu dCBuc3lzdGVtLAo+ICAJcG1jX2RhdGEtPm5nY2sgPSBuZ2NrOwo+ICAJcG1jX2RhdGEtPmdod3Mg PSBwbWNfZGF0YS0+cGh3cyArIG5wZXJpcGg7Cj4gIAo+ICsJcG1jX2RhdGEtPm5wY2sgPSBucGNr Owo+ICsJcG1jX2RhdGEtPnBjaHdzID0gcG1jX2RhdGEtPmdod3MgKyBuZ2NrOwo+ICsKPiAgCXJl dHVybiBwbWNfZGF0YTsKPiAgfQo+ICAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9w bWMuaCBiL2RyaXZlcnMvY2xrL2F0OTEvcG1jLmgKPiBpbmRleCBmYzNlZjc3MmI5ZDkuLmRmNjE2 ZjI5MzdlNyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2Nsay9hdDkxL3BtYy5oCj4gKysrIGIvZHJp dmVycy9jbGsvYXQ5MS9wbWMuaAo+IEBAIC0yNCw2ICsyNCw4IEBAIHN0cnVjdCBwbWNfZGF0YSB7 Cj4gIAlzdHJ1Y3QgY2xrX2h3ICoqcGh3czsKPiAgCXVuc2lnbmVkIGludCBuZ2NrOwo+ICAJc3Ry dWN0IGNsa19odyAqKmdod3M7Cj4gKwl1bnNpZ25lZCBpbnQgbnBjazsKPiArCXN0cnVjdCBjbGtf aHcgKipwY2h3czsKPiAgCj4gIAlzdHJ1Y3QgY2xrX2h3ICpod3RhYmxlW107Cj4gIH07Cj4gQEAg LTk2LDcgKzk4LDggQEAgc3RydWN0IGNsa19wY3JfbGF5b3V0IHsKPiAgI2RlZmluZSBuZGNrKGEs IHMpIChhW3MgLSAxXS5pZCArIDEpCj4gICNkZWZpbmUgbmNrKGEpIChhW0FSUkFZX1NJWkUoYSkg LSAxXS5pZCArIDEpCj4gIHN0cnVjdCBwbWNfZGF0YSAqcG1jX2RhdGFfYWxsb2NhdGUodW5zaWdu ZWQgaW50IG5jb3JlLCB1bnNpZ25lZCBpbnQgbnN5c3RlbSwKPiAtCQkJCSAgIHVuc2lnbmVkIGlu dCBucGVyaXBoLCB1bnNpZ25lZCBpbnQgbmdjayk7Cj4gKwkJCQkgICB1bnNpZ25lZCBpbnQgbnBl cmlwaCwgdW5zaWduZWQgaW50IG5nY2ssCj4gKwkJCQkgICB1bnNpZ25lZCBpbnQgbnBjayk7Cj4g IAo+ICBpbnQgb2ZfYXQ5MV9nZXRfY2xrX3JhbmdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNv bnN0IGNoYXIgKnByb3BuYW1lLAo+ICAJCQkgIHN0cnVjdCBjbGtfcmFuZ2UgKnJhbmdlKTsKPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9zYW05eDYwLmMgYi9kcml2ZXJzL2Nsay9hdDkx L3NhbTl4NjAuYwo+IGluZGV4IGE3ZDRmNjQ4ZGIyNi4uZGIxNGUwNDI3YzdmIDEwMDY0NAo+IC0t LSBhL2RyaXZlcnMvY2xrL2F0OTEvc2FtOXg2MC5jCj4gKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9z YW05eDYwLmMKPiBAQCAtMTg1LDcgKzE4NSw3IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBzYW05eDYw X3BtY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQo+ICAJc2FtOXg2MF9wbWMgPSBwbWNf ZGF0YV9hbGxvY2F0ZShQTUNfTUFJTiArIDEsCj4gIAkJCQkJbmNrKHNhbTl4NjBfc3lzdGVtY2sp LAo+ICAJCQkJCW5jayhzYW05eDYwX3BlcmlwaGNrKSwKPiAtCQkJCQluY2soc2FtOXg2MF9nY2sp KTsKPiArCQkJCQluY2soc2FtOXg2MF9nY2spLCA4KTsKPiAgCWlmICghc2FtOXg2MF9wbWMpCj4g IAkJcmV0dXJuOwo+ICAKPiBAQCAtMjU1LDYgKzI1NSw4IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBz YW05eDYwX3BtY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQo+ICAJCQkJCQkgICAgJnNh bTl4NjBfcHJvZ3JhbW1hYmxlX2xheW91dCk7Cj4gIAkJaWYgKElTX0VSUihodykpCj4gIAkJCWdv dG8gZXJyX2ZyZWU7Cj4gKwo+ICsJCXNhbTl4NjBfcG1jLT5wY2h3c1tpXSA9IGh3Owo+ICAJfQo+ ICAKPiAgCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNhbTl4NjBfc3lzdGVtY2spOyBpKysp IHsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9zYW1hNWQyLmMgYi9kcml2ZXJzL2Ns ay9hdDkxL3NhbWE1ZDIuYwo+IGluZGV4IGIyNTYwNjcwZTVhZi4uYWU1ZTgzY2FkYjNkIDEwMDY0 NAo+IC0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvc2FtYTVkMi5jCj4gKysrIGIvZHJpdmVycy9jbGsv YXQ5MS9zYW1hNWQyLmMKPiBAQCAtMTY5LDcgKzE2OSw3IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBz YW1hNWQyX3BtY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQo+ICAJc2FtYTVkMl9wbWMg PSBwbWNfZGF0YV9hbGxvY2F0ZShQTUNfSTJTMV9NVVggKyAxLAo+ICAJCQkJCW5jayhzYW1hNWQy X3N5c3RlbWNrKSwKPiAgCQkJCQluY2soc2FtYTVkMl9wZXJpcGgzMmNrKSwKPiAtCQkJCQluY2so c2FtYTVkMl9nY2spKTsKPiArCQkJCQluY2soc2FtYTVkMl9nY2spLCAzKTsKPiAgCWlmICghc2Ft YTVkMl9wbWMpCj4gIAkJcmV0dXJuOwo+ICAKPiBAQCAtMjY3LDYgKzI2Nyw4IEBAIHN0YXRpYyB2 b2lkIF9faW5pdCBzYW1hNWQyX3BtY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQo+ICAJ CQkJCQkgICAgJnNhbWE1ZDJfcHJvZ3JhbW1hYmxlX2xheW91dCk7Cj4gIAkJaWYgKElTX0VSUiho dykpCj4gIAkJCWdvdG8gZXJyX2ZyZWU7Cj4gKwo+ICsJCXNhbWE1ZDJfcG1jLT5wY2h3c1tpXSA9 IGh3Owo+ICAJfQo+ICAKPiAgCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNhbWE1ZDJfc3lz dGVtY2spOyBpKyspIHsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9zYW1hNWQzLmMg Yi9kcml2ZXJzL2Nsay9hdDkxL3NhbWE1ZDMuYwo+IGluZGV4IDg4NTA2ZjkwOWMwOC4uNTA3ZWVm Njc5N2YxIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvc2FtYTVkMy5jCj4gKysrIGIv ZHJpdmVycy9jbGsvYXQ5MS9zYW1hNWQzLmMKPiBAQCAtMTI3LDcgKzEyNyw3IEBAIHN0YXRpYyB2 b2lkIF9faW5pdCBzYW1hNWQzX3BtY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQo+ICAK PiAgCXNhbWE1ZDNfcG1jID0gcG1jX2RhdGFfYWxsb2NhdGUoUE1DX01BSU4gKyAxLAo+ICAJCQkJ CW5jayhzYW1hNWQzX3N5c3RlbWNrKSwKPiAtCQkJCQluY2soc2FtYTVkM19wZXJpcGhjayksIDAp Owo+ICsJCQkJCW5jayhzYW1hNWQzX3BlcmlwaGNrKSwgMCwgMyk7Cj4gIAlpZiAoIXNhbWE1ZDNf cG1jKQo+ICAJCXJldHVybjsKPiAgCj4gQEAgLTIwMSw2ICsyMDEsOCBAQCBzdGF0aWMgdm9pZCBf X2luaXQgc2FtYTVkM19wbWNfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKPiAgCQkJCQkJ ICAgICZhdDkxc2FtOXg1X3Byb2dyYW1tYWJsZV9sYXlvdXQpOwo+ICAJCWlmIChJU19FUlIoaHcp KQo+ICAJCQlnb3RvIGVycl9mcmVlOwo+ICsKPiArCQlzYW1hNWQzX3BtYy0+cGNod3NbaV0gPSBo dzsKPiAgCX0KPiAgCj4gIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzYW1hNWQzX3N5c3Rl bWNrKTsgaSsrKSB7Cj4gQEAgLTIzMSw3ICsyMzMsNyBAQCBzdGF0aWMgdm9pZCBfX2luaXQgc2Ft YTVkM19wbWNfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKPiAgCXJldHVybjsKPiAgCj4g IGVycl9mcmVlOgo+IC0JcG1jX2RhdGFfZnJlZShzYW1hNWQzX3BtYyk7Cj4gKwlrZnJlZShzYW1h NWQzX3BtYyk7Cj4gIH0KPiAgLyoKPiAgICogVGhlIFRDQiBpcyB1c2VkIGFzIHRoZSBjbG9ja3Nv dXJjZSBzbyBpdHMgY2xvY2sgaXMgbmVlZGVkIGVhcmx5LiBUaGlzIG1lYW5zCj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvY2xrL2F0OTEvc2FtYTVkNC5jIGIvZHJpdmVycy9jbGsvYXQ5MS9zYW1hNWQ0 LmMKPiBpbmRleCA0Y2E5YTQ2MTk1MDAuLjgwNjkyOTAyYjRlNCAxMDA2NDQKPiAtLS0gYS9kcml2 ZXJzL2Nsay9hdDkxL3NhbWE1ZDQuYwo+ICsrKyBiL2RyaXZlcnMvY2xrL2F0OTEvc2FtYTVkNC5j Cj4gQEAgLTE0Miw3ICsxNDIsNyBAQCBzdGF0aWMgdm9pZCBfX2luaXQgc2FtYTVkNF9wbWNfc2V0 dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKPiAgCj4gIAlzYW1hNWQ0X3BtYyA9IHBtY19kYXRh X2FsbG9jYXRlKFBNQ19NQ0syICsgMSwKPiAgCQkJCQluY2soc2FtYTVkNF9zeXN0ZW1jayksCj4g LQkJCQkJbmNrKHNhbWE1ZDRfcGVyaXBoMzJjayksIDApOwo+ICsJCQkJCW5jayhzYW1hNWQ0X3Bl cmlwaDMyY2spLCAwLCAzKTsKPiAgCWlmICghc2FtYTVkNF9wbWMpCj4gIAkJcmV0dXJuOwo+ICAK PiBAQCAtMjI0LDYgKzIyNCw4IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBzYW1hNWQ0X3BtY19zZXR1 cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQo+ICAJCQkJCQkgICAgJmF0OTFzYW05eDVfcHJvZ3Jh bW1hYmxlX2xheW91dCk7Cj4gIAkJaWYgKElTX0VSUihodykpCj4gIAkJCWdvdG8gZXJyX2ZyZWU7 Cj4gKwo+ICsJCXNhbWE1ZDRfcG1jLT5wY2h3c1tpXSA9IGh3Owo+ICAJfQo+ICAKPiAgCWZvciAo aSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNhbWE1ZDRfc3lzdGVtY2spOyBpKyspIHsKPiBkaWZmIC0t Z2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9hdDkxLmggYi9pbmNsdWRlL2R0LWJpbmRp bmdzL2Nsb2NrL2F0OTEuaAo+IGluZGV4IDM4YjU1NTQxNTNjOC4uYzNmNGFhNmEyZDI5IDEwMDY0 NAo+IC0tLSBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svYXQ5MS5oCj4gKysrIGIvaW5jbHVk ZS9kdC1iaW5kaW5ncy9jbG9jay9hdDkxLmgKPiBAQCAtMTIsNiArMTIsNyBAQAo+ICAjZGVmaW5l IFBNQ19UWVBFX1NZU1RFTQkJMQo+ICAjZGVmaW5lIFBNQ19UWVBFX1BFUklQSEVSQUwJMgo+ICAj ZGVmaW5lIFBNQ19UWVBFX0dDSwkJMwo+ICsjZGVmaW5lIFBNQ19UWVBFX1BST0dSQU1NQUJMRQk0 Cj4gIAo+ICAjZGVmaW5lIFBNQ19TTE9XCQkwCj4gICNkZWZpbmUgUE1DX01DSwkJCTEKPiAtLSAK PiAyLjIwLjEKPiAKCi0tIApBbGV4YW5kcmUgQmVsbG9uaSwgQm9vdGxpbgpFbWJlZGRlZCBMaW51 eCBhbmQgS2VybmVsIGVuZ2luZWVyaW5nCmh0dHBzOi8vYm9vdGxpbi5jb20KCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFp bGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlz dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK