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=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_2 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 85D15C3A59E for ; Sat, 24 Aug 2019 10:35:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5781A20874 for ; Sat, 24 Aug 2019 10:35:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727010AbfHXKfY convert rfc822-to-8bit (ORCPT ); Sat, 24 Aug 2019 06:35:24 -0400 Received: from relay9-d.mail.gandi.net ([217.70.183.199]:48539 "EHLO relay9-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726966AbfHXKfY (ORCPT ); Sat, 24 Aug 2019 06:35:24 -0400 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay9-d.mail.gandi.net (Postfix) with ESMTPSA id 78EFCFF803; Sat, 24 Aug 2019 10:35:19 +0000 (UTC) Date: Sat, 24 Aug 2019 12:35:12 +0200 From: Miquel Raynal To: Stephen Boyd Cc: Michael Turquette , Russell King , linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Thomas Petazzoni , Antoine Tenart , Maxime Chevallier , Gregory Clement , Nadav Haklai Subject: Re: [PATCH v5 1/4] clk: core: link consumer with clock driver Message-ID: <20190824123512.24c94ca1@xps13> In-Reply-To: <20190815000301.3ABAF2086C@mail.kernel.org> References: <20190521125114.20357-1-miquel.raynal@bootlin.com> <20190521125114.20357-2-miquel.raynal@bootlin.com> <20190815000301.3ABAF2086C@mail.kernel.org> Organization: Bootlin X-Mailer: Claws Mail 3.17.3 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org Hi Stephen, Stephen Boyd wrote on Wed, 14 Aug 2019 17:03:00 -0700: > Quoting Miquel Raynal (2019-05-21 05:51:10) > > One major concern when, for instance, suspending/resuming a platform > > is to never access registers before the underlying clock has been > > resumed, otherwise most of the time the kernel will just crash. One > > solution is to use syscore operations when registering clock drivers > > suspend/resume callbacks. One problem of using syscore_ops is that the > > suspend/resume scheduling will depend on the order of the > > registrations, which brings (unacceptable) randomness in the process. > > > > A feature called device links has been introduced to handle such > > situation. It creates dependencies between consumers and providers, > > enforcing e.g. the suspend/resume order when needed. Such feature is > > already in use for regulators. > > > > Add device links support in the clock subsystem by creating/deleting > > the links at get/put time. > > > > Example of a boot (ESPRESSObin, A3700 SoC) with devices linked to clocks: > > > > marvell-armada-3700-tbg-clock d0013200.tbg: Linked as a consumer to d0013800.pinctrl:xtal-clk > > marvell-armada-3700-tbg-clock d0013200.tbg: Dropping the link to d0013800.pinctrl:xtal-clk > > marvell-armada-3700-tbg-clock d0013200.tbg: Linked as a consumer to d0013800.pinctrl:xtal-clk > > marvell-armada-3700-periph-clock d0013000.nb-periph-clk: Linked as a consumer to d0013200.tbg > > marvell-armada-3700-periph-clock d0013000.nb-periph-clk: Linked as a consumer to d0013800.pinctrl:xtal-clk > > marvell-armada-3700-periph-clock d0018000.sb-periph-clk: Linked as a consumer to d0013200.tbg > > mvneta d0030000.ethernet: Linked as a consumer to d0018000.sb-periph-clk > > xhci-hcd d0058000.usb: Linked as a consumer to d0018000.sb-periph-clk > > xenon-sdhci d00d0000.sdhci: Linked as a consumer to d0013000.nb-periph-clk > > xenon-sdhci d00d0000.sdhci: Dropping the link to d0013000.nb-periph-clk > > mvebu-uart d0012000.serial: Linked as a consumer to d0013800.pinctrl:xtal-clk > > advk-pcie d0070000.pcie: Linked as a consumer to d0018000.sb-periph-clk > > xenon-sdhci d00d0000.sdhci: Linked as a consumer to d0013000.nb-periph-clk > > xenon-sdhci d00d0000.sdhci: Linked as a consumer to regulator.1 > > cpu cpu0: Linked as a consumer to d0013000.nb-periph-clk > > cpu cpu0: Dropping the link to d0013000.nb-periph-clk > > cpu cpu0: Linked as a consumer to d0013000.nb-periph-clk > > > > Signed-off-by: Miquel Raynal > > --- > > This patch doesn't apply. Things have changed upstream. > > > > > diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c > > index ec6f04dcf5e6..e6b84ab43f9f 100644 > > --- a/drivers/clk/clk.c > > +++ b/drivers/clk/clk.c > > @@ -1676,6 +1710,8 @@ static void clk_reparent(struct clk_core *core, struct clk_core *new_parent) > > > > if (was_orphan != becomes_orphan) > > clk_core_update_orphan_status(core, becomes_orphan); > > + > > + clk_link_hierarchy(core, new_parent); > > This isn't going to work. Strange, I didn't had that problem (on Marvell platforms). > > BUG: sleeping function called from invalid context at kernel/locking/mutex.c:909 > in_atomic(): 1, irqs_disabled(): 128, pid: 1, name: swapper/0 > 3 locks held by swapper/0/1: > #0: (____ptrval____) (&dev->mutex){....}, at: __device_driver_lock+0x40/0x4c > #1: (____ptrval____) (prepare_lock){+.+.}, at: clk_prepare_lock+0x18/0x94 > #2: (____ptrval____) (enable_lock){....}, at: clk_enable_lock+0x34/0xdc > irq event stamp: 311516 > hardirqs last enabled at (311515): [] _raw_spin_unlock_irqrestore+0x54/0x90 > hardirqs last disabled at (311516): [] clk_enable_lock+0x28/0xdc > softirqs last enabled at (311348): [] __do_softirq+0x4cc/0x514 > softirqs last disabled at (311341): [] irq_exit+0xd8/0xf8 > CPU: 4 PID: 1 Comm: swapper/0 Tainted: G W 5.3.0-rc4-00005-g6be06bbec80ef #10 > Hardware name: Google Cheza (rev3+) (DT) > Call trace: > dump_backtrace+0x0/0x13c > show_stack+0x20/0x2c > dump_stack+0xc4/0x12c > ___might_sleep+0x1b4/0x1c4 > __might_sleep+0x50/0x88 > __mutex_lock_common+0x5c/0xbfc > mutex_lock_nested+0x40/0x50 > device_link_add+0x88/0x3ac > clk_reparent+0xc4/0x114 > __clk_set_parent_before+0x74/0x90 > clk_change_rate+0x98/0x854 > clk_core_set_rate_nolock+0x1b0/0x21c > clk_set_rate+0x3c/0x6c > of_clk_set_defaults+0x29c/0x364 > platform_drv_probe+0x28/0xb0 > really_probe+0x130/0x2b4 > driver_probe_device+0x64/0xfc > device_driver_attach+0x4c/0x6c > __driver_attach+0xb0/0xc4 > bus_for_each_dev+0x84/0xcc > driver_attach+0x2c/0x38 > bus_add_driver+0xfc/0x1d0 > driver_register+0x64/0xf0 > __platform_driver_register+0x4c/0x58 > msm_drm_register+0x5c/0x60 > do_one_initcall+0x1e0/0x478 > do_initcall_level+0x21c/0x25c > do_basic_setup+0x60/0x78 > kernel_init_freeable+0x128/0x1b0 > kernel_init+0x14/0x100 > ret_from_fork+0x10/0x18 > > > } else { > > hlist_add_head(&core->child_node, &clk_orphan_list); > > if (!was_orphan) > > @@ -2402,6 +2438,8 @@ __clk_init_parent(struct clk_core *core, bool update_orphan) > > if (!parent_hw) > > return NULL; > > > > + clk_link_hierarchy(core, parent_hw->core); > > + > > This is the hunk that doesn't apply anymore. > > > return parent_hw->core; > > } > > > > The general thought is that it would be good to _not_ call the device > link APIs from deep within the clk parent changing code or even parent > initialization code. It would be better to make device links based on > the possible parents of a clk controller when the clk is registered and > after the clk prepare lock (i.e. the registration lock) is dropped. Is > this possible? The problem is that we're deeply nested in locks that are > already hard to reason about and get out from underneath. I don't want > to get into some sort of ABBA deadlock scenario with the PM core. The > usage of runtime PM in the clk framework is probably busted right now > because it is used under the prepare lock. Ugh. I understand. > > Is it necessary to add the device links between different clk > controllers either? I mean, is it necessary to create links between clks > and their parents right now? Maybe we can take the easy way out and > just make links between devices that call clk_get() and the devices that > provide those clks (the consumer side). I suppose you may want to order > suspend/resume of a device with the parent clks of some clk that is > acquired from clk_get(). I hope it isn't required though, because this > is a problem to do with ordering suspend/resume of the clk tree itself, > which isn't really solved at all. What you propose is, IIRC what I sent in the early version. Here is what Maxime Ripard pointed with this early implementation: I think this doesn't address all the cases. In your case, where you have one consumer that is not a clock, and one provider that is a clock, it works just fine. However, if you have clocks providers chained, for example with one oscillator, a clock controller, and a device, the link will be created between the device and the controller, but there will be no link between the controller and the oscillator. > > We probably need to solve that by doing something clk provider specific > in the clk framework to figure out a way for device drivers that provide > clks to get callbacks to suspend/resume clks in the clk tree in some > sort of topo-sorted order. That way we can traverse the clk tree and > call down into provider drivers for each clk it registered to do things > like restore the clk frequency or clk enable/prepare state, etc. It > needs to be done in a certain order and it's not possible to flatten > that order into a sequential list of providers (that correspond 1:1 with > devices) given that there are loops between providers. Ok so this would be a clocks internal mechanism to handle clock dependencies within the clock tree, with device links to handle dependencies with external consumers and dependencies. > > But from the perspective of a consumer driver like PCI, I don't see why > it needs to care about the clk tree suspend/resume ordering details. It > really only cares that the clk it's consuming, at the edge of the tree, > is resumed before the consumer itself, PCI, is resumed. However the > dependencies of that clk it's consuming is managed, be it with device > links or something clk framework specific, doesn't matter to the PCI > driver. And other clks that are parents or grandparents of the clk > consumed by PCI could have device link dependencies themselves, on > something like an i2c controller or such. Even then, we don't need to > use device links in the clk tree to describe ordering between clks. We > can do it without device links and break the device link chain when it > crosses the clk tree. > > PCI -[device link]-> PCI leaf clk provider -[clk framework ordering black box]-> parent of leaf clk -[device link]-> i2c controller > I get your point. Well, too bad that Lorenzo refused the PCI series because of this one because PCIe S2RAM won't be supported at all even if someday someone contributes the "framework ordering black box" you are talking about, anyway I will not have the time to work on it I am sorry. Thanks, Miquèl 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=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_2 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 0829CC3A59E for ; Sat, 24 Aug 2019 10:35:46 +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 CAFAC20850 for ; Sat, 24 Aug 2019 10:35:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="ub9UActc" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CAFAC20850 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:MIME-Version:References:In-Reply-To: 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=TIF+75MqigGu7vUXbS4p+fwVGaLYLfZYLfvtamb7fzw=; b=ub9UActcVk5tgF MAulcaapBlrLGtKi/RO91WReM50Fo9prSJBvlGIfXwe/J5hdYOhPDqQmV/2GWh4/UcQiCeavF28RB 3W+COVujI+zgJgC36xgtI5YrSMbohajvg8k7AduK7I+AojjugO+9CFUANtaTv9PPf9Bg8zQ2oAWLU HQdwGGfsBB7ZNzOQX0TJCmhik+e6Y0vhi1edVS8zxSrwhKdwUMxNSDsWfB4q2ODSovq1SKFbdxKgJ WOcpRYeZ+xXPJozsZ4Q8hz6hRNw62Dnzf40fvIcKJhZVhpSRtz/uypjSW1E0/QxGSIO723Xe9EVMC BH6GGvc+NJp44kJmQ2XA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1i1TOQ-0005cK-Ol; Sat, 24 Aug 2019 10:35:34 +0000 Received: from relay9-d.mail.gandi.net ([217.70.183.199]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1i1TOL-0005bV-ML for linux-arm-kernel@lists.infradead.org; Sat, 24 Aug 2019 10:35:32 +0000 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay9-d.mail.gandi.net (Postfix) with ESMTPSA id 78EFCFF803; Sat, 24 Aug 2019 10:35:19 +0000 (UTC) Date: Sat, 24 Aug 2019 12:35:12 +0200 From: Miquel Raynal To: Stephen Boyd Subject: Re: [PATCH v5 1/4] clk: core: link consumer with clock driver Message-ID: <20190824123512.24c94ca1@xps13> In-Reply-To: <20190815000301.3ABAF2086C@mail.kernel.org> References: <20190521125114.20357-1-miquel.raynal@bootlin.com> <20190521125114.20357-2-miquel.raynal@bootlin.com> <20190815000301.3ABAF2086C@mail.kernel.org> Organization: Bootlin X-Mailer: Claws Mail 3.17.3 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190824_033530_032532_CBFBDB6D X-CRM114-Status: GOOD ( 36.65 ) 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: Gregory Clement , Antoine Tenart , Michael Turquette , linux-kernel@vger.kernel.org, Russell King , Nadav Haklai , Thomas Petazzoni , Maxime Chevallier , 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 SGkgU3RlcGhlbiwKClN0ZXBoZW4gQm95ZCA8c2JveWRAa2VybmVsLm9yZz4gd3JvdGUgb24gV2Vk LCAxNCBBdWcgMjAxOSAxNzowMzowMAotMDcwMDoKCj4gUXVvdGluZyBNaXF1ZWwgUmF5bmFsICgy MDE5LTA1LTIxIDA1OjUxOjEwKQo+ID4gT25lIG1ham9yIGNvbmNlcm4gd2hlbiwgZm9yIGluc3Rh bmNlLCBzdXNwZW5kaW5nL3Jlc3VtaW5nIGEgcGxhdGZvcm0KPiA+IGlzIHRvIG5ldmVyIGFjY2Vz cyByZWdpc3RlcnMgYmVmb3JlIHRoZSB1bmRlcmx5aW5nIGNsb2NrIGhhcyBiZWVuCj4gPiByZXN1 bWVkLCBvdGhlcndpc2UgbW9zdCBvZiB0aGUgdGltZSB0aGUga2VybmVsIHdpbGwganVzdCBjcmFz aC4gT25lCj4gPiBzb2x1dGlvbiBpcyB0byB1c2Ugc3lzY29yZSBvcGVyYXRpb25zIHdoZW4gcmVn aXN0ZXJpbmcgY2xvY2sgZHJpdmVycwo+ID4gc3VzcGVuZC9yZXN1bWUgY2FsbGJhY2tzLiBPbmUg cHJvYmxlbSBvZiB1c2luZyBzeXNjb3JlX29wcyBpcyB0aGF0IHRoZQo+ID4gc3VzcGVuZC9yZXN1 bWUgc2NoZWR1bGluZyB3aWxsIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgdGhlCj4gPiByZWdpc3Ry YXRpb25zLCB3aGljaCBicmluZ3MgKHVuYWNjZXB0YWJsZSkgcmFuZG9tbmVzcyBpbiB0aGUgcHJv Y2Vzcy4KPiA+IAo+ID4gQSBmZWF0dXJlIGNhbGxlZCBkZXZpY2UgbGlua3MgaGFzIGJlZW4gaW50 cm9kdWNlZCB0byBoYW5kbGUgc3VjaAo+ID4gc2l0dWF0aW9uLiBJdCBjcmVhdGVzIGRlcGVuZGVu Y2llcyBiZXR3ZWVuIGNvbnN1bWVycyBhbmQgcHJvdmlkZXJzLAo+ID4gZW5mb3JjaW5nIGUuZy4g dGhlIHN1c3BlbmQvcmVzdW1lIG9yZGVyIHdoZW4gbmVlZGVkLiBTdWNoIGZlYXR1cmUgaXMKPiA+ IGFscmVhZHkgaW4gdXNlIGZvciByZWd1bGF0b3JzLgo+ID4gCj4gPiBBZGQgZGV2aWNlIGxpbmtz IHN1cHBvcnQgaW4gdGhlIGNsb2NrIHN1YnN5c3RlbSBieSBjcmVhdGluZy9kZWxldGluZwo+ID4g dGhlIGxpbmtzIGF0IGdldC9wdXQgdGltZS4KPiA+IAo+ID4gRXhhbXBsZSBvZiBhIGJvb3QgKEVT UFJFU1NPYmluLCBBMzcwMCBTb0MpIHdpdGggZGV2aWNlcyBsaW5rZWQgdG8gY2xvY2tzOgo+ID4g Cj4gPiBtYXJ2ZWxsLWFybWFkYS0zNzAwLXRiZy1jbG9jayBkMDAxMzIwMC50Ymc6IExpbmtlZCBh cyBhIGNvbnN1bWVyIHRvIGQwMDEzODAwLnBpbmN0cmw6eHRhbC1jbGsKPiA+IG1hcnZlbGwtYXJt YWRhLTM3MDAtdGJnLWNsb2NrIGQwMDEzMjAwLnRiZzogRHJvcHBpbmcgdGhlIGxpbmsgdG8gZDAw MTM4MDAucGluY3RybDp4dGFsLWNsawo+ID4gbWFydmVsbC1hcm1hZGEtMzcwMC10YmctY2xvY2sg ZDAwMTMyMDAudGJnOiBMaW5rZWQgYXMgYSBjb25zdW1lciB0byBkMDAxMzgwMC5waW5jdHJsOnh0 YWwtY2xrCj4gPiBtYXJ2ZWxsLWFybWFkYS0zNzAwLXBlcmlwaC1jbG9jayBkMDAxMzAwMC5uYi1w ZXJpcGgtY2xrOiBMaW5rZWQgYXMgYSBjb25zdW1lciB0byBkMDAxMzIwMC50YmcKPiA+IG1hcnZl bGwtYXJtYWRhLTM3MDAtcGVyaXBoLWNsb2NrIGQwMDEzMDAwLm5iLXBlcmlwaC1jbGs6IExpbmtl ZCBhcyBhIGNvbnN1bWVyIHRvIGQwMDEzODAwLnBpbmN0cmw6eHRhbC1jbGsKPiA+IG1hcnZlbGwt YXJtYWRhLTM3MDAtcGVyaXBoLWNsb2NrIGQwMDE4MDAwLnNiLXBlcmlwaC1jbGs6IExpbmtlZCBh cyBhIGNvbnN1bWVyIHRvIGQwMDEzMjAwLnRiZwo+ID4gbXZuZXRhIGQwMDMwMDAwLmV0aGVybmV0 OiBMaW5rZWQgYXMgYSBjb25zdW1lciB0byBkMDAxODAwMC5zYi1wZXJpcGgtY2xrCj4gPiB4aGNp LWhjZCBkMDA1ODAwMC51c2I6IExpbmtlZCBhcyBhIGNvbnN1bWVyIHRvIGQwMDE4MDAwLnNiLXBl cmlwaC1jbGsKPiA+IHhlbm9uLXNkaGNpIGQwMGQwMDAwLnNkaGNpOiBMaW5rZWQgYXMgYSBjb25z dW1lciB0byBkMDAxMzAwMC5uYi1wZXJpcGgtY2xrCj4gPiB4ZW5vbi1zZGhjaSBkMDBkMDAwMC5z ZGhjaTogRHJvcHBpbmcgdGhlIGxpbmsgdG8gZDAwMTMwMDAubmItcGVyaXBoLWNsawo+ID4gbXZl YnUtdWFydCBkMDAxMjAwMC5zZXJpYWw6IExpbmtlZCBhcyBhIGNvbnN1bWVyIHRvIGQwMDEzODAw LnBpbmN0cmw6eHRhbC1jbGsKPiA+IGFkdmstcGNpZSBkMDA3MDAwMC5wY2llOiBMaW5rZWQgYXMg YSBjb25zdW1lciB0byBkMDAxODAwMC5zYi1wZXJpcGgtY2xrCj4gPiB4ZW5vbi1zZGhjaSBkMDBk MDAwMC5zZGhjaTogTGlua2VkIGFzIGEgY29uc3VtZXIgdG8gZDAwMTMwMDAubmItcGVyaXBoLWNs awo+ID4geGVub24tc2RoY2kgZDAwZDAwMDAuc2RoY2k6IExpbmtlZCBhcyBhIGNvbnN1bWVyIHRv IHJlZ3VsYXRvci4xCj4gPiBjcHUgY3B1MDogTGlua2VkIGFzIGEgY29uc3VtZXIgdG8gZDAwMTMw MDAubmItcGVyaXBoLWNsawo+ID4gY3B1IGNwdTA6IERyb3BwaW5nIHRoZSBsaW5rIHRvIGQwMDEz MDAwLm5iLXBlcmlwaC1jbGsKPiA+IGNwdSBjcHUwOiBMaW5rZWQgYXMgYSBjb25zdW1lciB0byBk MDAxMzAwMC5uYi1wZXJpcGgtY2xrCj4gPiAKPiA+IFNpZ25lZC1vZmYtYnk6IE1pcXVlbCBSYXlu YWwgPG1pcXVlbC5yYXluYWxAYm9vdGxpbi5jb20+Cj4gPiAtLS0gIAo+IAo+IFRoaXMgcGF0Y2gg ZG9lc24ndCBhcHBseS4gVGhpbmdzIGhhdmUgY2hhbmdlZCB1cHN0cmVhbS4KPiAKPiA+IAo+ID4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay5jIGIvZHJpdmVycy9jbGsvY2xrLmMKPiA+IGlu ZGV4IGVjNmYwNGRjZjVlNi4uZTZiODRhYjQzZjlmIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9j bGsvY2xrLmMKPiA+ICsrKyBiL2RyaXZlcnMvY2xrL2Nsay5jCj4gPiBAQCAtMTY3Niw2ICsxNzEw LDggQEAgc3RhdGljIHZvaWQgY2xrX3JlcGFyZW50KHN0cnVjdCBjbGtfY29yZSAqY29yZSwgc3Ry dWN0IGNsa19jb3JlICpuZXdfcGFyZW50KQo+ID4gIAo+ID4gICAgICAgICAgICAgICAgIGlmICh3 YXNfb3JwaGFuICE9IGJlY29tZXNfb3JwaGFuKQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAg Y2xrX2NvcmVfdXBkYXRlX29ycGhhbl9zdGF0dXMoY29yZSwgYmVjb21lc19vcnBoYW4pOwo+ID4g Kwo+ID4gKyAgICAgICAgICAgICAgIGNsa19saW5rX2hpZXJhcmNoeShjb3JlLCBuZXdfcGFyZW50 KTsgIAo+IAo+IFRoaXMgaXNuJ3QgZ29pbmcgdG8gd29yay4KClN0cmFuZ2UsIEkgZGlkbid0IGhh ZCB0aGF0IHByb2JsZW0gKG9uIE1hcnZlbGwgcGxhdGZvcm1zKS4KCj4gCj4gIEJVRzogc2xlZXBp bmcgZnVuY3Rpb24gY2FsbGVkIGZyb20gaW52YWxpZCBjb250ZXh0IGF0IGtlcm5lbC9sb2NraW5n L211dGV4LmM6OTA5Cj4gIGluX2F0b21pYygpOiAxLCBpcnFzX2Rpc2FibGVkKCk6IDEyOCwgcGlk OiAxLCBuYW1lOiBzd2FwcGVyLzAKPiAgMyBsb2NrcyBoZWxkIGJ5IHN3YXBwZXIvMC8xOgo+ICAg IzA6IChfX19fcHRydmFsX19fXykgKCZkZXYtPm11dGV4KXsuLi4ufSwgYXQ6IF9fZGV2aWNlX2Ry aXZlcl9sb2NrKzB4NDAvMHg0Ywo+ICAgIzE6IChfX19fcHRydmFsX19fXykgKHByZXBhcmVfbG9j ayl7Ky4rLn0sIGF0OiBjbGtfcHJlcGFyZV9sb2NrKzB4MTgvMHg5NAo+ICAgIzI6IChfX19fcHRy dmFsX19fXykgKGVuYWJsZV9sb2NrKXsuLi4ufSwgYXQ6IGNsa19lbmFibGVfbG9jaysweDM0LzB4 ZGMKPiAgaXJxIGV2ZW50IHN0YW1wOiAzMTE1MTYKPiAgaGFyZGlycXMgbGFzdCAgZW5hYmxlZCBh dCAoMzExNTE1KTogWzxmZmZmZmY5MDFmY2U1YzkwPl0gX3Jhd19zcGluX3VubG9ja19pcnFyZXN0 b3JlKzB4NTQvMHg5MAo+ICBoYXJkaXJxcyBsYXN0IGRpc2FibGVkIGF0ICgzMTE1MTYpOiBbPGZm ZmZmZjkwMWY3M2Q0Njg+XSBjbGtfZW5hYmxlX2xvY2srMHgyOC8weGRjCj4gIHNvZnRpcnFzIGxh c3QgIGVuYWJsZWQgYXQgKDMxMTM0OCk6IFs8ZmZmZmZmOTAxZjI4MTg4Yz5dIF9fZG9fc29mdGly cSsweDRjYy8weDUxNAo+ICBzb2Z0aXJxcyBsYXN0IGRpc2FibGVkIGF0ICgzMTEzNDEpOiBbPGZm ZmZmZjkwMWYyZjg5YWM+XSBpcnFfZXhpdCsweGQ4LzB4ZjgKPiAgQ1BVOiA0IFBJRDogMSBDb21t OiBzd2FwcGVyLzAgVGFpbnRlZDogRyAgICAgICAgVyAgICAgICAgIDUuMy4wLXJjNC0wMDAwNS1n NmJlMDZiYmVjODBlZiAjMTAKPiAgSGFyZHdhcmUgbmFtZTogR29vZ2xlIENoZXphIChyZXYzKykg KERUKQo+ICBDYWxsIHRyYWNlOgo+ICAgZHVtcF9iYWNrdHJhY2UrMHgwLzB4MTNjCj4gICBzaG93 X3N0YWNrKzB4MjAvMHgyYwo+ICAgZHVtcF9zdGFjaysweGM0LzB4MTJjCj4gICBfX19taWdodF9z bGVlcCsweDFiNC8weDFjNAo+ICAgX19taWdodF9zbGVlcCsweDUwLzB4ODgKPiAgIF9fbXV0ZXhf bG9ja19jb21tb24rMHg1Yy8weGJmYwo+ICAgbXV0ZXhfbG9ja19uZXN0ZWQrMHg0MC8weDUwCj4g ICBkZXZpY2VfbGlua19hZGQrMHg4OC8weDNhYwo+ICAgY2xrX3JlcGFyZW50KzB4YzQvMHgxMTQK PiAgIF9fY2xrX3NldF9wYXJlbnRfYmVmb3JlKzB4NzQvMHg5MAo+ICAgY2xrX2NoYW5nZV9yYXRl KzB4OTgvMHg4NTQKPiAgIGNsa19jb3JlX3NldF9yYXRlX25vbG9jaysweDFiMC8weDIxYwo+ICAg Y2xrX3NldF9yYXRlKzB4M2MvMHg2Ywo+ICAgb2ZfY2xrX3NldF9kZWZhdWx0cysweDI5Yy8weDM2 NAo+ICAgcGxhdGZvcm1fZHJ2X3Byb2JlKzB4MjgvMHhiMAo+ICAgcmVhbGx5X3Byb2JlKzB4MTMw LzB4MmI0Cj4gICBkcml2ZXJfcHJvYmVfZGV2aWNlKzB4NjQvMHhmYwo+ICAgZGV2aWNlX2RyaXZl cl9hdHRhY2grMHg0Yy8weDZjCj4gICBfX2RyaXZlcl9hdHRhY2grMHhiMC8weGM0Cj4gICBidXNf Zm9yX2VhY2hfZGV2KzB4ODQvMHhjYwo+ICAgZHJpdmVyX2F0dGFjaCsweDJjLzB4MzgKPiAgIGJ1 c19hZGRfZHJpdmVyKzB4ZmMvMHgxZDAKPiAgIGRyaXZlcl9yZWdpc3RlcisweDY0LzB4ZjAKPiAg IF9fcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKzB4NGMvMHg1OAo+ICAgbXNtX2RybV9yZWdpc3Rl cisweDVjLzB4NjAKPiAgIGRvX29uZV9pbml0Y2FsbCsweDFlMC8weDQ3OAo+ICAgZG9faW5pdGNh bGxfbGV2ZWwrMHgyMWMvMHgyNWMKPiAgIGRvX2Jhc2ljX3NldHVwKzB4NjAvMHg3OAo+ICAga2Vy bmVsX2luaXRfZnJlZWFibGUrMHgxMjgvMHgxYjAKPiAgIGtlcm5lbF9pbml0KzB4MTQvMHgxMDAK PiAgIHJldF9mcm9tX2ZvcmsrMHgxMC8weDE4Cj4gCj4gPiAgICAgICAgIH0gZWxzZSB7Cj4gPiAg ICAgICAgICAgICAgICAgaGxpc3RfYWRkX2hlYWQoJmNvcmUtPmNoaWxkX25vZGUsICZjbGtfb3Jw aGFuX2xpc3QpOwo+ID4gICAgICAgICAgICAgICAgIGlmICghd2FzX29ycGhhbikKPiA+IEBAIC0y NDAyLDYgKzI0MzgsOCBAQCBfX2Nsa19pbml0X3BhcmVudChzdHJ1Y3QgY2xrX2NvcmUgKmNvcmUs IGJvb2wgdXBkYXRlX29ycGhhbikKPiA+ICAgICAgICAgaWYgKCFwYXJlbnRfaHcpCj4gPiAgICAg ICAgICAgICAgICAgcmV0dXJuIE5VTEw7Cj4gPiAgCj4gPiArICAgICAgIGNsa19saW5rX2hpZXJh cmNoeShjb3JlLCBwYXJlbnRfaHctPmNvcmUpOwo+ID4gKyAgCj4gCj4gVGhpcyBpcyB0aGUgaHVu ayB0aGF0IGRvZXNuJ3QgYXBwbHkgYW55bW9yZS4KPiAKPiA+ICAgICAgICAgcmV0dXJuIHBhcmVu dF9ody0+Y29yZTsKPiA+ICB9Cj4gPiAgICAKPiAKPiBUaGUgZ2VuZXJhbCB0aG91Z2h0IGlzIHRo YXQgaXQgd291bGQgYmUgZ29vZCB0byBfbm90XyBjYWxsIHRoZSBkZXZpY2UKPiBsaW5rIEFQSXMg ZnJvbSBkZWVwIHdpdGhpbiB0aGUgY2xrIHBhcmVudCBjaGFuZ2luZyBjb2RlIG9yIGV2ZW4gcGFy ZW50Cj4gaW5pdGlhbGl6YXRpb24gY29kZS4gSXQgd291bGQgYmUgYmV0dGVyIHRvIG1ha2UgZGV2 aWNlIGxpbmtzIGJhc2VkIG9uCj4gdGhlIHBvc3NpYmxlIHBhcmVudHMgb2YgYSBjbGsgY29udHJv bGxlciB3aGVuIHRoZSBjbGsgaXMgcmVnaXN0ZXJlZCBhbmQKPiBhZnRlciB0aGUgY2xrIHByZXBh cmUgbG9jayAoaS5lLiB0aGUgcmVnaXN0cmF0aW9uIGxvY2spIGlzIGRyb3BwZWQuIElzCj4gdGhp cyBwb3NzaWJsZT8gVGhlIHByb2JsZW0gaXMgdGhhdCB3ZSdyZSBkZWVwbHkgbmVzdGVkIGluIGxv Y2tzIHRoYXQgYXJlCj4gYWxyZWFkeSBoYXJkIHRvIHJlYXNvbiBhYm91dCBhbmQgZ2V0IG91dCBm cm9tIHVuZGVybmVhdGguIEkgZG9uJ3Qgd2FudAo+IHRvIGdldCBpbnRvIHNvbWUgc29ydCBvZiBB QkJBIGRlYWRsb2NrIHNjZW5hcmlvIHdpdGggdGhlIFBNIGNvcmUuIFRoZQo+IHVzYWdlIG9mIHJ1 bnRpbWUgUE0gaW4gdGhlIGNsayBmcmFtZXdvcmsgaXMgcHJvYmFibHkgYnVzdGVkIHJpZ2h0IG5v dwo+IGJlY2F1c2UgaXQgaXMgdXNlZCB1bmRlciB0aGUgcHJlcGFyZSBsb2NrLiBVZ2guCgpJIHVu ZGVyc3RhbmQuCgo+IAo+IElzIGl0IG5lY2Vzc2FyeSB0byBhZGQgdGhlIGRldmljZSBsaW5rcyBi ZXR3ZWVuIGRpZmZlcmVudCBjbGsKPiBjb250cm9sbGVycyBlaXRoZXI/IEkgbWVhbiwgaXMgaXQg bmVjZXNzYXJ5IHRvIGNyZWF0ZSBsaW5rcyBiZXR3ZWVuIGNsa3MKPiBhbmQgdGhlaXIgcGFyZW50 cyByaWdodCBub3c/ICBNYXliZSB3ZSBjYW4gdGFrZSB0aGUgZWFzeSB3YXkgb3V0IGFuZAo+IGp1 c3QgbWFrZSBsaW5rcyBiZXR3ZWVuIGRldmljZXMgdGhhdCBjYWxsIGNsa19nZXQoKSBhbmQgdGhl IGRldmljZXMgdGhhdAo+IHByb3ZpZGUgdGhvc2UgY2xrcyAodGhlIGNvbnN1bWVyIHNpZGUpLiBJ IHN1cHBvc2UgeW91IG1heSB3YW50IHRvIG9yZGVyCj4gc3VzcGVuZC9yZXN1bWUgb2YgYSBkZXZp Y2Ugd2l0aCB0aGUgcGFyZW50IGNsa3Mgb2Ygc29tZSBjbGsgdGhhdCBpcwo+IGFjcXVpcmVkIGZy b20gY2xrX2dldCgpLiBJIGhvcGUgaXQgaXNuJ3QgcmVxdWlyZWQgdGhvdWdoLCBiZWNhdXNlIHRo aXMKPiBpcyBhIHByb2JsZW0gdG8gZG8gd2l0aCBvcmRlcmluZyBzdXNwZW5kL3Jlc3VtZSBvZiB0 aGUgY2xrIHRyZWUgaXRzZWxmLAo+IHdoaWNoIGlzbid0IHJlYWxseSBzb2x2ZWQgYXQgYWxsLgoK V2hhdCB5b3UgcHJvcG9zZSBpcywgSUlSQyB3aGF0IEkgc2VudCBpbiB0aGUgZWFybHkgdmVyc2lv bi4gSGVyZSBpcwp3aGF0IE1heGltZSBSaXBhcmQgcG9pbnRlZCB3aXRoIHRoaXMgZWFybHkgaW1w bGVtZW50YXRpb246CgogICAgICAgIEkgdGhpbmsgdGhpcyBkb2Vzbid0IGFkZHJlc3MgYWxsIHRo ZSBjYXNlcy4gSW4geW91ciBjYXNlLCB3aGVyZSB5b3UKICAgICAgICBoYXZlIG9uZSBjb25zdW1l ciB0aGF0IGlzIG5vdCBhIGNsb2NrLCBhbmQgb25lIHByb3ZpZGVyIHRoYXQgaXMgYQogICAgICAg IGNsb2NrLCBpdCB3b3JrcyBqdXN0IGZpbmUuCgogICAgICAgIEhvd2V2ZXIsIGlmIHlvdSBoYXZl IGNsb2NrcyBwcm92aWRlcnMgY2hhaW5lZCwgZm9yIGV4YW1wbGUgd2l0aCBvbmUKICAgICAgICBv c2NpbGxhdG9yLCBhIGNsb2NrIGNvbnRyb2xsZXIsIGFuZCBhIGRldmljZSwgdGhlIGxpbmsgd2ls bCBiZSBjcmVhdGVkCiAgICAgICAgYmV0d2VlbiB0aGUgZGV2aWNlIGFuZCB0aGUgY29udHJvbGxl ciwgYnV0IHRoZXJlIHdpbGwgYmUgbm8gbGluawogICAgICAgIGJldHdlZW4gdGhlIGNvbnRyb2xs ZXIgYW5kIHRoZSBvc2NpbGxhdG9yLgoKPiAKPiBXZSBwcm9iYWJseSBuZWVkIHRvIHNvbHZlIHRo YXQgYnkgZG9pbmcgc29tZXRoaW5nIGNsayBwcm92aWRlciBzcGVjaWZpYwo+IGluIHRoZSBjbGsg ZnJhbWV3b3JrIHRvIGZpZ3VyZSBvdXQgYSB3YXkgZm9yIGRldmljZSBkcml2ZXJzIHRoYXQgcHJv dmlkZQo+IGNsa3MgdG8gZ2V0IGNhbGxiYWNrcyB0byBzdXNwZW5kL3Jlc3VtZSBjbGtzIGluIHRo ZSBjbGsgdHJlZSBpbiBzb21lCj4gc29ydCBvZiB0b3BvLXNvcnRlZCBvcmRlci4gVGhhdCB3YXkg d2UgY2FuIHRyYXZlcnNlIHRoZSBjbGsgdHJlZSBhbmQKPiBjYWxsIGRvd24gaW50byBwcm92aWRl ciBkcml2ZXJzIGZvciBlYWNoIGNsayBpdCByZWdpc3RlcmVkIHRvIGRvIHRoaW5ncwo+IGxpa2Ug cmVzdG9yZSB0aGUgY2xrIGZyZXF1ZW5jeSBvciBjbGsgZW5hYmxlL3ByZXBhcmUgc3RhdGUsIGV0 Yy4gSXQKPiBuZWVkcyB0byBiZSBkb25lIGluIGEgY2VydGFpbiBvcmRlciBhbmQgaXQncyBub3Qg cG9zc2libGUgdG8gZmxhdHRlbgo+IHRoYXQgb3JkZXIgaW50byBhIHNlcXVlbnRpYWwgbGlzdCBv ZiBwcm92aWRlcnMgKHRoYXQgY29ycmVzcG9uZCAxOjEgd2l0aAo+IGRldmljZXMpIGdpdmVuIHRo YXQgdGhlcmUgYXJlIGxvb3BzIGJldHdlZW4gcHJvdmlkZXJzLgoKT2sgc28gdGhpcyB3b3VsZCBi ZSBhIGNsb2NrcyBpbnRlcm5hbCBtZWNoYW5pc20gdG8gaGFuZGxlIGNsb2NrCmRlcGVuZGVuY2ll cyB3aXRoaW4gdGhlIGNsb2NrIHRyZWUsIHdpdGggZGV2aWNlIGxpbmtzIHRvIGhhbmRsZQpkZXBl bmRlbmNpZXMgd2l0aCBleHRlcm5hbCBjb25zdW1lcnMgYW5kIGRlcGVuZGVuY2llcy4KCj4gCj4g QnV0IGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGEgY29uc3VtZXIgZHJpdmVyIGxpa2UgUENJLCBJ IGRvbid0IHNlZSB3aHkKPiBpdCBuZWVkcyB0byBjYXJlIGFib3V0IHRoZSBjbGsgdHJlZSBzdXNw ZW5kL3Jlc3VtZSBvcmRlcmluZyBkZXRhaWxzLiBJdAo+IHJlYWxseSBvbmx5IGNhcmVzIHRoYXQg dGhlIGNsayBpdCdzIGNvbnN1bWluZywgYXQgdGhlIGVkZ2Ugb2YgdGhlIHRyZWUsCj4gaXMgcmVz dW1lZCBiZWZvcmUgdGhlIGNvbnN1bWVyIGl0c2VsZiwgUENJLCBpcyByZXN1bWVkLiBIb3dldmVy IHRoZQo+IGRlcGVuZGVuY2llcyBvZiB0aGF0IGNsayBpdCdzIGNvbnN1bWluZyBpcyBtYW5hZ2Vk LCBiZSBpdCB3aXRoIGRldmljZQo+IGxpbmtzIG9yIHNvbWV0aGluZyBjbGsgZnJhbWV3b3JrIHNw ZWNpZmljLCBkb2Vzbid0IG1hdHRlciB0byB0aGUgUENJCj4gZHJpdmVyLiBBbmQgb3RoZXIgY2xr cyB0aGF0IGFyZSBwYXJlbnRzIG9yIGdyYW5kcGFyZW50cyBvZiB0aGUgY2xrCj4gY29uc3VtZWQg YnkgUENJIGNvdWxkIGhhdmUgZGV2aWNlIGxpbmsgZGVwZW5kZW5jaWVzIHRoZW1zZWx2ZXMsIG9u Cj4gc29tZXRoaW5nIGxpa2UgYW4gaTJjIGNvbnRyb2xsZXIgb3Igc3VjaC4gRXZlbiB0aGVuLCB3 ZSBkb24ndCBuZWVkIHRvCj4gdXNlIGRldmljZSBsaW5rcyBpbiB0aGUgY2xrIHRyZWUgdG8gZGVz Y3JpYmUgb3JkZXJpbmcgYmV0d2VlbiBjbGtzLiBXZQo+IGNhbiBkbyBpdCB3aXRob3V0IGRldmlj ZSBsaW5rcyBhbmQgYnJlYWsgdGhlIGRldmljZSBsaW5rIGNoYWluIHdoZW4gaXQKPiBjcm9zc2Vz IHRoZSBjbGsgdHJlZS4KPiAKPiAgIFBDSSAtW2RldmljZSBsaW5rXS0+IFBDSSBsZWFmIGNsayBw cm92aWRlciAtW2NsayBmcmFtZXdvcmsgb3JkZXJpbmcgYmxhY2sgYm94XS0+IHBhcmVudCBvZiBs ZWFmIGNsayAtW2RldmljZSBsaW5rXS0+IGkyYyBjb250cm9sbGVyIAo+IAoKSSBnZXQgeW91ciBw b2ludC4gV2VsbCwgdG9vIGJhZCB0aGF0IExvcmVuem8gcmVmdXNlZCB0aGUgUENJIHNlcmllcwpi ZWNhdXNlIG9mIHRoaXMgb25lIGJlY2F1c2UgUENJZSBTMlJBTSB3b24ndCBiZSBzdXBwb3J0ZWQg YXQgYWxsIGV2ZW4gaWYKc29tZWRheSBzb21lb25lIGNvbnRyaWJ1dGVzIHRoZSAiZnJhbWV3b3Jr IG9yZGVyaW5nIGJsYWNrIGJveCIgeW91IGFyZQp0YWxraW5nIGFib3V0LCBhbnl3YXkgSSB3aWxs IG5vdCBoYXZlIHRoZSB0aW1lIHRvIHdvcmsgb24gaXQgSSBhbSBzb3JyeS4KCgpUaGFua3MsCk1p cXXDqGwKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxp bnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFk ZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4 LWFybS1rZXJuZWwK