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=1794300096; b=1cvYBwTG2oYSiMEpA+jIvoxl7X/6XrHOEwo05c5U7RKbTjj9RVxKEhUa2h5O92s+kK5b PYIv8dEl5eZ+HDyc1RWA20e+ioEpQhThAQp9AEWvxmSB1Idi2Ea4x+i8AzEbOAwpJBgL0 Ix3jd9SJ7WTDMV8leLIzioZGEUnWfdcy7aXurb+Bo65Yf3KFsa6iDcY6ewahbBwO2CP8H DB7y7n21tKB6HVo6vRLt5vG9GDWSb5doqg+DFXen/A2yVdybtIh2wlR4fFGYrIB/bbobB 56f0t+jfNprKVlIQxZ5K7bFdvTfR+zBy1T0En8XhIkqZFahqLX3Ayjmw3phaKfd0W/g== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794300096; h=Received:DKIM-Signature:Message-ID:From:Subject:Reply-To:To:Cc: In-Reply-To:References:Content-Type:Content-Transfer-Encoding:Date; bh=9rgKTlMw6fcRUkwTOQ8CZeZpTsNKklCiCM9n3CCbhXk=; b=A3EqlpmM0PUifYX4c0DqA8uXq5B2SOK4KTlODn8NHwoO83O1pqiiae9BG7iduUDIS08V cEr3CLnhR2of6PpFd04/wLw671DTLVXbt68YZwAycrB6zomm+NoWY3kRUSVJhGUzTcMbI BYp+YCfzsF6L4x43DEG8gbqE2btE2+aD9u1JlFmiwPCyHYK8yPv+/TvXET4jXKk+O2+Vf 1lWRXzMYg08WwSuRTCmO9OY+2RTdfRtkLib/340eRBn2SClAQASX2zrqFtxA+QFhvUdzY H6IpWLy2ZTKXLU8Ad/kxi8akyAxCLn2gYlpFc4Z8t/mbhVFi17GZgp43S4L3dCw2z7Q== 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=SojWknHx; 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 D9CAD606A31C for ; Tue, 10 Nov 2026 08:41:35 +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=SojWknHx Received: by smtp.kernel.org (Postfix) with ESMTPSA id 140D11F0089F; Tue, 10 Nov 2026 08:41:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1794300095; bh=9rgKTlMw6fcRUkwTOQ8CZeZpTsNKklCiCM9n3CCbhXk=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=SojWknHxjS4uEng8btn35+eRYdK06tIb2Mmsme34lyTvTpyi1NCltR+0XOuUAlL+/ y6iJXRYPGGKQ6CkWyEejqCz0slbgNWrmWli8H4wI2AgQSoUKpftiK3k0HxPJ7Jz7iS 4alOle1RSFCFiaWj+BN8mSePq0VQ9NuVAS+Mn96CdBKhnCDksozHxXa4szfE/FAjgn kMooxubWz8MyXSXY//5Hjmh6ydmCW5m7VyXzJBV+o3jJzGSA9t8+3JhZ6YpYREMbpM A5Z531gYThchvZANKk6LTEE3IO5sBTM1ckI1OM9/p60YQ7aYDReH6QptJLoVefFOr2 HoK2ieeOBYLrg== Message-ID: From: sashiko-bot@kernel.org Subject: Re: [PATCH v8 2/2] i2c: amlogic: Add Amlogic A9 I2C controller driver Reply-To: sashiko-reviews@lists.linux.dev To: "Xianwei Zhao" Cc: linux-amlogic@lists.infradead.org, devicetree@vger.kernel.org, robh@kernel.org, conor+dt@kernel.org, neil.armstrong@linaro.org In-Reply-To: <20261110-a9-i2c-v8-2-1e9d2682f86b@amlogic.com> References: <20261110-a9-i2c-v8-0-1e9d2682f86b@amlogic.com> <20261110-a9-i2c-v8-2-1e9d2682f86b@amlogic.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Tue, 10 Nov 2026 08:41:34 +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 2 potential issues to consider: - [Medium] i2c: amlogic-a9: transfer started before IRQ setup in aml_i2c_do_start() - [Medium] i2c: amlogic-a9: stale irq_state and edge IRQ miss in aml_i2c_irq() -- commit 75985e9b577bcde7a76a8a6f844a5a7564d2426a Author: Junyi Zhao i2c: amlogic: Add Amlogic A9 I2C controller driver This commit adds an I2C controller driver for Amlogic A9 SoCs along with its Kconfig, Makefile, and MAINTAINERS entries. > diff --git a/drivers/i2c/busses/i2c-amlogic-a9.c b/drivers/i2c/busses/i2c= -amlogic-a9.c > new file mode 100644 > index 0000000000000..3e08a0333ceea > --- /dev/null > +++ b/drivers/i2c/busses/i2c-amlogic-a9.c [ ... ] > +static irqreturn_t aml_i2c_irq(int irqno, void *dev_id) > +{ > + struct aml_i2c *i2c =3D dev_id; > + u8 *buf =3D NULL; > + u32 rd_len, i; > + u32 rd_val; > + u32 irq_state; > + > + spin_lock(&i2c->lock); > + irq_state =3D readl(i2c->regs + REG_CFG_IRQ_STATE); > + if (i2c->state =3D=3D A9_STATE_IDLE) { > + dev_warn(i2c->dev, "i2c irq triggered abnormally, irq_state:0x%x,irq_e= n:0x%x\n", > + irq_state, readl(i2c->regs + REG_CFG_IRQ_ENABLE)); > + goto irq_trans_out; > + } > + > + if (irq_state & A9_TRANS_ERROR) { > + i2c->error =3D -ENXIO; > + goto complete_irq_out; > + } > + > + switch (i2c->state) { > + case A9_STATE_READ: > + buf =3D i2c->msg->buf; > + rd_len =3D min(i2c->msg->len - i2c->pos, A9_I2C_FIFO_DEPTH); > + for (i =3D 0; i < rd_len; i++) { > + rd_val =3D readl(i2c->regs + REG_CFG_RX); > + buf[i2c->pos++] =3D rd_val & TX_RX_DATA; > + } > + /* Rx must clear thresh after read fifo */ > + clear_irq_status(i2c, A9_RX_THRESH_READ); > + break; > + case A9_STATE_WRITE: > + aml_i2c_prepare_xfer(i2c, A9_FIFO_FILL_HALF); > + if (i2c->pos =3D=3D i2c->msg->len) > + aml_i2c_set_mask(i2c, REG_CFG_IRQ_ENABLE, A9_TX_THRESH_WRITE, 0); > + /* Tx must clear thresh after write fifo */ > + clear_irq_status(i2c, A9_TX_THRESH_WRITE); > + break; > + default: > + break; > + } > + > + if (!(irq_state & A9_TRANS_DONE) || > + (i2c->state =3D=3D A9_STATE_READ && i2c->pos < i2c->msg->len)) { > + spin_unlock(&i2c->lock); > + return IRQ_HANDLED; > + } [Severity: Medium] Can multi-chunk reads (msg->len > A9_I2C_FIFO_DEPTH) miss the completion interrupt and time out in aml_i2c_xfer_msg()? Documentation/devicetree/bindings/i2c/amlogic,a9-i2c.yaml: interrupts =3D <0 164 1>; The interrupt is rising-edge-triggered (IRQ_TYPE_EDGE_RISING), so the controller's enabled interrupt output must drop to 0 and transition back to= 1 to latch a new interrupt in the GIC. In aml_i2c_irq(), irq_state is sampled once before draining up to 32 bytes from REG_CFG_RX. On a 64-byte read, the 32nd byte of the second chunk asse= rts A9_RX_THRESH_READ before the final NACK and STOP finish on the bus. If A9_PHY_DONE asserts while the handler is reading REG_CFG_RX, prior to clear_irq_status(i2c, A9_RX_THRESH_READ), the interrupt output stays continuously high across the clear without generating a new rising edge, wh= ile aml_i2c_irq() checks the stale irq_state snapshot and returns without completing i2c->done. Similarly, if both A9_RX_THRESH_READ and A9_PHY_DONE are already set in irq_state while more than 32 bytes remain to be read, aml_i2c_irq() reads 32 bytes, clears only A9_RX_THRESH_READ, and returns early because i2c->pos < i2c->msg->len. Because A9_PHY_DONE remains asserted in REG_CFG_IRQ_STATE a= nd fewer than 32 tail bytes remain in the FIFO, no new rising edge is generated and wait_for_completion_timeout() hangs for 500 ms before returning -ETIMEDOUT. > + > +complete_irq_out: > + i2c->state =3D A9_STATE_IDLE; > + reset_fifo_pos(i2c); > + aml_i2c_set_mask(i2c, REG_CFG_IRQ_ENABLE, A9_RX_THRESH_READ | A9_TX_THR= ESH_WRITE, 0); > + complete(&i2c->done); > +irq_trans_out: > + clear_irq_status(i2c, IRQ_ALL_MASK); > + spin_unlock(&i2c->lock); > + > + return IRQ_HANDLED; > +} > + > +static void aml_i2c_do_start(struct aml_i2c *i2c, struct i2c_msg *msg) > +{ > + unsigned int reg_val; > + unsigned int trans_len; > + > + trans_len =3D msg->len; > + reg_val =3D (unsigned int)(((msg->addr & 0x7f) << START_SADDR_SHIFT) | > + ((msg->flags & I2C_M_RD) ? START_READ : 0) | > + ((trans_len & 0xfff) << START_LEN_SHIFT) | START_START); > + aml_i2c_set_mask(i2c, REG_CFG_START, > + START_START | START_SLAVE_ADDR | START_READ | START_LEN, reg_val); > + clear_irq_status(i2c, IRQ_ALL_MASK); > + /* enable thresh mode */ > + if (trans_len > A9_I2C_FIFO_DEPTH) { > + reg_val =3D (msg->flags & I2C_M_RD) ? A9_RX_THRESH_READ : A9_TX_THRESH= _WRITE; > + aml_i2c_set_mask(i2c, REG_CFG_IRQ_ENABLE, > + A9_RX_THRESH_READ | A9_TX_THRESH_WRITE, reg_val); > + } > +} [Severity: Medium] Does writing START_START to REG_CFG_START before clearing IRQ_ALL_MASK and enabling threshold interrupts race with hardware completion or NACK? If execution is delayed between writing REG_CFG_START and calling clear_irq_status(i2c, IRQ_ALL_MASK) (for example due to vCPU preemption or PREEMPT_RT spinlock preemption), an address NACK or short transfer can asse= rt A9_NCK_ERROR or A9_PHY_DONE and then have its status bits wiped out by clear_irq_status(). When aml_i2c_irq() then runs, it reads irq_state =3D= =3D 0, misses A9_TRANS_ERROR or A9_TRANS_DONE, and returns without completing i2c->done, causing wait_for_completion_timeout() to time out. Clearing REG_CFG_IRQ_STATE and configuring REG_CFG_IRQ_ENABLE before asserting START_START avoids this window. --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20261110-a9-i2c-v8-= 0-1e9d2682f86b@amlogic.com?part=3D2 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 E4D37606A31C for ; Tue, 10 Nov 2026 08:41:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=xGND2abm; dkim=fail reason="signature verification failed" (2048-bit key) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=SojWknHx 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=Tz/Sm0OFTj1VmuGd+GwQzYwRGFC6z3XTYYmI0e5euv8=; b=xGND2abmjS+61XmuSy3dNLUI9w yuXOb9xCOEUqGfPQPf5DkPB4jsnwW3CGPzMO+mRfdHEOt6/PphS9SyvcpGr6ZB2vykWJfGjeAPRrY MM2kiV+ydQSapmoMnp2pgTFd678yEDG5RATUyhX9KgHKiC2OI6Qg8S/qrgnfDGZUMoRdohrNYDwh+ hRcbvaPEloXmDWKy8oP1BNcl6P82kDalq4Ms6vum5z6teDQxDQBWRHYJmU5aDFzZyIwI819jFUd47 1fUsEVlLP+fEoECgNbmIVREOv9bGCjHuvyo6O2IadJQ4sj4gVa+NKoVePloKg2PUagdg7O5eXTxYd hCSpi1Ww==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.100.1 #2 (Red Hat Linux)) id 1xQhQA-000000039CW-2uXt; Tue, 10 Nov 2026 08:41:38 +0000 Received: from tor.source.kernel.org ([172.105.4.254]) by bombadil.infradead.org with esmtps (Exim 4.100.1 #2 (Red Hat Linux)) id 1xQhQ9-000000039CL-1kOo for linux-amlogic@lists.infradead.org; Tue, 10 Nov 2026 08:41:37 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by tor.source.kernel.org (Postfix) with ESMTP id BBB6D61449; Tue, 10 Nov 2026 08:41:35 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 140D11F0089F; Tue, 10 Nov 2026 08:41:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1794300095; bh=9rgKTlMw6fcRUkwTOQ8CZeZpTsNKklCiCM9n3CCbhXk=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=SojWknHxjS4uEng8btn35+eRYdK06tIb2Mmsme34lyTvTpyi1NCltR+0XOuUAlL+/ y6iJXRYPGGKQ6CkWyEejqCz0slbgNWrmWli8H4wI2AgQSoUKpftiK3k0HxPJ7Jz7iS 4alOle1RSFCFiaWj+BN8mSePq0VQ9NuVAS+Mn96CdBKhnCDksozHxXa4szfE/FAjgn kMooxubWz8MyXSXY//5Hjmh6ydmCW5m7VyXzJBV+o3jJzGSA9t8+3JhZ6YpYREMbpM A5Z531gYThchvZANKk6LTEE3IO5sBTM1ckI1OM9/p60YQ7aYDReH6QptJLoVefFOr2 HoK2ieeOBYLrg== Message-ID: From: sashiko-bot@kernel.org Subject: Re: [PATCH v8 2/2] i2c: amlogic: Add Amlogic A9 I2C controller driver To: "Xianwei Zhao" Cc: linux-amlogic@lists.infradead.org, devicetree@vger.kernel.org, robh@kernel.org, conor+dt@kernel.org, neil.armstrong@linaro.org In-Reply-To: <20261110-a9-i2c-v8-2-1e9d2682f86b@amlogic.com> References: <20261110-a9-i2c-v8-0-1e9d2682f86b@amlogic.com> <20261110-a9-i2c-v8-2-1e9d2682f86b@amlogic.com> Date: Tue, 10 Nov 2026 08:41:34 +0000 X-BeenThere: linux-amlogic@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: 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-amlogic" 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 MiBwb3RlbnRpYWwKaXNzdWVzIHRvIGNvbnNpZGVyOgotIFtNZWRpdW1dIGkyYzogYW1sb2dpYy1h OTogdHJhbnNmZXIgc3RhcnRlZCBiZWZvcmUgSVJRIHNldHVwIGluCiAgYW1sX2kyY19kb19zdGFy dCgpCi0gW01lZGl1bV0gaTJjOiBhbWxvZ2ljLWE5OiBzdGFsZSBpcnFfc3RhdGUgYW5kIGVkZ2Ug SVJRIG1pc3MgaW4KICBhbWxfaTJjX2lycSgpCi0tCgpjb21taXQgNzU5ODVlOWI1NzdiY2RlN2E3 NmE4YTZmODQ0YTVhNzU2NGQyNDI2YQpBdXRob3I6IEp1bnlpIFpoYW8gPGp1bnlpLnpoYW9AYW1s b2dpYy5jb20+CgppMmM6IGFtbG9naWM6IEFkZCBBbWxvZ2ljIEE5IEkyQyBjb250cm9sbGVyIGRy aXZlcgoKVGhpcyBjb21taXQgYWRkcyBhbiBJMkMgY29udHJvbGxlciBkcml2ZXIgZm9yIEFtbG9n aWMgQTkgU29DcyBhbG9uZyB3aXRoIGl0cwpLY29uZmlnLCBNYWtlZmlsZSwgYW5kIE1BSU5UQUlO RVJTIGVudHJpZXMuCgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtbG9n aWMtYTkuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1sb2dpYy1hOS5jCj4gbmV3IGZpbGUg bW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAwLi4zZTA4YTAzMzNjZWVhCj4gLS0tIC9k ZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1sb2dpYy1hOS5jCgpbIC4u LiBdCgo+ICtzdGF0aWMgaXJxcmV0dXJuX3QgYW1sX2kyY19pcnEoaW50IGlycW5vLCB2b2lkICpk ZXZfaWQpCj4gK3sKPiArCXN0cnVjdCBhbWxfaTJjICppMmMgPSBkZXZfaWQ7Cj4gKwl1OCAqYnVm ID0gTlVMTDsKPiArCXUzMiByZF9sZW4sIGk7Cj4gKwl1MzIgcmRfdmFsOwo+ICsJdTMyIGlycV9z dGF0ZTsKPiArCj4gKwlzcGluX2xvY2soJmkyYy0+bG9jayk7Cj4gKwlpcnFfc3RhdGUgPSByZWFk bChpMmMtPnJlZ3MgKyBSRUdfQ0ZHX0lSUV9TVEFURSk7Cj4gKwlpZiAoaTJjLT5zdGF0ZSA9PSBB OV9TVEFURV9JRExFKSB7Cj4gKwkJZGV2X3dhcm4oaTJjLT5kZXYsICJpMmMgaXJxIHRyaWdnZXJl ZCBhYm5vcm1hbGx5LCBpcnFfc3RhdGU6MHgleCxpcnFfZW46MHgleFxuIiwKPiArCQkJIGlycV9z dGF0ZSwgcmVhZGwoaTJjLT5yZWdzICsgUkVHX0NGR19JUlFfRU5BQkxFKSk7Cj4gKwkJZ290byBp cnFfdHJhbnNfb3V0Owo+ICsJfQo+ICsKPiArCWlmIChpcnFfc3RhdGUgJiBBOV9UUkFOU19FUlJP Uikgewo+ICsJCWkyYy0+ZXJyb3IgPSAtRU5YSU87Cj4gKwkJZ290byBjb21wbGV0ZV9pcnFfb3V0 Owo+ICsJfQo+ICsKPiArCXN3aXRjaCAoaTJjLT5zdGF0ZSkgewo+ICsJY2FzZSBBOV9TVEFURV9S RUFEOgo+ICsJCWJ1ZiA9IGkyYy0+bXNnLT5idWY7Cj4gKwkJcmRfbGVuID0gbWluKGkyYy0+bXNn LT5sZW4gLSBpMmMtPnBvcywgQTlfSTJDX0ZJRk9fREVQVEgpOwo+ICsJCWZvciAoaSA9IDA7IGkg PCByZF9sZW47IGkrKykgewo+ICsJCQlyZF92YWwgPSByZWFkbChpMmMtPnJlZ3MgKyBSRUdfQ0ZH X1JYKTsKPiArCQkJYnVmW2kyYy0+cG9zKytdID0gcmRfdmFsICYgVFhfUlhfREFUQTsKPiArCQl9 Cj4gKwkJLyogUnggbXVzdCBjbGVhciB0aHJlc2ggYWZ0ZXIgcmVhZCBmaWZvICovCj4gKwkJY2xl YXJfaXJxX3N0YXR1cyhpMmMsIEE5X1JYX1RIUkVTSF9SRUFEKTsKPiArCQlicmVhazsKPiArCWNh c2UgQTlfU1RBVEVfV1JJVEU6Cj4gKwkJYW1sX2kyY19wcmVwYXJlX3hmZXIoaTJjLCBBOV9GSUZP X0ZJTExfSEFMRik7Cj4gKwkJaWYgKGkyYy0+cG9zID09IGkyYy0+bXNnLT5sZW4pCj4gKwkJCWFt bF9pMmNfc2V0X21hc2soaTJjLCBSRUdfQ0ZHX0lSUV9FTkFCTEUsIEE5X1RYX1RIUkVTSF9XUklU RSwgMCk7Cj4gKwkJLyogVHggbXVzdCBjbGVhciB0aHJlc2ggYWZ0ZXIgd3JpdGUgZmlmbyAqLwo+ ICsJCWNsZWFyX2lycV9zdGF0dXMoaTJjLCBBOV9UWF9USFJFU0hfV1JJVEUpOwo+ICsJCWJyZWFr Owo+ICsJZGVmYXVsdDoKPiArCQlicmVhazsKPiArCX0KPiArCj4gKwlpZiAoIShpcnFfc3RhdGUg JiBBOV9UUkFOU19ET05FKSB8fAo+ICsJICAgIChpMmMtPnN0YXRlID09IEE5X1NUQVRFX1JFQUQg JiYgaTJjLT5wb3MgPCBpMmMtPm1zZy0+bGVuKSkgewo+ICsJCXNwaW5fdW5sb2NrKCZpMmMtPmxv Y2spOwo+ICsJCXJldHVybiBJUlFfSEFORExFRDsKPiArCX0KCltTZXZlcml0eTogTWVkaXVtXQpD YW4gbXVsdGktY2h1bmsgcmVhZHMgKG1zZy0+bGVuID4gQTlfSTJDX0ZJRk9fREVQVEgpIG1pc3Mg dGhlIGNvbXBsZXRpb24KaW50ZXJydXB0IGFuZCB0aW1lIG91dCBpbiBhbWxfaTJjX3hmZXJfbXNn KCk/CgpEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL2FtbG9naWMsYTktaTJj LnlhbWw6CiAgICAgICAgaW50ZXJydXB0cyA9IDwwIDE2NCAxPjsKClRoZSBpbnRlcnJ1cHQgaXMg cmlzaW5nLWVkZ2UtdHJpZ2dlcmVkIChJUlFfVFlQRV9FREdFX1JJU0lORyksIHNvIHRoZQpjb250 cm9sbGVyJ3MgZW5hYmxlZCBpbnRlcnJ1cHQgb3V0cHV0IG11c3QgZHJvcCB0byAwIGFuZCB0cmFu c2l0aW9uIGJhY2sgdG8gMQp0byBsYXRjaCBhIG5ldyBpbnRlcnJ1cHQgaW4gdGhlIEdJQy4KCklu IGFtbF9pMmNfaXJxKCksIGlycV9zdGF0ZSBpcyBzYW1wbGVkIG9uY2UgYmVmb3JlIGRyYWluaW5n IHVwIHRvIDMyIGJ5dGVzCmZyb20gUkVHX0NGR19SWC4gIE9uIGEgNjQtYnl0ZSByZWFkLCB0aGUg MzJuZCBieXRlIG9mIHRoZSBzZWNvbmQgY2h1bmsgYXNzZXJ0cwpBOV9SWF9USFJFU0hfUkVBRCBi ZWZvcmUgdGhlIGZpbmFsIE5BQ0sgYW5kIFNUT1AgZmluaXNoIG9uIHRoZSBidXMuICBJZgpBOV9Q SFlfRE9ORSBhc3NlcnRzIHdoaWxlIHRoZSBoYW5kbGVyIGlzIHJlYWRpbmcgUkVHX0NGR19SWCwg cHJpb3IgdG8KY2xlYXJfaXJxX3N0YXR1cyhpMmMsIEE5X1JYX1RIUkVTSF9SRUFEKSwgdGhlIGlu dGVycnVwdCBvdXRwdXQgc3RheXMKY29udGludW91c2x5IGhpZ2ggYWNyb3NzIHRoZSBjbGVhciB3 aXRob3V0IGdlbmVyYXRpbmcgYSBuZXcgcmlzaW5nIGVkZ2UsIHdoaWxlCmFtbF9pMmNfaXJxKCkg Y2hlY2tzIHRoZSBzdGFsZSBpcnFfc3RhdGUgc25hcHNob3QgYW5kIHJldHVybnMgd2l0aG91dApj b21wbGV0aW5nIGkyYy0+ZG9uZS4KClNpbWlsYXJseSwgaWYgYm90aCBBOV9SWF9USFJFU0hfUkVB RCBhbmQgQTlfUEhZX0RPTkUgYXJlIGFscmVhZHkgc2V0IGluCmlycV9zdGF0ZSB3aGlsZSBtb3Jl IHRoYW4gMzIgYnl0ZXMgcmVtYWluIHRvIGJlIHJlYWQsIGFtbF9pMmNfaXJxKCkgcmVhZHMgMzIK Ynl0ZXMsIGNsZWFycyBvbmx5IEE5X1JYX1RIUkVTSF9SRUFELCBhbmQgcmV0dXJucyBlYXJseSBi ZWNhdXNlIGkyYy0+cG9zIDwKaTJjLT5tc2ctPmxlbi4gIEJlY2F1c2UgQTlfUEhZX0RPTkUgcmVt YWlucyBhc3NlcnRlZCBpbiBSRUdfQ0ZHX0lSUV9TVEFURSBhbmQKZmV3ZXIgdGhhbiAzMiB0YWls IGJ5dGVzIHJlbWFpbiBpbiB0aGUgRklGTywgbm8gbmV3IHJpc2luZyBlZGdlIGlzIGdlbmVyYXRl ZAphbmQgd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCkgaGFuZ3MgZm9yIDUwMCBtcyBiZWZv cmUgcmV0dXJuaW5nCi1FVElNRURPVVQuCgo+ICsKPiArY29tcGxldGVfaXJxX291dDoKPiArCWky Yy0+c3RhdGUgPSBBOV9TVEFURV9JRExFOwo+ICsJcmVzZXRfZmlmb19wb3MoaTJjKTsKPiArCWFt bF9pMmNfc2V0X21hc2soaTJjLCBSRUdfQ0ZHX0lSUV9FTkFCTEUsIEE5X1JYX1RIUkVTSF9SRUFE IHwgQTlfVFhfVEhSRVNIX1dSSVRFLCAwKTsKPiArCWNvbXBsZXRlKCZpMmMtPmRvbmUpOwo+ICtp cnFfdHJhbnNfb3V0Ogo+ICsJY2xlYXJfaXJxX3N0YXR1cyhpMmMsIElSUV9BTExfTUFTSyk7Cj4g KwlzcGluX3VubG9jaygmaTJjLT5sb2NrKTsKPiArCj4gKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIGFtbF9pMmNfZG9fc3RhcnQoc3RydWN0IGFtbF9pMmMgKmky Yywgc3RydWN0IGkyY19tc2cgKm1zZykKPiArewo+ICsJdW5zaWduZWQgaW50IHJlZ192YWw7Cj4g Kwl1bnNpZ25lZCBpbnQgdHJhbnNfbGVuOwo+ICsKPiArCXRyYW5zX2xlbiA9IG1zZy0+bGVuOwo+ ICsJcmVnX3ZhbCA9ICh1bnNpZ25lZCBpbnQpKCgobXNnLT5hZGRyICYgMHg3ZikgPDwgU1RBUlRf U0FERFJfU0hJRlQpIHwKPiArCQkJCSgobXNnLT5mbGFncyAmIEkyQ19NX1JEKSA/IFNUQVJUX1JF QUQgOiAwKSB8Cj4gKwkJCQkoKHRyYW5zX2xlbiAmIDB4ZmZmKSA8PCBTVEFSVF9MRU5fU0hJRlQp IHwgU1RBUlRfU1RBUlQpOwo+ICsJYW1sX2kyY19zZXRfbWFzayhpMmMsIFJFR19DRkdfU1RBUlQs Cj4gKwkJCSBTVEFSVF9TVEFSVCB8IFNUQVJUX1NMQVZFX0FERFIgfCBTVEFSVF9SRUFEIHwgU1RB UlRfTEVOLCByZWdfdmFsKTsKPiArCWNsZWFyX2lycV9zdGF0dXMoaTJjLCBJUlFfQUxMX01BU0sp Owo+ICsJLyogZW5hYmxlIHRocmVzaCBtb2RlICovCj4gKwlpZiAodHJhbnNfbGVuID4gQTlfSTJD X0ZJRk9fREVQVEgpIHsKPiArCQlyZWdfdmFsID0gKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkgPyBB OV9SWF9USFJFU0hfUkVBRCA6IEE5X1RYX1RIUkVTSF9XUklURTsKPiArCQlhbWxfaTJjX3NldF9t YXNrKGkyYywgUkVHX0NGR19JUlFfRU5BQkxFLAo+ICsJCQkJIEE5X1JYX1RIUkVTSF9SRUFEIHwg QTlfVFhfVEhSRVNIX1dSSVRFLCByZWdfdmFsKTsKPiArCX0KPiArfQoKW1NldmVyaXR5OiBNZWRp dW1dCkRvZXMgd3JpdGluZyBTVEFSVF9TVEFSVCB0byBSRUdfQ0ZHX1NUQVJUIGJlZm9yZSBjbGVh cmluZyBJUlFfQUxMX01BU0sgYW5kCmVuYWJsaW5nIHRocmVzaG9sZCBpbnRlcnJ1cHRzIHJhY2Ug d2l0aCBoYXJkd2FyZSBjb21wbGV0aW9uIG9yIE5BQ0s/CgpJZiBleGVjdXRpb24gaXMgZGVsYXll ZCBiZXR3ZWVuIHdyaXRpbmcgUkVHX0NGR19TVEFSVCBhbmQgY2FsbGluZwpjbGVhcl9pcnFfc3Rh dHVzKGkyYywgSVJRX0FMTF9NQVNLKSAoZm9yIGV4YW1wbGUgZHVlIHRvIHZDUFUgcHJlZW1wdGlv biBvcgpQUkVFTVBUX1JUIHNwaW5sb2NrIHByZWVtcHRpb24pLCBhbiBhZGRyZXNzIE5BQ0sgb3Ig c2hvcnQgdHJhbnNmZXIgY2FuIGFzc2VydApBOV9OQ0tfRVJST1Igb3IgQTlfUEhZX0RPTkUgYW5k IHRoZW4gaGF2ZSBpdHMgc3RhdHVzIGJpdHMgd2lwZWQgb3V0IGJ5CmNsZWFyX2lycV9zdGF0dXMo KS4gIFdoZW4gYW1sX2kyY19pcnEoKSB0aGVuIHJ1bnMsIGl0IHJlYWRzIGlycV9zdGF0ZSA9PSAw LAptaXNzZXMgQTlfVFJBTlNfRVJST1Igb3IgQTlfVFJBTlNfRE9ORSwgYW5kIHJldHVybnMgd2l0 aG91dCBjb21wbGV0aW5nCmkyYy0+ZG9uZSwgY2F1c2luZyB3YWl0X2Zvcl9jb21wbGV0aW9uX3Rp bWVvdXQoKSB0byB0aW1lIG91dC4gIENsZWFyaW5nClJFR19DRkdfSVJRX1NUQVRFIGFuZCBjb25m aWd1cmluZyBSRUdfQ0ZHX0lSUV9FTkFCTEUgYmVmb3JlIGFzc2VydGluZwpTVEFSVF9TVEFSVCBh dm9pZHMgdGhpcyB3aW5kb3cuCgotLSAKU2FzaGlrbyBBSSByZXZpZXcgwrcgaHR0cHM6Ly9zYXNo aWtvLmRldi8jL3BhdGNoc2V0LzIwMjYxMTEwLWE5LWkyYy12OC0wLTFlOWQyNjgyZjg2YkBhbWxv Z2ljLmNvbT9wYXJ0PTIKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmxpbnV4LWFtbG9naWMgbWFpbGluZyBsaXN0CmxpbnV4LWFtbG9naWNAbGlzdHMuaW5m cmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xp bnV4LWFtbG9naWMK