From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8A79E606A329 for ; Wed, 4 Nov 2026 11:14:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=sntech.de header.i=@sntech.de header.a=rsa-sha256 header.s=gloria202408 header.b=J2xn6IhH Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id E369310FB6E; Wed, 4 Nov 2026 11:14:53 +0000 (UTC) Received: from gloria.sntech.de (gloria.sntech.de [185.11.138.130]) by gabe.freedesktop.org (Postfix) with ESMTPS id 431CC10FB7C for ; Wed, 4 Nov 2026 11:14:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sntech.de; s=gloria202408; h=Content-Type:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Reply-To; bh=ElMP7E+td4PbWaeCgFxYru40sXUejYFoNFjAdaBjGOg=; b=J2xn6IhHyGYpOrVe5sEcUkfaKY Nc+tIqwchMNBf6e0WxuM/1TyGy200YvdFq0TlADp3CGjiLoDRN4P1kPKAACXT0gFqgBz+H+EZU5LL l8MGFNTnKN6Dw6NaGRwxVSZP0l498mS3SSQWuzEzC9HZYR0FHtGUJrXnDj+KNO7A4AAFj77a5ICam ana+vlz5r7rgK19JEJLpgUsamSCyCJim3XtYGeF0vsra/5pAwgl2HHS1phJAmA4J5PLNdBlmeBbJ/ 8siN4Ma/gCPNxpy8AmG3cZmmo697E7EIdH6MSRlsHdnWI7A5f+fMT970ATK0zQZK7Oc//yLd6+cOo /8dLGruQ==; From: Heiko =?UTF-8?B?U3TDvGJuZXI=?= To: Tomeu Vizoso , Oded Gabbay , Igor Paunovic Cc: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jeff Hugo , Robert Foss , Sidong Yang , Diederik de Haas , Sebastian Reichel , Jiaxing Hu , Nicolas Dufresne , Jonas Karlman , Guangshuo Li , =?UTF-8?B?SMO8c2V5aW4=?= BIYIK , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Igor Paunovic Subject: Re: [PATCH v2 08/11] accel/rocket: restore the NPU clock boot rate before powering the cores down Date: Wed, 04 Nov 2026 12:14:37 +0100 Message-ID: <5089783.JsnAkG3lO3@diego> In-Reply-To: <20260922080114.44662-9-royalnet026@gmail.com> References: <20260922080114.44662-1-royalnet026@gmail.com> <20260922080114.44662-9-royalnet026@gmail.com> X-Archived-By: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "dri-devel" X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on aws-us-west-2-korg-listserv-alma10-1 Am Dienstag, 22. September 2026, 10:01:11 Mitteleurop=C3=A4ische Normalzeit= schrieb Igor Paunovic: > The compute clock is generated by a PVTPLL that lives inside the NPU power > island. Powering an island up while that clock is above the rate the > bootloader left it at does not work: the domain never acks the power-on, > and the first register access into it afterwards takes an asynchronous > SError. So the rate has to be back down before the last core goes away. >=20 > Nothing in the driver raises the clock today, which makes this a no-op on > its own, but it is the guard that has to be in the tree before anything > does, and the next patches do. The .shutdown hook is the same guard for t= he > handover: once devfreq is driving the clock, a kexec would otherwise pass > the raised rate to the next kernel, which powers the islands up before it > looks at it. What this cannot do is rescue a rate it did not set - the ra= te > read at probe is taken as the boot rate whatever it is. >=20 > The rate is read at probe rather than hardcoded. Mainline pins the RK3588 > cores at 200 MHz with assigned-clock-rates, but that is a devicetree > property, not a property of the hardware, and a SoC whose devicetree does > not set it would be left running at a rate this driver had invented. >=20 > All three cores share the clock, so only the last core to suspend may low= er > it; the others just drop the count. Lowering it is safe with the islands > already down as long as the boot rate is one the firmware serves from GPL= L, > which on the RK3588 is the 200 MHz the devicetree pins: for that rate the > firmware writes only CRU clock selectors, never a register inside the NPU. >=20 > Assisted-by: LLM sparse checkpatch > Signed-off-by: Igor Paunovic > --- > v2: v1 of this patch kept a struct clk handle in struct rocket_device, > taken from the devres of the first core to probe, and used it from the > runtime suspend of whichever core went down last. Unbinding the cores > freed the handle underneath it: KASAN reported a slab-use-after-free in > clk_set_rate() during a ten-round unbind/rebind test on this board after > v1 was posted. No handle is kept any more; the callback uses the handle of > the core it runs for, which is bound for as long as the call lasts. > "A reboot" is dropped from the kexec sentence and the comment: whether the > clock selectors survive the global reset the firmware does on reboot has > not been checked. The argument that lowering the rate is safe is now > limited to a boot rate the firmware serves from GPLL, which on the RK3588 > is the 200 MHz the devicetree pins. >=20 > drivers/accel/rocket/rocket_core.c | 10 ++++++ > drivers/accel/rocket/rocket_device.h | 15 +++++++++ > drivers/accel/rocket/rocket_drv.c | 47 ++++++++++++++++++++++++++++ > 3 files changed, 72 insertions(+) >=20 > diff --git a/drivers/accel/rocket/rocket_core.c b/drivers/accel/rocket/ro= cket_core.c > index 5dd260bacbff6..c736537cf28f6 100644 > --- a/drivers/accel/rocket/rocket_core.c > +++ b/drivers/accel/rocket/rocket_core.c > @@ -12,6 +12,7 @@ > #include > =20 > #include "rocket_core.h" > +#include "rocket_device.h" > #include "rocket_job.h" > =20 > int rocket_core_init(struct rocket_core *core) > @@ -36,6 +37,15 @@ int rocket_core_init(struct rocket_core *core) > if (err) > return dev_err_probe(dev, err, "failed to get clocks for core %d\n", c= ore->index); > =20 > + /* > + * Record what the compute clock was running at before anything here > + * touched it, on the first core to probe. Reading it rather than > + * hardcoding a rate keeps this working on a SoC whose devicetree does > + * not pin the clock with assigned-clock-rates. > + */ shorter comment please > + if (!core->rdev->npu_boot_rate) > + core->rdev->npu_boot_rate =3D clk_get_rate(core->clks[2].clk); see comment about using a constant for the array index in patch 5. > + > core->pc_iomem =3D devm_platform_ioremap_resource_byname(pdev, "pc"); > if (IS_ERR(core->pc_iomem)) { > dev_err(dev, "couldn't find PC registers %ld\n", PTR_ERR(core->pc_iome= m)); > diff --git a/drivers/accel/rocket/rocket_device.h b/drivers/accel/rocket/= rocket_device.h > index abb88a254e569..ba7c977cd6951 100644 > --- a/drivers/accel/rocket/rocket_device.h > +++ b/drivers/accel/rocket/rocket_device.h > @@ -22,6 +22,21 @@ struct rocket_device { > unsigned int num_cores; > /* Slot capacity (DT core count); slots with a NULL .dev are free. */ > unsigned int max_cores; > + > + /* > + * The cores have no clock of their own: one clock feeds all of them, > + * so any core's handle refers to the same thing. No handle is kept > + * here: each one belongs to the devres of the core that asked for it > + * and dies with that core's unbind, while this structure outlives any > + * single core. Whoever needs the clock uses the handle of the core it > + * was called for, which is bound for as long as the call lasts. > + * > + * npu_boot_rate is the rate the clock was left at before the driver > + * touched it, and active_cores counts the cores that are runtime > + * resumed right now. > + */ shorter comment please > + unsigned long npu_boot_rate; > + atomic_t active_cores; > }; > =20 > struct rocket_device *rocket_device_init(struct platform_device *pdev, > diff --git a/drivers/accel/rocket/rocket_drv.c b/drivers/accel/rocket/roc= ket_drv.c > index b9b36c578db20..8f03de1af488c 100644 > --- a/drivers/accel/rocket/rocket_drv.c > +++ b/drivers/accel/rocket/rocket_drv.c > @@ -297,6 +297,30 @@ static int find_core_for_dev(struct device *dev) > return -1; > } > =20 > +/* > + * Put the compute clock back where the bootloader had it. The cores sha= re > + * this clock, so this is only correct once none of them is running any = more. > + * > + * Lowering the rate is safe with the power islands down as long as the = boot > + * rate is one the firmware serves from GPLL, which on the RK3588 is the > + * 200 MHz the devicetree pins: for that rate the firmware touches only = the > + * CRU clock selectors, none of the NPU's own registers. shorter comments please. Thanks Heiko From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 33F3E606A33C for ; Wed, 4 Nov 2026 11:15:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=4fDJpSic; dkim=fail reason="signature verification failed" (2048-bit key, unprotected) header.d=sntech.de header.i=@sntech.de header.a=rsa-sha256 header.s=gloria202408 header.b=J2xn6IhH DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Unsubscribe-Post:List-Owner; bh=YsA68yKd1rESrHz4IwKjjog/iGxYUv1IbQw67yZl1Ys=; b=4fDJpSic4IlVlo+0j9ALtTxUr9 pQCQH4anNanq6T5gN1Q95cTanB/8rvEbi4IsAnF3N1c4zx1e4VfN8OhdCfFo1r3eAbN9xTF8fD2DG r8YMsF77xW3lS5eYJ3XELW+9b+/0CZkYFjxKg2OSH/45LQN+As26RVr/t/hI634VjQ3VUcUyoMD9o 7opGugo6V0d+rFQKR9KWop5LpusWxneyOVuKZJPTc1sd1eAOuDq7WpVBdjX7MacH2v95R0bYdc7y1 kiIrkkcWCUc2mnQzcvo2fXL0+r78zaGH4em26a41dBQcP/HmLH1kMn4eO6tfIE4JnkJxy8sfkA21Y puHQ5uSQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.100.1 #2 (Red Hat Linux)) id 1xOYxE-000000057a6-0im2; Wed, 04 Nov 2026 11:14:56 +0000 Received: from gloria.sntech.de ([185.11.138.130]) by bombadil.infradead.org with esmtps (Exim 4.100.1 #2 (Red Hat Linux)) id 1xOYxC-000000057ZI-0Eng; Wed, 04 Nov 2026 11:14:55 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sntech.de; s=gloria202408; h=Content-Type:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Reply-To; bh=ElMP7E+td4PbWaeCgFxYru40sXUejYFoNFjAdaBjGOg=; b=J2xn6IhHyGYpOrVe5sEcUkfaKY Nc+tIqwchMNBf6e0WxuM/1TyGy200YvdFq0TlADp3CGjiLoDRN4P1kPKAACXT0gFqgBz+H+EZU5LL l8MGFNTnKN6Dw6NaGRwxVSZP0l498mS3SSQWuzEzC9HZYR0FHtGUJrXnDj+KNO7A4AAFj77a5ICam ana+vlz5r7rgK19JEJLpgUsamSCyCJim3XtYGeF0vsra/5pAwgl2HHS1phJAmA4J5PLNdBlmeBbJ/ 8siN4Ma/gCPNxpy8AmG3cZmmo697E7EIdH6MSRlsHdnWI7A5f+fMT970ATK0zQZK7Oc//yLd6+cOo /8dLGruQ==; From: Heiko =?UTF-8?B?U3TDvGJuZXI=?= To: Tomeu Vizoso , Oded Gabbay , Igor Paunovic Cc: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jeff Hugo , Robert Foss , Sidong Yang , Diederik de Haas , Sebastian Reichel , Jiaxing Hu , Nicolas Dufresne , Jonas Karlman , Guangshuo Li , =?UTF-8?B?SMO8c2V5aW4=?= BIYIK , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Igor Paunovic Subject: Re: [PATCH v2 08/11] accel/rocket: restore the NPU clock boot rate before powering the cores down Date: Wed, 04 Nov 2026 12:14:37 +0100 Message-ID: <5089783.JsnAkG3lO3@diego> In-Reply-To: <20260922080114.44662-9-royalnet026@gmail.com> References: <20260922080114.44662-1-royalnet026@gmail.com> <20260922080114.44662-9-royalnet026@gmail.com> X-Archived-By: MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20261104_031454_245826_B660E499 X-CRM114-Status: GOOD ( 46.25 ) X-Spam-Score: -2.1 (--) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" X-Spam-Status: No, score=-13.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on aws-us-west-2-korg-listserv-alma10-1 QW0gRGllbnN0YWcsIDIyLiBTZXB0ZW1iZXIgMjAyNiwgMTA6MDE6MTEgTWl0dGVsZXVyb3DDpGlz Y2hlIE5vcm1hbHplaXQgc2NocmllYiBJZ29yIFBhdW5vdmljOgo+IFRoZSBjb21wdXRlIGNsb2Nr IGlzIGdlbmVyYXRlZCBieSBhIFBWVFBMTCB0aGF0IGxpdmVzIGluc2lkZSB0aGUgTlBVIHBvd2Vy Cj4gaXNsYW5kLiBQb3dlcmluZyBhbiBpc2xhbmQgdXAgd2hpbGUgdGhhdCBjbG9jayBpcyBhYm92 ZSB0aGUgcmF0ZSB0aGUKPiBib290bG9hZGVyIGxlZnQgaXQgYXQgZG9lcyBub3Qgd29yazogdGhl IGRvbWFpbiBuZXZlciBhY2tzIHRoZSBwb3dlci1vbiwKPiBhbmQgdGhlIGZpcnN0IHJlZ2lzdGVy IGFjY2VzcyBpbnRvIGl0IGFmdGVyd2FyZHMgdGFrZXMgYW4gYXN5bmNocm9ub3VzCj4gU0Vycm9y LiBTbyB0aGUgcmF0ZSBoYXMgdG8gYmUgYmFjayBkb3duIGJlZm9yZSB0aGUgbGFzdCBjb3JlIGdv ZXMgYXdheS4KPiAKPiBOb3RoaW5nIGluIHRoZSBkcml2ZXIgcmFpc2VzIHRoZSBjbG9jayB0b2Rh eSwgd2hpY2ggbWFrZXMgdGhpcyBhIG5vLW9wIG9uCj4gaXRzIG93biwgYnV0IGl0IGlzIHRoZSBn dWFyZCB0aGF0IGhhcyB0byBiZSBpbiB0aGUgdHJlZSBiZWZvcmUgYW55dGhpbmcKPiBkb2VzLCBh bmQgdGhlIG5leHQgcGF0Y2hlcyBkby4gVGhlIC5zaHV0ZG93biBob29rIGlzIHRoZSBzYW1lIGd1 YXJkIGZvciB0aGUKPiBoYW5kb3Zlcjogb25jZSBkZXZmcmVxIGlzIGRyaXZpbmcgdGhlIGNsb2Nr LCBhIGtleGVjIHdvdWxkIG90aGVyd2lzZSBwYXNzCj4gdGhlIHJhaXNlZCByYXRlIHRvIHRoZSBu ZXh0IGtlcm5lbCwgd2hpY2ggcG93ZXJzIHRoZSBpc2xhbmRzIHVwIGJlZm9yZSBpdAo+IGxvb2tz IGF0IGl0LiBXaGF0IHRoaXMgY2Fubm90IGRvIGlzIHJlc2N1ZSBhIHJhdGUgaXQgZGlkIG5vdCBz ZXQgLSB0aGUgcmF0ZQo+IHJlYWQgYXQgcHJvYmUgaXMgdGFrZW4gYXMgdGhlIGJvb3QgcmF0ZSB3 aGF0ZXZlciBpdCBpcy4KPiAKPiBUaGUgcmF0ZSBpcyByZWFkIGF0IHByb2JlIHJhdGhlciB0aGFu IGhhcmRjb2RlZC4gTWFpbmxpbmUgcGlucyB0aGUgUkszNTg4Cj4gY29yZXMgYXQgMjAwIE1IeiB3 aXRoIGFzc2lnbmVkLWNsb2NrLXJhdGVzLCBidXQgdGhhdCBpcyBhIGRldmljZXRyZWUKPiBwcm9w ZXJ0eSwgbm90IGEgcHJvcGVydHkgb2YgdGhlIGhhcmR3YXJlLCBhbmQgYSBTb0Mgd2hvc2UgZGV2 aWNldHJlZSBkb2VzCj4gbm90IHNldCBpdCB3b3VsZCBiZSBsZWZ0IHJ1bm5pbmcgYXQgYSByYXRl IHRoaXMgZHJpdmVyIGhhZCBpbnZlbnRlZC4KPiAKPiBBbGwgdGhyZWUgY29yZXMgc2hhcmUgdGhl IGNsb2NrLCBzbyBvbmx5IHRoZSBsYXN0IGNvcmUgdG8gc3VzcGVuZCBtYXkgbG93ZXIKPiBpdDsg dGhlIG90aGVycyBqdXN0IGRyb3AgdGhlIGNvdW50LiBMb3dlcmluZyBpdCBpcyBzYWZlIHdpdGgg dGhlIGlzbGFuZHMKPiBhbHJlYWR5IGRvd24gYXMgbG9uZyBhcyB0aGUgYm9vdCByYXRlIGlzIG9u ZSB0aGUgZmlybXdhcmUgc2VydmVzIGZyb20gR1BMTCwKPiB3aGljaCBvbiB0aGUgUkszNTg4IGlz IHRoZSAyMDAgTUh6IHRoZSBkZXZpY2V0cmVlIHBpbnM6IGZvciB0aGF0IHJhdGUgdGhlCj4gZmly bXdhcmUgd3JpdGVzIG9ubHkgQ1JVIGNsb2NrIHNlbGVjdG9ycywgbmV2ZXIgYSByZWdpc3RlciBp bnNpZGUgdGhlIE5QVS4KPiAKPiBBc3Npc3RlZC1ieTogTExNIHNwYXJzZSBjaGVja3BhdGNoCj4g U2lnbmVkLW9mZi1ieTogSWdvciBQYXVub3ZpYyA8cm95YWxuZXQwMjZAZ21haWwuY29tPgo+IC0t LQo+IHYyOiB2MSBvZiB0aGlzIHBhdGNoIGtlcHQgYSBzdHJ1Y3QgY2xrIGhhbmRsZSBpbiBzdHJ1 Y3Qgcm9ja2V0X2RldmljZSwKPiB0YWtlbiBmcm9tIHRoZSBkZXZyZXMgb2YgdGhlIGZpcnN0IGNv cmUgdG8gcHJvYmUsIGFuZCB1c2VkIGl0IGZyb20gdGhlCj4gcnVudGltZSBzdXNwZW5kIG9mIHdo aWNoZXZlciBjb3JlIHdlbnQgZG93biBsYXN0LiBVbmJpbmRpbmcgdGhlIGNvcmVzCj4gZnJlZWQg dGhlIGhhbmRsZSB1bmRlcm5lYXRoIGl0OiBLQVNBTiByZXBvcnRlZCBhIHNsYWItdXNlLWFmdGVy LWZyZWUgaW4KPiBjbGtfc2V0X3JhdGUoKSBkdXJpbmcgYSB0ZW4tcm91bmQgdW5iaW5kL3JlYmlu ZCB0ZXN0IG9uIHRoaXMgYm9hcmQgYWZ0ZXIKPiB2MSB3YXMgcG9zdGVkLiBObyBoYW5kbGUgaXMg a2VwdCBhbnkgbW9yZTsgdGhlIGNhbGxiYWNrIHVzZXMgdGhlIGhhbmRsZSBvZgo+IHRoZSBjb3Jl IGl0IHJ1bnMgZm9yLCB3aGljaCBpcyBib3VuZCBmb3IgYXMgbG9uZyBhcyB0aGUgY2FsbCBsYXN0 cy4KPiAiQSByZWJvb3QiIGlzIGRyb3BwZWQgZnJvbSB0aGUga2V4ZWMgc2VudGVuY2UgYW5kIHRo ZSBjb21tZW50OiB3aGV0aGVyIHRoZQo+IGNsb2NrIHNlbGVjdG9ycyBzdXJ2aXZlIHRoZSBnbG9i YWwgcmVzZXQgdGhlIGZpcm13YXJlIGRvZXMgb24gcmVib290IGhhcwo+IG5vdCBiZWVuIGNoZWNr ZWQuIFRoZSBhcmd1bWVudCB0aGF0IGxvd2VyaW5nIHRoZSByYXRlIGlzIHNhZmUgaXMgbm93Cj4g bGltaXRlZCB0byBhIGJvb3QgcmF0ZSB0aGUgZmlybXdhcmUgc2VydmVzIGZyb20gR1BMTCwgd2hp Y2ggb24gdGhlIFJLMzU4OAo+IGlzIHRoZSAyMDAgTUh6IHRoZSBkZXZpY2V0cmVlIHBpbnMuCj4g Cj4gIGRyaXZlcnMvYWNjZWwvcm9ja2V0L3JvY2tldF9jb3JlLmMgICB8IDEwICsrKysrKwo+ICBk cml2ZXJzL2FjY2VsL3JvY2tldC9yb2NrZXRfZGV2aWNlLmggfCAxNSArKysrKysrKysKPiAgZHJp dmVycy9hY2NlbC9yb2NrZXQvcm9ja2V0X2Rydi5jICAgIHwgNDcgKysrKysrKysrKysrKysrKysr KysrKysrKysrKwo+ICAzIGZpbGVzIGNoYW5nZWQsIDcyIGluc2VydGlvbnMoKykKPiAKPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9hY2NlbC9yb2NrZXQvcm9ja2V0X2NvcmUuYyBiL2RyaXZlcnMvYWNj ZWwvcm9ja2V0L3JvY2tldF9jb3JlLmMKPiBpbmRleCA1ZGQyNjBiYWNiZmY2Li5jNzM2NTM3Y2Yy OGY2IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvYWNjZWwvcm9ja2V0L3JvY2tldF9jb3JlLmMKPiAr KysgYi9kcml2ZXJzL2FjY2VsL3JvY2tldC9yb2NrZXRfY29yZS5jCj4gQEAgLTEyLDYgKzEyLDcg QEAKPiAgI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+Cj4gIAo+ICAjaW5jbHVkZSAicm9ja2V0X2Nv cmUuaCIKPiArI2luY2x1ZGUgInJvY2tldF9kZXZpY2UuaCIKPiAgI2luY2x1ZGUgInJvY2tldF9q b2IuaCIKPiAgCj4gIGludCByb2NrZXRfY29yZV9pbml0KHN0cnVjdCByb2NrZXRfY29yZSAqY29y ZSkKPiBAQCAtMzYsNiArMzcsMTUgQEAgaW50IHJvY2tldF9jb3JlX2luaXQoc3RydWN0IHJvY2tl dF9jb3JlICpjb3JlKQo+ICAJaWYgKGVycikKPiAgCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYs IGVyciwgImZhaWxlZCB0byBnZXQgY2xvY2tzIGZvciBjb3JlICVkXG4iLCBjb3JlLT5pbmRleCk7 Cj4gIAo+ICsJLyoKPiArCSAqIFJlY29yZCB3aGF0IHRoZSBjb21wdXRlIGNsb2NrIHdhcyBydW5u aW5nIGF0IGJlZm9yZSBhbnl0aGluZyBoZXJlCj4gKwkgKiB0b3VjaGVkIGl0LCBvbiB0aGUgZmly c3QgY29yZSB0byBwcm9iZS4gUmVhZGluZyBpdCByYXRoZXIgdGhhbgo+ICsJICogaGFyZGNvZGlu ZyBhIHJhdGUga2VlcHMgdGhpcyB3b3JraW5nIG9uIGEgU29DIHdob3NlIGRldmljZXRyZWUgZG9l cwo+ICsJICogbm90IHBpbiB0aGUgY2xvY2sgd2l0aCBhc3NpZ25lZC1jbG9jay1yYXRlcy4KPiAr CSAqLwoKc2hvcnRlciBjb21tZW50IHBsZWFzZQoKPiArCWlmICghY29yZS0+cmRldi0+bnB1X2Jv b3RfcmF0ZSkKPiArCQljb3JlLT5yZGV2LT5ucHVfYm9vdF9yYXRlID0gY2xrX2dldF9yYXRlKGNv cmUtPmNsa3NbMl0uY2xrKTsKCnNlZSBjb21tZW50IGFib3V0IHVzaW5nIGEgY29uc3RhbnQgZm9y IHRoZSBhcnJheSBpbmRleCBpbiBwYXRjaCA1LgoKPiArCj4gIAljb3JlLT5wY19pb21lbSA9IGRl dm1fcGxhdGZvcm1faW9yZW1hcF9yZXNvdXJjZV9ieW5hbWUocGRldiwgInBjIik7Cj4gIAlpZiAo SVNfRVJSKGNvcmUtPnBjX2lvbWVtKSkgewo+ICAJCWRldl9lcnIoZGV2LCAiY291bGRuJ3QgZmlu ZCBQQyByZWdpc3RlcnMgJWxkXG4iLCBQVFJfRVJSKGNvcmUtPnBjX2lvbWVtKSk7Cj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvYWNjZWwvcm9ja2V0L3JvY2tldF9kZXZpY2UuaCBiL2RyaXZlcnMvYWNj ZWwvcm9ja2V0L3JvY2tldF9kZXZpY2UuaAo+IGluZGV4IGFiYjg4YTI1NGU1NjkuLmJhN2M5Nzdj ZDY5NTEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9hY2NlbC9yb2NrZXQvcm9ja2V0X2RldmljZS5o Cj4gKysrIGIvZHJpdmVycy9hY2NlbC9yb2NrZXQvcm9ja2V0X2RldmljZS5oCj4gQEAgLTIyLDYg KzIyLDIxIEBAIHN0cnVjdCByb2NrZXRfZGV2aWNlIHsKPiAgCXVuc2lnbmVkIGludCBudW1fY29y ZXM7Cj4gIAkvKiBTbG90IGNhcGFjaXR5IChEVCBjb3JlIGNvdW50KTsgc2xvdHMgd2l0aCBhIE5V TEwgLmRldiBhcmUgZnJlZS4gKi8KPiAgCXVuc2lnbmVkIGludCBtYXhfY29yZXM7Cj4gKwo+ICsJ LyoKPiArCSAqIFRoZSBjb3JlcyBoYXZlIG5vIGNsb2NrIG9mIHRoZWlyIG93bjogb25lIGNsb2Nr IGZlZWRzIGFsbCBvZiB0aGVtLAo+ICsJICogc28gYW55IGNvcmUncyBoYW5kbGUgcmVmZXJzIHRv IHRoZSBzYW1lIHRoaW5nLiBObyBoYW5kbGUgaXMga2VwdAo+ICsJICogaGVyZTogZWFjaCBvbmUg YmVsb25ncyB0byB0aGUgZGV2cmVzIG9mIHRoZSBjb3JlIHRoYXQgYXNrZWQgZm9yIGl0Cj4gKwkg KiBhbmQgZGllcyB3aXRoIHRoYXQgY29yZSdzIHVuYmluZCwgd2hpbGUgdGhpcyBzdHJ1Y3R1cmUg b3V0bGl2ZXMgYW55Cj4gKwkgKiBzaW5nbGUgY29yZS4gV2hvZXZlciBuZWVkcyB0aGUgY2xvY2sg dXNlcyB0aGUgaGFuZGxlIG9mIHRoZSBjb3JlIGl0Cj4gKwkgKiB3YXMgY2FsbGVkIGZvciwgd2hp Y2ggaXMgYm91bmQgZm9yIGFzIGxvbmcgYXMgdGhlIGNhbGwgbGFzdHMuCj4gKwkgKgo+ICsJICog bnB1X2Jvb3RfcmF0ZSBpcyB0aGUgcmF0ZSB0aGUgY2xvY2sgd2FzIGxlZnQgYXQgYmVmb3JlIHRo ZSBkcml2ZXIKPiArCSAqIHRvdWNoZWQgaXQsIGFuZCBhY3RpdmVfY29yZXMgY291bnRzIHRoZSBj b3JlcyB0aGF0IGFyZSBydW50aW1lCj4gKwkgKiByZXN1bWVkIHJpZ2h0IG5vdy4KPiArCSAqLwoK c2hvcnRlciBjb21tZW50IHBsZWFzZQoKPiArCXVuc2lnbmVkIGxvbmcgbnB1X2Jvb3RfcmF0ZTsK PiArCWF0b21pY190IGFjdGl2ZV9jb3JlczsKPiAgfTsKPiAgCj4gIHN0cnVjdCByb2NrZXRfZGV2 aWNlICpyb2NrZXRfZGV2aWNlX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9hY2NlbC9yb2NrZXQvcm9ja2V0X2Rydi5jIGIvZHJpdmVycy9h Y2NlbC9yb2NrZXQvcm9ja2V0X2Rydi5jCj4gaW5kZXggYjliMzZjNTc4ZGIyMC4uOGYwM2RlMWFm NDg4YyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2FjY2VsL3JvY2tldC9yb2NrZXRfZHJ2LmMKPiAr KysgYi9kcml2ZXJzL2FjY2VsL3JvY2tldC9yb2NrZXRfZHJ2LmMKPiBAQCAtMjk3LDYgKzI5Nywz MCBAQCBzdGF0aWMgaW50IGZpbmRfY29yZV9mb3JfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKPiAg CXJldHVybiAtMTsKPiAgfQo+ICAKPiArLyoKPiArICogUHV0IHRoZSBjb21wdXRlIGNsb2NrIGJh Y2sgd2hlcmUgdGhlIGJvb3Rsb2FkZXIgaGFkIGl0LiBUaGUgY29yZXMgc2hhcmUKPiArICogdGhp cyBjbG9jaywgc28gdGhpcyBpcyBvbmx5IGNvcnJlY3Qgb25jZSBub25lIG9mIHRoZW0gaXMgcnVu bmluZyBhbnkgbW9yZS4KPiArICoKPiArICogTG93ZXJpbmcgdGhlIHJhdGUgaXMgc2FmZSB3aXRo IHRoZSBwb3dlciBpc2xhbmRzIGRvd24gYXMgbG9uZyBhcyB0aGUgYm9vdAo+ICsgKiByYXRlIGlz IG9uZSB0aGUgZmlybXdhcmUgc2VydmVzIGZyb20gR1BMTCwgd2hpY2ggb24gdGhlIFJLMzU4OCBp cyB0aGUKPiArICogMjAwIE1IeiB0aGUgZGV2aWNldHJlZSBwaW5zOiBmb3IgdGhhdCByYXRlIHRo ZSBmaXJtd2FyZSB0b3VjaGVzIG9ubHkgdGhlCj4gKyAqIENSVSBjbG9jayBzZWxlY3RvcnMsIG5v bmUgb2YgdGhlIE5QVSdzIG93biByZWdpc3RlcnMuCgpzaG9ydGVyIGNvbW1lbnRzIHBsZWFzZS4K CgpUaGFua3MKSGVpa28KCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KTGludXgtcm9ja2NoaXAgbWFpbGluZyBsaXN0CkxpbnV4LXJvY2tjaGlwQGxpc3Rz LmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9saW51eC1yb2NrY2hpcAo=