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=1793877857; b=d5jZRBaiTBdWrrJoyeGv9uZm7mYq+Cp9zODDihkHQf179EI6ATX6oit2otG1oVSkscUw wcsTYu5R5MVpicR/MBYDfU32H2KmPJ9Mro6P2NUcRNwrN1gBwO0bhhsT7umic6Tc73iAM M8AP6SS5RaYp0LsweD6cGHElIxPKVSvQoDpeKuw4JPQ+MBCbixmB5801YkcDhJBaYxYg/ g/M748ynPkTVY56L5e82YLrRh1QGg1tyw0Nx4OKoM2reHx7GB6GFvWI3VbqE3f/xPyLr9 2ViTXUQGbbK3BPkmZdTcsctwdF2UEbLRzX2M2xyqLBy8gpoZEgFbhNoq6J0sBpKPV1g== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793877857; h=Received:DKIM-Signature:Message-ID:From:Subject:Reply-To:To:Cc: In-Reply-To:References:Content-Type:Content-Transfer-Encoding:Date; bh=2YI6RMQZB0W/UPBnilq8YC900utCDZtPN5nW3jVwPig=; b=y+n31JokvMm91n+cqZN49wlHqrh6H+0EcTfVW3s1v8pjBa9B3FRfRU4u4HH7cHaOQekR Jyt6yED3kUgrEcRhOg13v4C7sssEjTR/+26tnrTtBR3Dq9PjQqBgFCJ245CIbrpgTIJLX JbjEvQ7+944Mk94d9kC7DTb0D4iWk4is+QT6RXJ1P/rZCOPRRgK9x+EV2KqwQyZlfk9Sg qAam+VNojUWl+HNJaDx4+QH3zZhpKc7AeRN02mJyIfvxbUEwaYl3jIGBSV59NRiJY/K+P F7x7CnSqapKq/3CgvQ7CN3+hSFxsgY2D7oxhPwMPzhZrFc1zqK00jr+KgFu/YbmN4TQ== 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=aixkZOD1; 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 49C9C606A326 for ; Thu, 5 Nov 2026 11:24:17 +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=aixkZOD1 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 520C31F000C1; Thu, 5 Nov 2026 11:24:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1793877857; bh=2YI6RMQZB0W/UPBnilq8YC900utCDZtPN5nW3jVwPig=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=aixkZOD1UV0ZCgG1jr9toasQDfYGkBCrvuKaINmmrbYQ4ti2+3jpI2HU2ehS6iHiP E5AQy6yDpx8/SkSKlord/+VlPiqn4L5AnrzgKmm+AhPrFcxIlrPJu1zUyOs3iVvOWk ErqFKuLv93iMbQqZLwrf3GG6DgckpmiyOaUyacIqrbWHS/4s2bb1q2wNZrUqAmFixO 9Z4bWCJpelCVNOav585vu+LQPjtPO/AYGqMYORyYdW7Zq9MIIWYYAhN4A7kvtSv+r2 NMtoVCb8TQAOrrPYph7YkCYMmNfSAhD7HdXQ0AdcOIywkgKPLkb3I4jk4QNr8bRJIq xbXPGVYxrcUCQ== Message-ID: From: sashiko-bot@kernel.org Subject: Re: [PATCH v11 04/19] spi: spi-mem: teach spi_mem_adjust_op_freq() about post-config ops Reply-To: sashiko-reviews@lists.linux.dev To: "Santhosh Kumar K" , broonie@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, miquel.raynal@bootlin.com, richard@nod.at, vigneshr@ti.com, pratyush@kernel.org, mwalle@kernel.org, takahiro.kuwano@infineon.com Cc: devicetree@vger.kernel.org, linux-mtd@lists.infradead.org, praneeth@ti.com, sebin.francis@ti.com, u-kumar1@ti.com, srikanth.boyapally@amd.com, m-shah@ti.com In-Reply-To: <20261105105832.2134313-5-s-k6@ti.com> References: <20261105105832.2134313-1-s-k6@ti.com> <20261105105832.2134313-5-s-k6@ti.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Thu, 05 Nov 2026 11:24:15 +0000 X-Mailing-List: devicetree@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 3 potential issue(= s) to consider: - [Medium] spi: spi-mem: false per_op_freq failure when post_config equals = max_speed_hz - [Medium] spi: spi-mem: spi_mem_adjust_op_freq() conflates max_freq with p= ost-config - [Medium] spi: spi-mem: missing controller max_speed_hz check for post-con= fig ops -- commit 69ed76e4edf90b58e3385f80fa249633f3ea7445 Author: Santhosh Kumar K spi: spi-mem: teach spi_mem_adjust_op_freq() about post-config ops This commit extends spi_mem_adjust_op_freq() to bypass the max_speed_hz cap when op->max_freq matches post_config_max_speed_hz, and updates spi_mem_default_supports_op() to require the per_op_freq controller capability for post-config operations. > diff --git a/drivers/spi/spi-mem.c b/drivers/spi/spi-mem.c > index b94680b60af95..7916387a4f1d0 100644 > --- a/drivers/spi/spi-mem.c > +++ b/drivers/spi/spi-mem.c > @@ -206,7 +206,8 @@ bool spi_mem_default_supports_op(struct spi_mem *mem, > return false; > =20 > if (op->max_freq && > - op->max_freq < mem->spi->max_speed_hz) { > + (op->max_freq < mem->spi->max_speed_hz || > + op->max_freq =3D=3D mem->spi->post_config_max_speed_hz)) { > if (!spi_mem_controller_is_capable(ctlr, per_op_freq)) > return false; > } [Severity: Medium] As reported by Sashiko on v10 [1], what happens in spi_mem_default_supports_op() when mem->spi->post_config_max_speed_hz equals mem->spi->max_speed_hz on a controller that does not advertise per_op_freq = in ctlr->mem_caps? Both spi_mem_supports_op() and spi_mem_exec_op() call spi_mem_adjust_op_freq() before calling spi_mem_internal_supports_op() -> spi_mem_default_supports_op(). For any standard untuned operation where op->max_freq is 0 or exceeds mem->spi->max_speed_hz, spi_mem_adjust_op_freq= () sets: op->max_freq =3D mem->spi->max_speed_hz; If spi-max-frequency and spi-max-post-config-frequency-hz are configured to the same rate in Device Tree (or if __spi_setup() clamps spi->max_speed_hz = to ctlr->max_speed_hz matching post_config_max_speed_hz), then op->max_freq =3D=3D mem->spi->post_config_max_speed_hz evaluates to true for every operation even though op->max_freq is equal to the base rate mem->spi->max_speed_hz and no per-op frequency switching is needed. Wouldn't this cause spi_mem_default_supports_op() to reject all SPI memory operations with -EOPNOTSUPP on controllers without per_op_freq, and would checking op->max_freq !=3D mem->spi->max_speed_hz avoid this regression? > @@ -627,9 +628,18 @@ EXPORT_SYMBOL_GPL(spi_mem_adjust_op_size); > * Some chips have per-op frequency limitations and must adapt the maxim= um > * speed. This function allows SPI mem drivers to set @op->max_freq to t= he > * maximum supported value. > + * > + * When @mem->spi->post_config_max_speed_hz is set, ops with @op->max_fr= eq > + * equal to that value are treated as post-configuration ops (e.g. PHY-t= uned) > + * and are allowed to run at the full post-config rate. All other ops are > + * capped to @mem->spi->max_speed_hz, the always-reachable base rate. > */ > void spi_mem_adjust_op_freq(struct spi_mem *mem, struct spi_mem_op *op) > { > + if (mem->spi->post_config_max_speed_hz && > + op->max_freq =3D=3D mem->spi->post_config_max_speed_hz) > + return; [Severity: Medium] As reported by Sashiko on v6 [2], can identifying post-configuration operations in spi_mem_adjust_op_freq() purely by comparing op->max_freq =3D=3D mem->spi->post_config_max_speed_hz conflate static data= sheet frequency limits with tuned post-config operations? In drivers/spi/spi.c, of_spi_parse_dt() populates spi->post_config_max_speed_hz unconditionally during Device Tree parsing, before any SPI memory driver probes or runs controller tuning: if (!of_property_read_u32(nc, "spi-max-post-config-frequency-hz", &value)) spi->post_config_max_speed_hz =3D value; Meanwhile, flash drivers such as drivers/mtd/nand/spi/winbond.c define stat= ic op variant tables (e.g., read_cache_octal_variants) with non-zero datasheet max_freq values alongside unrestricted variants with max_freq =3D=3D 0: SPINAND_PAGE_READ_FROM_CACHE_8D_8D_8D_OP(0, 24, NULL, 0, 120 * HZ_PER_MHZ), SPINAND_PAGE_READ_FROM_CACHE_8D_8D_8D_OP(0, 16, NULL, 0, 86 * HZ_PER_MHZ), SPINAND_PAGE_READ_FROM_CACHE_1S_1D_8D_OP(0, 3, NULL, 0, 120 * HZ_PER_MHZ), SPINAND_PAGE_READ_FROM_CACHE_1S_1D_8D_OP(0, 2, NULL, 0, 105 * HZ_PER_MHZ), SPINAND_PAGE_READ_FROM_CACHE_1S_8S_8S_OP(0, 20, NULL, 0, 0), During initial chip detection in spinand_match_and_init() -> spinand_select_op_variant() -> spinand_op_find_best_variant() in drivers/mtd/nand/spi/core.c, each static variant is evaluated through spi_mem_adjust_op_freq(), spi_mem_supports_op(), and spi_mem_calc_op_duration() before tuning has occurred: spi_mem_adjust_op_freq(spinand->spimem, &op); if (!spi_mem_supports_op(spinand->spimem, &op)) break; nbytes -=3D op.data.nbytes; op_duration_ns +=3D spi_mem_calc_op_duration(spinand->spimem, &op); If a board configures spi-max-post-config-frequency-hz to a value that happens to match a static variant's datasheet max_freq while spi-max-frequency is set to a lower base rate, won't spi_mem_adjust_op_freq= () leave that variant uncapped while capping unrestricted variants (max_freq = =3D=3D 0) and other frequency-limited variants to max_speed_hz? That can skew spi_mem_calc_op_duration() into selecting a suboptimal variant, cause spi_mem_default_supports_op() to reject matching variants on controllers without per_op_freq, or allow an untuned op to execute at the post-config rate before tuning has succeeded. [Severity: Medium] As reported by Sashiko on v10 [3], does returning early in spi_mem_adjust_op_freq() when op->max_freq equals mem->spi->post_config_max_speed_hz bypass the controller's hardware maximum frequency limit (mem->spi->controller->max_speed_hz)? In drivers/spi/spi.c, __spi_setup() clamps spi->max_speed_hz to spi->controller->max_speed_hz: if (spi->controller->max_speed_hz && (!spi->max_speed_hz || spi->max_speed_hz > spi->controller->max_speed_hz)) spi->max_speed_hz =3D spi->controller->max_speed_hz; However, spi->post_config_max_speed_hz is never clamped to spi->controller->max_speed_hz, and spi_mem_default_supports_op() only checks mem->spi->controller->min_speed_hz: if (op->max_freq && mem->spi->controller->min_speed_hz && op->max_freq < mem->spi->controller->min_speed_hz) return false; If spi-max-post-config-frequency-hz in Device Tree exceeds mem->spi->controller->max_speed_hz, won't this early return pass an op->max_freq above the controller's maximum supported speed to spi_mem_supports_op(), spi_mem_calc_op_duration(), and ctlr->mem_ops->exec_op()? [1] https://lore.kernel.org/r/20260929063529.1235417-5-s-k6@ti.com [2] https://lore.kernel.org/r/20260723113443.06C2D1F000E9@smtp.kernel.org [3] https://lore.kernel.org/r/20260929063529.1235417-5-s-k6@ti.com --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20261105105832.2134= 313-1-s-k6@ti.com?part=3D4 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 CB354606A326 for ; Thu, 5 Nov 2026 11:24:19 +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=wqVB82GK; 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=aixkZOD1 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=OvkxvV1OZJWiEVKQP7EpOcele7qfWOnlOQ4s0BcsorY=; b=wqVB82GKIs3ig4uJDrBzdp7tAG hQ4Uv/Bf5DU4q+dj6PZTRg745QAepGsHN+GVZYazVasxbpHTjvjbAk/x+ekcWEkQYIQjdW2CF/Jan 6INAotK5ce4jeHIVo4pjc+UZR4MEI5+Iu8sF8pC6GuNo8+yz8m8Us0Wx/rUhn23pFwG/cxQ+txlmn lXwVeITgV9DbOO5f58nAU1h/E3f80w3/YM9K+zdNg9/KW1CrTMLlxNs/tVsF/7JDv3LvsUapMI9IW WHnwRNEJvxZcX3kzQmom/IUT8O36q4qCC931TxfrMAIBEHRs9SQAckWArAqEO22ae395tr9JcVWGO LVl56T+w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.100.1 #2 (Red Hat Linux)) id 1xOvZr-00000008dbL-0GKR; Thu, 05 Nov 2026 11:24:19 +0000 Received: from sea.source.kernel.org ([172.234.252.31]) by bombadil.infradead.org with esmtps (Exim 4.100.1 #2 (Red Hat Linux)) id 1xOvZp-00000008db9-2bXZ for linux-mtd@lists.infradead.org; Thu, 05 Nov 2026 11:24:17 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id 432EF41B60; Thu, 5 Nov 2026 11:24:17 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 520C31F000C1; Thu, 5 Nov 2026 11:24:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1793877857; bh=2YI6RMQZB0W/UPBnilq8YC900utCDZtPN5nW3jVwPig=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=aixkZOD1UV0ZCgG1jr9toasQDfYGkBCrvuKaINmmrbYQ4ti2+3jpI2HU2ehS6iHiP E5AQy6yDpx8/SkSKlord/+VlPiqn4L5AnrzgKmm+AhPrFcxIlrPJu1zUyOs3iVvOWk ErqFKuLv93iMbQqZLwrf3GG6DgckpmiyOaUyacIqrbWHS/4s2bb1q2wNZrUqAmFixO 9Z4bWCJpelCVNOav585vu+LQPjtPO/AYGqMYORyYdW7Zq9MIIWYYAhN4A7kvtSv+r2 NMtoVCb8TQAOrrPYph7YkCYMmNfSAhD7HdXQ0AdcOIywkgKPLkb3I4jk4QNr8bRJIq xbXPGVYxrcUCQ== Message-ID: From: sashiko-bot@kernel.org Subject: Re: [PATCH v11 04/19] spi: spi-mem: teach spi_mem_adjust_op_freq() about post-config ops To: "Santhosh Kumar K" , broonie@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, miquel.raynal@bootlin.com, richard@nod.at, vigneshr@ti.com, pratyush@kernel.org, mwalle@kernel.org, takahiro.kuwano@infineon.com Cc: devicetree@vger.kernel.org, linux-mtd@lists.infradead.org, praneeth@ti.com, sebin.francis@ti.com, u-kumar1@ti.com, srikanth.boyapally@amd.com, m-shah@ti.com In-Reply-To: <20261105105832.2134313-5-s-k6@ti.com> References: <20261105105832.2134313-1-s-k6@ti.com> <20261105105832.2134313-5-s-k6@ti.com> Date: Thu, 05 Nov 2026 11:24:15 +0000 X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion 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-mtd" 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 MyBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6Ci0gW01lZGl1bV0gc3BpOiBzcGktbWVt OiBmYWxzZSBwZXJfb3BfZnJlcSBmYWlsdXJlIHdoZW4gcG9zdF9jb25maWcgZXF1YWxzIG1heF9z cGVlZF9oegotIFtNZWRpdW1dIHNwaTogc3BpLW1lbTogc3BpX21lbV9hZGp1c3Rfb3BfZnJlcSgp IGNvbmZsYXRlcyBtYXhfZnJlcSB3aXRoIHBvc3QtY29uZmlnCi0gW01lZGl1bV0gc3BpOiBzcGkt bWVtOiBtaXNzaW5nIGNvbnRyb2xsZXIgbWF4X3NwZWVkX2h6IGNoZWNrIGZvciBwb3N0LWNvbmZp ZyBvcHMKLS0KCmNvbW1pdCA2OWVkNzZlNGVkZjkwYjU4ZTMzODVmODBmYTI0OTYzM2YzZWE3NDQ1 CkF1dGhvcjogU2FudGhvc2ggS3VtYXIgSyA8cy1rNkB0aS5jb20+CgpzcGk6IHNwaS1tZW06IHRl YWNoIHNwaV9tZW1fYWRqdXN0X29wX2ZyZXEoKSBhYm91dCBwb3N0LWNvbmZpZyBvcHMKClRoaXMg Y29tbWl0IGV4dGVuZHMgc3BpX21lbV9hZGp1c3Rfb3BfZnJlcSgpIHRvIGJ5cGFzcyB0aGUgbWF4 X3NwZWVkX2h6IGNhcAp3aGVuIG9wLT5tYXhfZnJlcSBtYXRjaGVzIHBvc3RfY29uZmlnX21heF9z cGVlZF9oeiwgYW5kIHVwZGF0ZXMKc3BpX21lbV9kZWZhdWx0X3N1cHBvcnRzX29wKCkgdG8gcmVx dWlyZSB0aGUgcGVyX29wX2ZyZXEgY29udHJvbGxlcgpjYXBhYmlsaXR5IGZvciBwb3N0LWNvbmZp ZyBvcGVyYXRpb25zLgoKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW1lbS5jIGIvZHJp dmVycy9zcGkvc3BpLW1lbS5jCj4gaW5kZXggYjk0NjgwYjYwYWY5NS4uNzkxNjM4N2E0ZjFkMCAx MDA2NDQKPiAtLS0gYS9kcml2ZXJzL3NwaS9zcGktbWVtLmMKPiArKysgYi9kcml2ZXJzL3NwaS9z cGktbWVtLmMKPiBAQCAtMjA2LDcgKzIwNiw4IEBAIGJvb2wgc3BpX21lbV9kZWZhdWx0X3N1cHBv cnRzX29wKHN0cnVjdCBzcGlfbWVtICptZW0sCj4gIAkJcmV0dXJuIGZhbHNlOwo+ICAKPiAgCWlm IChvcC0+bWF4X2ZyZXEgJiYKPiAtCSAgICBvcC0+bWF4X2ZyZXEgPCBtZW0tPnNwaS0+bWF4X3Nw ZWVkX2h6KSB7Cj4gKwkgICAgKG9wLT5tYXhfZnJlcSA8IG1lbS0+c3BpLT5tYXhfc3BlZWRfaHog fHwKPiArCSAgICAgb3AtPm1heF9mcmVxID09IG1lbS0+c3BpLT5wb3N0X2NvbmZpZ19tYXhfc3Bl ZWRfaHopKSB7Cj4gIAkJaWYgKCFzcGlfbWVtX2NvbnRyb2xsZXJfaXNfY2FwYWJsZShjdGxyLCBw ZXJfb3BfZnJlcSkpCj4gIAkJCXJldHVybiBmYWxzZTsKPiAgCX0KCltTZXZlcml0eTogTWVkaXVt XQpBcyByZXBvcnRlZCBieSBTYXNoaWtvIG9uIHYxMCBbMV0sIHdoYXQgaGFwcGVucyBpbgpzcGlf bWVtX2RlZmF1bHRfc3VwcG9ydHNfb3AoKSB3aGVuIG1lbS0+c3BpLT5wb3N0X2NvbmZpZ19tYXhf c3BlZWRfaHogZXF1YWxzCm1lbS0+c3BpLT5tYXhfc3BlZWRfaHogb24gYSBjb250cm9sbGVyIHRo YXQgZG9lcyBub3QgYWR2ZXJ0aXNlIHBlcl9vcF9mcmVxIGluCmN0bHItPm1lbV9jYXBzPwoKQm90 aCBzcGlfbWVtX3N1cHBvcnRzX29wKCkgYW5kIHNwaV9tZW1fZXhlY19vcCgpIGNhbGwKc3BpX21l bV9hZGp1c3Rfb3BfZnJlcSgpIGJlZm9yZSBjYWxsaW5nIHNwaV9tZW1faW50ZXJuYWxfc3VwcG9y dHNfb3AoKSAtPgpzcGlfbWVtX2RlZmF1bHRfc3VwcG9ydHNfb3AoKS4gRm9yIGFueSBzdGFuZGFy ZCB1bnR1bmVkIG9wZXJhdGlvbiB3aGVyZQpvcC0+bWF4X2ZyZXEgaXMgMCBvciBleGNlZWRzIG1l bS0+c3BpLT5tYXhfc3BlZWRfaHosIHNwaV9tZW1fYWRqdXN0X29wX2ZyZXEoKQpzZXRzOgoKCW9w LT5tYXhfZnJlcSA9IG1lbS0+c3BpLT5tYXhfc3BlZWRfaHo7CgpJZiBzcGktbWF4LWZyZXF1ZW5j eSBhbmQgc3BpLW1heC1wb3N0LWNvbmZpZy1mcmVxdWVuY3ktaHogYXJlIGNvbmZpZ3VyZWQgdG8K dGhlIHNhbWUgcmF0ZSBpbiBEZXZpY2UgVHJlZSAob3IgaWYgX19zcGlfc2V0dXAoKSBjbGFtcHMg c3BpLT5tYXhfc3BlZWRfaHogdG8KY3Rsci0+bWF4X3NwZWVkX2h6IG1hdGNoaW5nIHBvc3RfY29u ZmlnX21heF9zcGVlZF9oeiksIHRoZW4Kb3AtPm1heF9mcmVxID09IG1lbS0+c3BpLT5wb3N0X2Nv bmZpZ19tYXhfc3BlZWRfaHogZXZhbHVhdGVzIHRvIHRydWUgZm9yCmV2ZXJ5IG9wZXJhdGlvbiBl dmVuIHRob3VnaCBvcC0+bWF4X2ZyZXEgaXMgZXF1YWwgdG8gdGhlIGJhc2UgcmF0ZQptZW0tPnNw aS0+bWF4X3NwZWVkX2h6IGFuZCBubyBwZXItb3AgZnJlcXVlbmN5IHN3aXRjaGluZyBpcyBuZWVk ZWQuCgpXb3VsZG4ndCB0aGlzIGNhdXNlIHNwaV9tZW1fZGVmYXVsdF9zdXBwb3J0c19vcCgpIHRv IHJlamVjdCBhbGwgU1BJIG1lbW9yeQpvcGVyYXRpb25zIHdpdGggLUVPUE5PVFNVUFAgb24gY29u dHJvbGxlcnMgd2l0aG91dCBwZXJfb3BfZnJlcSwgYW5kIHdvdWxkCmNoZWNraW5nIG9wLT5tYXhf ZnJlcSAhPSBtZW0tPnNwaS0+bWF4X3NwZWVkX2h6IGF2b2lkIHRoaXMgcmVncmVzc2lvbj8KCj4g QEAgLTYyNyw5ICs2MjgsMTggQEAgRVhQT1JUX1NZTUJPTF9HUEwoc3BpX21lbV9hZGp1c3Rfb3Bf c2l6ZSk7Cj4gICAqIFNvbWUgY2hpcHMgaGF2ZSBwZXItb3AgZnJlcXVlbmN5IGxpbWl0YXRpb25z IGFuZCBtdXN0IGFkYXB0IHRoZSBtYXhpbXVtCj4gICAqIHNwZWVkLiBUaGlzIGZ1bmN0aW9uIGFs bG93cyBTUEkgbWVtIGRyaXZlcnMgdG8gc2V0IEBvcC0+bWF4X2ZyZXEgdG8gdGhlCj4gICAqIG1h eGltdW0gc3VwcG9ydGVkIHZhbHVlLgo+ICsgKgo+ICsgKiBXaGVuIEBtZW0tPnNwaS0+cG9zdF9j b25maWdfbWF4X3NwZWVkX2h6IGlzIHNldCwgb3BzIHdpdGggQG9wLT5tYXhfZnJlcQo+ICsgKiBl cXVhbCB0byB0aGF0IHZhbHVlIGFyZSB0cmVhdGVkIGFzIHBvc3QtY29uZmlndXJhdGlvbiBvcHMg KGUuZy4gUEhZLXR1bmVkKQo+ICsgKiBhbmQgYXJlIGFsbG93ZWQgdG8gcnVuIGF0IHRoZSBmdWxs IHBvc3QtY29uZmlnIHJhdGUuIEFsbCBvdGhlciBvcHMgYXJlCj4gKyAqIGNhcHBlZCB0byBAbWVt LT5zcGktPm1heF9zcGVlZF9oeiwgdGhlIGFsd2F5cy1yZWFjaGFibGUgYmFzZSByYXRlLgo+ICAg Ki8KPiAgdm9pZCBzcGlfbWVtX2FkanVzdF9vcF9mcmVxKHN0cnVjdCBzcGlfbWVtICptZW0sIHN0 cnVjdCBzcGlfbWVtX29wICpvcCkKPiAgewo+ICsJaWYgKG1lbS0+c3BpLT5wb3N0X2NvbmZpZ19t YXhfc3BlZWRfaHogJiYKPiArCSAgICBvcC0+bWF4X2ZyZXEgPT0gbWVtLT5zcGktPnBvc3RfY29u ZmlnX21heF9zcGVlZF9oeikKPiArCQlyZXR1cm47CgpbU2V2ZXJpdHk6IE1lZGl1bV0KQXMgcmVw b3J0ZWQgYnkgU2FzaGlrbyBvbiB2NiBbMl0sIGNhbiBpZGVudGlmeWluZyBwb3N0LWNvbmZpZ3Vy YXRpb24Kb3BlcmF0aW9ucyBpbiBzcGlfbWVtX2FkanVzdF9vcF9mcmVxKCkgcHVyZWx5IGJ5IGNv bXBhcmluZwpvcC0+bWF4X2ZyZXEgPT0gbWVtLT5zcGktPnBvc3RfY29uZmlnX21heF9zcGVlZF9o eiBjb25mbGF0ZSBzdGF0aWMgZGF0YXNoZWV0CmZyZXF1ZW5jeSBsaW1pdHMgd2l0aCB0dW5lZCBw b3N0LWNvbmZpZyBvcGVyYXRpb25zPwoKSW4gZHJpdmVycy9zcGkvc3BpLmMsIG9mX3NwaV9wYXJz ZV9kdCgpIHBvcHVsYXRlcwpzcGktPnBvc3RfY29uZmlnX21heF9zcGVlZF9oeiB1bmNvbmRpdGlv bmFsbHkgZHVyaW5nIERldmljZSBUcmVlIHBhcnNpbmcsCmJlZm9yZSBhbnkgU1BJIG1lbW9yeSBk cml2ZXIgcHJvYmVzIG9yIHJ1bnMgY29udHJvbGxlciB0dW5pbmc6CgoJaWYgKCFvZl9wcm9wZXJ0 eV9yZWFkX3UzMihuYywgInNwaS1tYXgtcG9zdC1jb25maWctZnJlcXVlbmN5LWh6IiwgJnZhbHVl KSkKCQlzcGktPnBvc3RfY29uZmlnX21heF9zcGVlZF9oeiA9IHZhbHVlOwoKTWVhbndoaWxlLCBm bGFzaCBkcml2ZXJzIHN1Y2ggYXMgZHJpdmVycy9tdGQvbmFuZC9zcGkvd2luYm9uZC5jIGRlZmlu ZSBzdGF0aWMKb3AgdmFyaWFudCB0YWJsZXMgKGUuZy4sIHJlYWRfY2FjaGVfb2N0YWxfdmFyaWFu dHMpIHdpdGggbm9uLXplcm8gZGF0YXNoZWV0Cm1heF9mcmVxIHZhbHVlcyBhbG9uZ3NpZGUgdW5y ZXN0cmljdGVkIHZhcmlhbnRzIHdpdGggbWF4X2ZyZXEgPT0gMDoKCglTUElOQU5EX1BBR0VfUkVB RF9GUk9NX0NBQ0hFXzhEXzhEXzhEX09QKDAsIDI0LCBOVUxMLCAwLCAxMjAgKiBIWl9QRVJfTUha KSwKCVNQSU5BTkRfUEFHRV9SRUFEX0ZST01fQ0FDSEVfOERfOERfOERfT1AoMCwgMTYsIE5VTEws IDAsIDg2ICogSFpfUEVSX01IWiksCglTUElOQU5EX1BBR0VfUkVBRF9GUk9NX0NBQ0hFXzFTXzFE XzhEX09QKDAsIDMsIE5VTEwsIDAsIDEyMCAqIEhaX1BFUl9NSFopLAoJU1BJTkFORF9QQUdFX1JF QURfRlJPTV9DQUNIRV8xU18xRF84RF9PUCgwLCAyLCBOVUxMLCAwLCAxMDUgKiBIWl9QRVJfTUha KSwKCVNQSU5BTkRfUEFHRV9SRUFEX0ZST01fQ0FDSEVfMVNfOFNfOFNfT1AoMCwgMjAsIE5VTEws IDAsIDApLAoKRHVyaW5nIGluaXRpYWwgY2hpcCBkZXRlY3Rpb24gaW4gc3BpbmFuZF9tYXRjaF9h bmRfaW5pdCgpIC0+CnNwaW5hbmRfc2VsZWN0X29wX3ZhcmlhbnQoKSAtPiBzcGluYW5kX29wX2Zp bmRfYmVzdF92YXJpYW50KCkgaW4KZHJpdmVycy9tdGQvbmFuZC9zcGkvY29yZS5jLCBlYWNoIHN0 YXRpYyB2YXJpYW50IGlzIGV2YWx1YXRlZCB0aHJvdWdoCnNwaV9tZW1fYWRqdXN0X29wX2ZyZXEo KSwgc3BpX21lbV9zdXBwb3J0c19vcCgpLCBhbmQKc3BpX21lbV9jYWxjX29wX2R1cmF0aW9uKCkg YmVmb3JlIHR1bmluZyBoYXMgb2NjdXJyZWQ6CgoJc3BpX21lbV9hZGp1c3Rfb3BfZnJlcShzcGlu YW5kLT5zcGltZW0sICZvcCk7CgoJaWYgKCFzcGlfbWVtX3N1cHBvcnRzX29wKHNwaW5hbmQtPnNw aW1lbSwgJm9wKSkKCQlicmVhazsKCgluYnl0ZXMgLT0gb3AuZGF0YS5uYnl0ZXM7CgoJb3BfZHVy YXRpb25fbnMgKz0gc3BpX21lbV9jYWxjX29wX2R1cmF0aW9uKHNwaW5hbmQtPnNwaW1lbSwgJm9w KTsKCklmIGEgYm9hcmQgY29uZmlndXJlcyBzcGktbWF4LXBvc3QtY29uZmlnLWZyZXF1ZW5jeS1o eiB0byBhIHZhbHVlIHRoYXQKaGFwcGVucyB0byBtYXRjaCBhIHN0YXRpYyB2YXJpYW50J3MgZGF0 YXNoZWV0IG1heF9mcmVxIHdoaWxlCnNwaS1tYXgtZnJlcXVlbmN5IGlzIHNldCB0byBhIGxvd2Vy IGJhc2UgcmF0ZSwgd29uJ3Qgc3BpX21lbV9hZGp1c3Rfb3BfZnJlcSgpCmxlYXZlIHRoYXQgdmFy aWFudCB1bmNhcHBlZCB3aGlsZSBjYXBwaW5nIHVucmVzdHJpY3RlZCB2YXJpYW50cyAobWF4X2Zy ZXEgPT0KMCkgYW5kIG90aGVyIGZyZXF1ZW5jeS1saW1pdGVkIHZhcmlhbnRzIHRvIG1heF9zcGVl ZF9oej8gVGhhdCBjYW4gc2tldwpzcGlfbWVtX2NhbGNfb3BfZHVyYXRpb24oKSBpbnRvIHNlbGVj dGluZyBhIHN1Ym9wdGltYWwgdmFyaWFudCwgY2F1c2UKc3BpX21lbV9kZWZhdWx0X3N1cHBvcnRz X29wKCkgdG8gcmVqZWN0IG1hdGNoaW5nIHZhcmlhbnRzIG9uIGNvbnRyb2xsZXJzCndpdGhvdXQg cGVyX29wX2ZyZXEsIG9yIGFsbG93IGFuIHVudHVuZWQgb3AgdG8gZXhlY3V0ZSBhdCB0aGUgcG9z dC1jb25maWcKcmF0ZSBiZWZvcmUgdHVuaW5nIGhhcyBzdWNjZWVkZWQuCgpbU2V2ZXJpdHk6IE1l ZGl1bV0KQXMgcmVwb3J0ZWQgYnkgU2FzaGlrbyBvbiB2MTAgWzNdLCBkb2VzIHJldHVybmluZyBl YXJseSBpbgpzcGlfbWVtX2FkanVzdF9vcF9mcmVxKCkgd2hlbiBvcC0+bWF4X2ZyZXEgZXF1YWxz Cm1lbS0+c3BpLT5wb3N0X2NvbmZpZ19tYXhfc3BlZWRfaHogYnlwYXNzIHRoZSBjb250cm9sbGVy J3MgaGFyZHdhcmUgbWF4aW11bQpmcmVxdWVuY3kgbGltaXQgKG1lbS0+c3BpLT5jb250cm9sbGVy LT5tYXhfc3BlZWRfaHopPwoKSW4gZHJpdmVycy9zcGkvc3BpLmMsIF9fc3BpX3NldHVwKCkgY2xh bXBzIHNwaS0+bWF4X3NwZWVkX2h6IHRvCnNwaS0+Y29udHJvbGxlci0+bWF4X3NwZWVkX2h6OgoK CWlmIChzcGktPmNvbnRyb2xsZXItPm1heF9zcGVlZF9oeiAmJgoJICAgICghc3BpLT5tYXhfc3Bl ZWRfaHogfHwKCSAgICAgc3BpLT5tYXhfc3BlZWRfaHogPiBzcGktPmNvbnRyb2xsZXItPm1heF9z cGVlZF9oeikpCgkJc3BpLT5tYXhfc3BlZWRfaHogPSBzcGktPmNvbnRyb2xsZXItPm1heF9zcGVl ZF9oejsKCkhvd2V2ZXIsIHNwaS0+cG9zdF9jb25maWdfbWF4X3NwZWVkX2h6IGlzIG5ldmVyIGNs YW1wZWQgdG8Kc3BpLT5jb250cm9sbGVyLT5tYXhfc3BlZWRfaHosIGFuZCBzcGlfbWVtX2RlZmF1 bHRfc3VwcG9ydHNfb3AoKSBvbmx5IGNoZWNrcwptZW0tPnNwaS0+Y29udHJvbGxlci0+bWluX3Nw ZWVkX2h6OgoKCWlmIChvcC0+bWF4X2ZyZXEgJiYgbWVtLT5zcGktPmNvbnRyb2xsZXItPm1pbl9z cGVlZF9oeiAmJgoJICAgIG9wLT5tYXhfZnJlcSA8IG1lbS0+c3BpLT5jb250cm9sbGVyLT5taW5f c3BlZWRfaHopCgkJcmV0dXJuIGZhbHNlOwoKSWYgc3BpLW1heC1wb3N0LWNvbmZpZy1mcmVxdWVu Y3ktaHogaW4gRGV2aWNlIFRyZWUgZXhjZWVkcwptZW0tPnNwaS0+Y29udHJvbGxlci0+bWF4X3Nw ZWVkX2h6LCB3b24ndCB0aGlzIGVhcmx5IHJldHVybiBwYXNzIGFuCm9wLT5tYXhfZnJlcSBhYm92 ZSB0aGUgY29udHJvbGxlcidzIG1heGltdW0gc3VwcG9ydGVkIHNwZWVkIHRvCnNwaV9tZW1fc3Vw cG9ydHNfb3AoKSwgc3BpX21lbV9jYWxjX29wX2R1cmF0aW9uKCksIGFuZApjdGxyLT5tZW1fb3Bz LT5leGVjX29wKCk/CgpbMV0gaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvci8yMDI2MDkyOTA2MzUy OS4xMjM1NDE3LTUtcy1rNkB0aS5jb20KWzJdIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL3IvMjAy NjA3MjMxMTM0NDMuMDZDMkQxRjAwMEU5QHNtdHAua2VybmVsLm9yZwpbM10gaHR0cHM6Ly9sb3Jl Lmtlcm5lbC5vcmcvci8yMDI2MDkyOTA2MzUyOS4xMjM1NDE3LTUtcy1rNkB0aS5jb20KCi0tIApT YXNoaWtvIEFJIHJldmlldyDCtyBodHRwczovL3Nhc2hpa28uZGV2LyMvcGF0Y2hzZXQvMjAyNjEx MDUxMDU4MzIuMjEzNDMxMy0xLXMtazZAdGkuY29tP3BhcnQ9NAoKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4IE1URCBkaXNjdXNzaW9u IG1haWxpbmcgbGlzdApodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2xpbnV4LW10ZC8K