From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1792685589; b=rkTHZffW7LoZvL0XcVxKwasDE6rCYgwUR2YF5jKWtxQVpDMT9IKgIHCWzAJ2ID65+LSi 6uD0q196tYioppLfB5FWZG7S2VMPijcA4KfAlDPaC5Kn95MA1pxAiD8MnjGoUtutDiKfQ GVsLad8Oh+l0pNiBXqvdFKHm9dfUNYHfibDdl29cYWEdcOEoGdbvO8HOUsbHjui0XwIXx C8eNNCOK1gasaLGUHBAxAbWlgkMwQidgxq2xyJKfB1FUdN64dkjWfCHXfQc7PX+MitIKe j4DmrNXTKgWiMB/ETQoxsobcOvcPntmQ4iAjrraM9/I+p03IzW2Fp8+zkvi2tdDmMMQ== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1792685589; h=Received:DKIM-Signature:Message-ID:From:Subject:Reply-To:To:Cc: In-Reply-To:References:Content-Type:Content-Transfer-Encoding:Date; bh=pYWBDbbU+QTRHK0HCB0YoFvBhJv+J3W0aUK6zLm7FaY=; b=BmqoRRu69cZcYx+1LYsrUpsSpQpj8TnC2WelbCRqRLezcykkiFbxLicKUJ+hK1vh0TMW vRw07m5E/JEwV1EUFjT3LzZTygXYiG1xoT0e7c1Z0fgYCLKx/ywlaE2YUgeWiHOmhhKKE nQQrZ5m28s0TNFKb0fatKJ8fYtCWy5nWMXreJ0VWOkzfe0700VyTSRhUd4rXXUVAQaOFw PII4t5Qboa6p8vb7eVnMcsVj+FTvtYcnRI2sLVGGrPY53j+yu23XDmyW1V8DrmCeMqsQZ 2OV7Gdvqsgx31O0A9r6IL1wCtB+5nsAms75pISfrbiI0uPAS/c71GSaqrkDHao2aoQA== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=AzST28Ha; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 23884606A31A; Thu, 22 Oct 2026 16:13:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=AzST28Ha Received: by smtp.kernel.org (Postfix) with ESMTPSA id E75691F031E0; Thu, 22 Oct 2026 16:13:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1792685588; bh=pYWBDbbU+QTRHK0HCB0YoFvBhJv+J3W0aUK6zLm7FaY=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=AzST28HaqnRsJFlYfeiXrDT44IoRuEChlzBrNP/8e4wzuNRhmxCpULAD4lqIQbJpM ekv1EWV9GjJ5XcUXYZPUeYRSnEyWv3X9CjFeB6FQ+Askh2lrYHsL2ef4tvZq6XfHOB Y2P+oGziq/4w1Op4OZU7zHD9Wnh42cESMuG8tNlZ9pIk5OJFsxUF7XwR2LRwvPAr+L fqiTZVlFCGdRm/8syszrNDl93WO6S4Wmd0OG2kqZVUkadOD8eeu4ZTzC9/fWBKTuT8 +wErSK/oS7HwIm1i1HG2VGhvQVxMF6fbWhiwL/nHhT+FrZ1Y6M9zPsQjj4vqlfU5/+ PQQqScVYdMOCQ== Message-ID: From: sashiko-bot@kernel.org Subject: Re: [PATCH 10/27] pmdomain: rockchip: Add RK3572 boot peripheral domains Reply-To: sashiko-reviews@lists.linux.dev To: "Cunhao Lu" <1579567540@qq.com> Cc: linux-clk@vger.kernel.org, devicetree@vger.kernel.org, mfd@lists.linux.dev, linux-gpio@vger.kernel.org, linux-serial@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, robh@kernel.org, conor+dt@kernel.org, vkoul@kernel.org, neil.armstrong@linaro.org, olteanv@gmail.com, lee@kernel.org In-Reply-To: <20261022-add-board-ok3572-c-v1-10-0b0fd85a31ee@qq.com> References: <20261022-add-board-ok3572-c-v1-0-0b0fd85a31ee@qq.com> <20261022-add-board-ok3572-c-v1-10-0b0fd85a31ee@qq.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Thu, 22 Oct 2026 16:13:07 +0000 X-Mailing-List: linux-clk@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list Thank you for your contribution! Sashiko AI review found 1 potential issue(= s) to consider: - [High] pmdomain: rockchip: incomplete power-on retry tracking in rockchip= _pd_power() -- commit c324244eacf06dcfc61ec2e5830623efbacb5d15 Author: Cunhao Lu <1579567540@qq.com> pmdomain: rockchip: Add RK3572 boot peripheral domains This commit adds the rk3572 boot peripheral power domains (nvm0, nvm1, php, and vop), waits for the grf firewall before restoring consumers, and tracks pending power-on transitions to retry failures without power-cycling the domain. > diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/ro= ckchip/pm-domains.c > index e193f978d5f35..86a6ffd43254b 100644 > --- a/drivers/pmdomain/rockchip/pm-domains.c > +++ b/drivers/pmdomain/rockchip/pm-domains.c [ ... ] > @@ -644,14 +657,29 @@ static int rockchip_do_pmu_set_power_domain(struct = rockchip_pm_domain *pd, > return 0; > } > =20 > +static int rockchip_pmu_wait_firewall(struct rockchip_pm_domain *pd) > +{ > + struct rockchip_pmu *pmu =3D pd->pmu; > + u32 mask =3D pd->info->firewall_mask; > + u32 val; > + > + if (!mask) > + return 0; > + > + return regmap_read_poll_timeout(pmu->grf, pmu->info->firewall_status_of= fset, > + val, (val & mask) =3D=3D mask, 0, 10000); > +} > + > static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_o= n) > { > struct rockchip_pmu *pmu =3D pd->pmu; > + bool is_on; > int ret; > =20 > guard(mutex)(&pmu->mutex); > =20 > - if (rockchip_pmu_domain_is_on(pd) =3D=3D power_on) > + is_on =3D rockchip_pmu_domain_is_on(pd); > + if (is_on =3D=3D power_on && !pd->power_on_pending) > return 0; > =20 > ret =3D clk_bulk_enable(pd->num_clks, pd->clks); > @@ -663,7 +691,8 @@ static int rockchip_pd_power(struct rockchip_pm_domai= n *pd, bool power_on) > rockchip_pmu_ungate_clk(pd, true); > =20 > if (!power_on) { > - rockchip_pmu_save_qos(pd); > + if (!pd->power_on_pending) > + rockchip_pmu_save_qos(pd); > =20 > /* if powering down, idle request to NIU first */ > ret =3D rockchip_pmu_set_idle_request(pd, true); > @@ -671,18 +700,29 @@ static int rockchip_pd_power(struct rockchip_pm_dom= ain *pd, bool power_on) > goto out; > } > =20 > - ret =3D rockchip_do_pmu_set_power_domain(pd, power_on); > - if (ret < 0) > - goto out; > + /* A failed firewall wait must not restart powered memory on retry. */ > + if (is_on !=3D power_on) { > + ret =3D rockchip_do_pmu_set_power_domain(pd, power_on); > + if (ret < 0) > + goto out; > + } > =20 > if (power_on) { > + if (pd->info->firewall_mask) > + pd->power_on_pending =3D true; > + > /* if powering up, leave idle mode */ > ret =3D rockchip_pmu_set_idle_request(pd, false); > if (ret < 0) > goto out; [Severity: High] In drivers/pmdomain/rockchip/pm-domains.c, does setting pd->power_on_pending only when pd->info->firewall_mask is non-zero and only after rockchip_do_pmu_set_power_domain() succeeds leave partial power-on states untracked in rockchip_pd_power()? When genpd_power_on() -> rockchip_pd_power_on() -> rockchip_pd_power(pd, tr= ue) is called for a domain that is initially off (is_on =3D=3D false), rockchip_do_pmu_set_power_domain(pd, true) enables the hardware power switch in pmu->info->pwr_offset + pd_pwr_offset, making rockchip_pmu_domain_is_on(= pd) return true. If rockchip_pmu_set_idle_request(pd, false) subsequently fails on a domain where pd->info->firewall_mask is 0 (such as the "nvm0" and "nvm1" domains on rk3572, or domains on other SoCs), or if rockchip_do_pmu_set_power_domain() fails in rockchip_pmu_domain_mem_reset() after enabling the power switch, pd->power_on_pending remains false when jumping to out. If a later power-on retry calls rockchip_pd_power(pd, true), rockchip_pmu_domain_is_on(pd) will return true while pd->power_on_pending is false: is_on =3D rockchip_pmu_domain_is_on(pd); if (is_on =3D=3D power_on && !pd->power_on_pending) return 0; Wouldn't rockchip_pd_power(pd, true) then return 0 immediately without deasserting the bus idle request, resetting memory, waiting for the firewal= l, or restoring QoS registers via rockchip_pmu_restore_qos()? Furthermore, if rockchip_pd_power(pd, false) is called in that state, wouldn't the !pd->power_on_pending check allow rockchip_pmu_save_qos(pd) to overwrite pd->qos_save_regs with unrestored values while the domain is still idle? Should pd->power_on_pending be set unconditionally before rockchip_do_pmu_set_power_domain(pd, true) when powering on a domain? > =20 > + ret =3D rockchip_pmu_wait_firewall(pd); > + if (ret) > + goto out; > + > rockchip_pmu_restore_qos(pd); > } > + pd->power_on_pending =3D false; > =20 > out: > rockchip_pmu_ungate_clk(pd, false); [ ... ] --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20261022-add-board-= ok3572-c-v1-0-0b0fd85a31ee@qq.com?part=3D10 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 142D0606A329 for ; Thu, 22 Oct 2026 16:13:12 +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=PEGx8TZ5; dkim=fail reason="signature verification failed" (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=AzST28Ha 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:MIME-Version:Reply-To:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Date:References: In-Reply-To:Cc:To:Subject:From:Message-ID:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Unsubscribe-Post:List-Owner; bh=I82+Kda8ae+ihNT76NX7RC7AgtIgdYwcxnTZkOWjKfU=; b=PEGx8TZ5m5cWklJI4MZ3jlAQx3 S9UlPEaXI2XGWpCPZExTUC38DnE6tD5cJXeD0roo+nTFZjfMu+i6C2A7Yw8H6dO5ho6VEGyKOMNV/ LpMLk5sqRTm0oXEwjUoNcu6AJDYZZY+xiN9ZV2YeXJuTNTZ5FEt2n2JYxcBGBZ25SzKqi0uVMOwjn i4yfNln9+L68WFZ9XhKN1HENna1J1wV+47li0Vwh6UPu0dFPxPH3veBOhN4Ji1H+vovcQ3JLfDEPQ 7JhHuLygLmLPS++0tD8+HU0cPWC0qGc7HfQ5/D2uqJ/ccdlfMVd/zHvPFcINpOJZQx6Kn5PgCf4WW fRirbVng==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.100.1 #2 (Red Hat Linux)) id 1xJvPj-0000000ET6Q-3LJV; Thu, 22 Oct 2026 16:13:11 +0000 Received: from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.100.1 #2 (Red Hat Linux)) id 1xJvPh-0000000ET5L-1Bd8 for linux-phy@lists.infradead.org; Thu, 22 Oct 2026 16:13:09 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id D97C9406C4; Thu, 22 Oct 2026 16:13:08 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E75691F031E0; Thu, 22 Oct 2026 16:13:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1792685588; bh=pYWBDbbU+QTRHK0HCB0YoFvBhJv+J3W0aUK6zLm7FaY=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=AzST28HaqnRsJFlYfeiXrDT44IoRuEChlzBrNP/8e4wzuNRhmxCpULAD4lqIQbJpM ekv1EWV9GjJ5XcUXYZPUeYRSnEyWv3X9CjFeB6FQ+Askh2lrYHsL2ef4tvZq6XfHOB Y2P+oGziq/4w1Op4OZU7zHD9Wnh42cESMuG8tNlZ9pIk5OJFsxUF7XwR2LRwvPAr+L fqiTZVlFCGdRm/8syszrNDl93WO6S4Wmd0OG2kqZVUkadOD8eeu4ZTzC9/fWBKTuT8 +wErSK/oS7HwIm1i1HG2VGhvQVxMF6fbWhiwL/nHhT+FrZ1Y6M9zPsQjj4vqlfU5/+ PQQqScVYdMOCQ== Message-ID: From: sashiko-bot@kernel.org Subject: Re: [PATCH 10/27] pmdomain: rockchip: Add RK3572 boot peripheral domains To: "Cunhao Lu" <1579567540@qq.com> Cc: linux-clk@vger.kernel.org, devicetree@vger.kernel.org, mfd@lists.linux.dev, linux-gpio@vger.kernel.org, linux-serial@vger.kernel.org, linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, robh@kernel.org, conor+dt@kernel.org, vkoul@kernel.org, neil.armstrong@linaro.org, olteanv@gmail.com, lee@kernel.org In-Reply-To: <20261022-add-board-ok3572-c-v1-10-0b0fd85a31ee@qq.com> References: <20261022-add-board-ok3572-c-v1-0-0b0fd85a31ee@qq.com> <20261022-add-board-ok3572-c-v1-10-0b0fd85a31ee@qq.com> Date: Thu, 22 Oct 2026 16:13:07 +0000 X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: sashiko-reviews@lists.linux.dev X-Archived-By: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" X-Spam-Status: No, score=-8.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS, 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 VGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbiEgU2FzaGlrbyBBSSByZXZpZXcgZm91bmQg MSBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6Ci0gW0hpZ2hdIHBtZG9tYWluOiByb2Nr Y2hpcDogaW5jb21wbGV0ZSBwb3dlci1vbiByZXRyeSB0cmFja2luZyBpbiByb2NrY2hpcF9wZF9w b3dlcigpCi0tCgpjb21taXQgYzMyNDI0NGVhY2YwNmRjZmM2MWVjMmU1ODMwNjIzZWZiYWNiNWQx NQpBdXRob3I6IEN1bmhhbyBMdSA8MTU3OTU2NzU0MEBxcS5jb20+CgpwbWRvbWFpbjogcm9ja2No aXA6IEFkZCBSSzM1NzIgYm9vdCBwZXJpcGhlcmFsIGRvbWFpbnMKClRoaXMgY29tbWl0IGFkZHMg dGhlIHJrMzU3MiBib290IHBlcmlwaGVyYWwgcG93ZXIgZG9tYWlucyAobnZtMCwgbnZtMSwgcGhw LAphbmQgdm9wKSwgd2FpdHMgZm9yIHRoZSBncmYgZmlyZXdhbGwgYmVmb3JlIHJlc3RvcmluZyBj b25zdW1lcnMsIGFuZCB0cmFja3MKcGVuZGluZyBwb3dlci1vbiB0cmFuc2l0aW9ucyB0byByZXRy eSBmYWlsdXJlcyB3aXRob3V0IHBvd2VyLWN5Y2xpbmcgdGhlCmRvbWFpbi4KCj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvcG1kb21haW4vcm9ja2NoaXAvcG0tZG9tYWlucy5jIGIvZHJpdmVycy9wbWRv bWFpbi9yb2NrY2hpcC9wbS1kb21haW5zLmMKPiBpbmRleCBlMTkzZjk3OGQ1ZjM1Li44NmE2ZmZk NDMyNTRiIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvcG1kb21haW4vcm9ja2NoaXAvcG0tZG9tYWlu cy5jCj4gKysrIGIvZHJpdmVycy9wbWRvbWFpbi9yb2NrY2hpcC9wbS1kb21haW5zLmMKClsgLi4u IF0KCj4gQEAgLTY0NCwxNCArNjU3LDI5IEBAIHN0YXRpYyBpbnQgcm9ja2NoaXBfZG9fcG11X3Nl dF9wb3dlcl9kb21haW4oc3RydWN0IHJvY2tjaGlwX3BtX2RvbWFpbiAqcGQsCj4gIAlyZXR1cm4g MDsKPiAgfQo+ICAKPiArc3RhdGljIGludCByb2NrY2hpcF9wbXVfd2FpdF9maXJld2FsbChzdHJ1 Y3Qgcm9ja2NoaXBfcG1fZG9tYWluICpwZCkKPiArewo+ICsJc3RydWN0IHJvY2tjaGlwX3BtdSAq cG11ID0gcGQtPnBtdTsKPiArCXUzMiBtYXNrID0gcGQtPmluZm8tPmZpcmV3YWxsX21hc2s7Cj4g Kwl1MzIgdmFsOwo+ICsKPiArCWlmICghbWFzaykKPiArCQlyZXR1cm4gMDsKPiArCj4gKwlyZXR1 cm4gcmVnbWFwX3JlYWRfcG9sbF90aW1lb3V0KHBtdS0+Z3JmLCBwbXUtPmluZm8tPmZpcmV3YWxs X3N0YXR1c19vZmZzZXQsCj4gKwkJCQkgICAgICAgdmFsLCAodmFsICYgbWFzaykgPT0gbWFzaywg MCwgMTAwMDApOwo+ICt9Cj4gKwo+ICBzdGF0aWMgaW50IHJvY2tjaGlwX3BkX3Bvd2VyKHN0cnVj dCByb2NrY2hpcF9wbV9kb21haW4gKnBkLCBib29sIHBvd2VyX29uKQo+ICB7Cj4gIAlzdHJ1Y3Qg cm9ja2NoaXBfcG11ICpwbXUgPSBwZC0+cG11Owo+ICsJYm9vbCBpc19vbjsKPiAgCWludCByZXQ7 Cj4gIAo+ICAJZ3VhcmQobXV0ZXgpKCZwbXUtPm11dGV4KTsKPiAgCj4gLQlpZiAocm9ja2NoaXBf cG11X2RvbWFpbl9pc19vbihwZCkgPT0gcG93ZXJfb24pCj4gKwlpc19vbiA9IHJvY2tjaGlwX3Bt dV9kb21haW5faXNfb24ocGQpOwo+ICsJaWYgKGlzX29uID09IHBvd2VyX29uICYmICFwZC0+cG93 ZXJfb25fcGVuZGluZykKPiAgCQlyZXR1cm4gMDsKPiAgCj4gIAlyZXQgPSBjbGtfYnVsa19lbmFi bGUocGQtPm51bV9jbGtzLCBwZC0+Y2xrcyk7Cj4gQEAgLTY2Myw3ICs2OTEsOCBAQCBzdGF0aWMg aW50IHJvY2tjaGlwX3BkX3Bvd2VyKHN0cnVjdCByb2NrY2hpcF9wbV9kb21haW4gKnBkLCBib29s IHBvd2VyX29uKQo+ICAJcm9ja2NoaXBfcG11X3VuZ2F0ZV9jbGsocGQsIHRydWUpOwo+ICAKPiAg CWlmICghcG93ZXJfb24pIHsKPiAtCQlyb2NrY2hpcF9wbXVfc2F2ZV9xb3MocGQpOwo+ICsJCWlm ICghcGQtPnBvd2VyX29uX3BlbmRpbmcpCj4gKwkJCXJvY2tjaGlwX3BtdV9zYXZlX3FvcyhwZCk7 Cj4gIAo+ICAJCS8qIGlmIHBvd2VyaW5nIGRvd24sIGlkbGUgcmVxdWVzdCB0byBOSVUgZmlyc3Qg Ki8KPiAgCQlyZXQgPSByb2NrY2hpcF9wbXVfc2V0X2lkbGVfcmVxdWVzdChwZCwgdHJ1ZSk7Cj4g QEAgLTY3MSwxOCArNzAwLDI5IEBAIHN0YXRpYyBpbnQgcm9ja2NoaXBfcGRfcG93ZXIoc3RydWN0 IHJvY2tjaGlwX3BtX2RvbWFpbiAqcGQsIGJvb2wgcG93ZXJfb24pCj4gIAkJCWdvdG8gb3V0Owo+ ICAJfQo+ICAKPiAtCXJldCA9IHJvY2tjaGlwX2RvX3BtdV9zZXRfcG93ZXJfZG9tYWluKHBkLCBw b3dlcl9vbik7Cj4gLQlpZiAocmV0IDwgMCkKPiAtCQlnb3RvIG91dDsKPiArCS8qIEEgZmFpbGVk IGZpcmV3YWxsIHdhaXQgbXVzdCBub3QgcmVzdGFydCBwb3dlcmVkIG1lbW9yeSBvbiByZXRyeS4g Ki8KPiArCWlmIChpc19vbiAhPSBwb3dlcl9vbikgewo+ICsJCXJldCA9IHJvY2tjaGlwX2RvX3Bt dV9zZXRfcG93ZXJfZG9tYWluKHBkLCBwb3dlcl9vbik7Cj4gKwkJaWYgKHJldCA8IDApCj4gKwkJ CWdvdG8gb3V0Owo+ICsJfQo+ICAKPiAgCWlmIChwb3dlcl9vbikgewo+ICsJCWlmIChwZC0+aW5m by0+ZmlyZXdhbGxfbWFzaykKPiArCQkJcGQtPnBvd2VyX29uX3BlbmRpbmcgPSB0cnVlOwo+ICsK PiAgCQkvKiBpZiBwb3dlcmluZyB1cCwgbGVhdmUgaWRsZSBtb2RlICovCj4gIAkJcmV0ID0gcm9j a2NoaXBfcG11X3NldF9pZGxlX3JlcXVlc3QocGQsIGZhbHNlKTsKPiAgCQlpZiAocmV0IDwgMCkK PiAgCQkJZ290byBvdXQ7CgpbU2V2ZXJpdHk6IEhpZ2hdCkluIGRyaXZlcnMvcG1kb21haW4vcm9j a2NoaXAvcG0tZG9tYWlucy5jLCBkb2VzIHNldHRpbmcgcGQtPnBvd2VyX29uX3BlbmRpbmcKb25s eSB3aGVuIHBkLT5pbmZvLT5maXJld2FsbF9tYXNrIGlzIG5vbi16ZXJvIGFuZCBvbmx5IGFmdGVy CnJvY2tjaGlwX2RvX3BtdV9zZXRfcG93ZXJfZG9tYWluKCkgc3VjY2VlZHMgbGVhdmUgcGFydGlh bCBwb3dlci1vbiBzdGF0ZXMKdW50cmFja2VkIGluIHJvY2tjaGlwX3BkX3Bvd2VyKCk/CgpXaGVu IGdlbnBkX3Bvd2VyX29uKCkgLT4gcm9ja2NoaXBfcGRfcG93ZXJfb24oKSAtPiByb2NrY2hpcF9w ZF9wb3dlcihwZCwgdHJ1ZSkKaXMgY2FsbGVkIGZvciBhIGRvbWFpbiB0aGF0IGlzIGluaXRpYWxs eSBvZmYgKGlzX29uID09IGZhbHNlKSwKcm9ja2NoaXBfZG9fcG11X3NldF9wb3dlcl9kb21haW4o cGQsIHRydWUpIGVuYWJsZXMgdGhlIGhhcmR3YXJlIHBvd2VyIHN3aXRjaAppbiBwbXUtPmluZm8t PnB3cl9vZmZzZXQgKyBwZF9wd3Jfb2Zmc2V0LCBtYWtpbmcgcm9ja2NoaXBfcG11X2RvbWFpbl9p c19vbihwZCkKcmV0dXJuIHRydWUuCgpJZiByb2NrY2hpcF9wbXVfc2V0X2lkbGVfcmVxdWVzdChw ZCwgZmFsc2UpIHN1YnNlcXVlbnRseSBmYWlscyBvbiBhIGRvbWFpbgp3aGVyZSBwZC0+aW5mby0+ ZmlyZXdhbGxfbWFzayBpcyAwIChzdWNoIGFzIHRoZSAibnZtMCIgYW5kICJudm0xIiBkb21haW5z IG9uCnJrMzU3Miwgb3IgZG9tYWlucyBvbiBvdGhlciBTb0NzKSwgb3IgaWYgcm9ja2NoaXBfZG9f cG11X3NldF9wb3dlcl9kb21haW4oKQpmYWlscyBpbiByb2NrY2hpcF9wbXVfZG9tYWluX21lbV9y ZXNldCgpIGFmdGVyIGVuYWJsaW5nIHRoZSBwb3dlciBzd2l0Y2gsCnBkLT5wb3dlcl9vbl9wZW5k aW5nIHJlbWFpbnMgZmFsc2Ugd2hlbiBqdW1waW5nIHRvIG91dC4KCklmIGEgbGF0ZXIgcG93ZXIt b24gcmV0cnkgY2FsbHMgcm9ja2NoaXBfcGRfcG93ZXIocGQsIHRydWUpLApyb2NrY2hpcF9wbXVf ZG9tYWluX2lzX29uKHBkKSB3aWxsIHJldHVybiB0cnVlIHdoaWxlIHBkLT5wb3dlcl9vbl9wZW5k aW5nIGlzCmZhbHNlOgoKCWlzX29uID0gcm9ja2NoaXBfcG11X2RvbWFpbl9pc19vbihwZCk7Cglp ZiAoaXNfb24gPT0gcG93ZXJfb24gJiYgIXBkLT5wb3dlcl9vbl9wZW5kaW5nKQoJCXJldHVybiAw OwoKV291bGRuJ3Qgcm9ja2NoaXBfcGRfcG93ZXIocGQsIHRydWUpIHRoZW4gcmV0dXJuIDAgaW1t ZWRpYXRlbHkgd2l0aG91dApkZWFzc2VydGluZyB0aGUgYnVzIGlkbGUgcmVxdWVzdCwgcmVzZXR0 aW5nIG1lbW9yeSwgd2FpdGluZyBmb3IgdGhlIGZpcmV3YWxsLApvciByZXN0b3JpbmcgUW9TIHJl Z2lzdGVycyB2aWEgcm9ja2NoaXBfcG11X3Jlc3RvcmVfcW9zKCk/IEZ1cnRoZXJtb3JlLCBpZgpy b2NrY2hpcF9wZF9wb3dlcihwZCwgZmFsc2UpIGlzIGNhbGxlZCBpbiB0aGF0IHN0YXRlLCB3b3Vs ZG4ndCB0aGUKIXBkLT5wb3dlcl9vbl9wZW5kaW5nIGNoZWNrIGFsbG93IHJvY2tjaGlwX3BtdV9z YXZlX3FvcyhwZCkgdG8gb3ZlcndyaXRlCnBkLT5xb3Nfc2F2ZV9yZWdzIHdpdGggdW5yZXN0b3Jl ZCB2YWx1ZXMgd2hpbGUgdGhlIGRvbWFpbiBpcyBzdGlsbCBpZGxlPwoKU2hvdWxkIHBkLT5wb3dl cl9vbl9wZW5kaW5nIGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgYmVmb3JlCnJvY2tjaGlwX2RvX3Bt dV9zZXRfcG93ZXJfZG9tYWluKHBkLCB0cnVlKSB3aGVuIHBvd2VyaW5nIG9uIGEgZG9tYWluPwoK PiAgCj4gKwkJcmV0ID0gcm9ja2NoaXBfcG11X3dhaXRfZmlyZXdhbGwocGQpOwo+ICsJCWlmIChy ZXQpCj4gKwkJCWdvdG8gb3V0Owo+ICsKPiAgCQlyb2NrY2hpcF9wbXVfcmVzdG9yZV9xb3MocGQp Owo+ICAJfQo+ICsJcGQtPnBvd2VyX29uX3BlbmRpbmcgPSBmYWxzZTsKPiAgCj4gIG91dDoKPiAg CXJvY2tjaGlwX3BtdV91bmdhdGVfY2xrKHBkLCBmYWxzZSk7CgpbIC4uLiBdCgotLSAKU2FzaGlr byBBSSByZXZpZXcgwrcgaHR0cHM6Ly9zYXNoaWtvLmRldi8jL3BhdGNoc2V0LzIwMjYxMDIyLWFk ZC1ib2FyZC1vazM1NzItYy12MS0wLTBiMGZkODVhMzFlZUBxcS5jb20/cGFydD0xMAoKLS0gCmxp bnV4LXBoeSBtYWlsaW5nIGxpc3QKbGludXgtcGh5QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cHM6 Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcGh5Cg==