From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from hall.aurel32.net (hall.aurel32.net [195.154.119.183]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CEF882264C0; Mon, 29 Dec 2025 15:07:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=195.154.119.183 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767020846; cv=none; b=Adtqll8PDxfu9IcEnAU6nXBEq32zVVCULUwf3GKlEnPNhR1PfQYFBIJBlag7gLiHCk2tdH4EjZbwwDl2TjPI76VhqVlhirQNKdwQFN/Z/gJlud7gTHZipL7bEb+n6nghIeOJQo8E0mab78PPvGIQKI/vIgQoUImeM+2w3HAGZUA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767020846; c=relaxed/simple; bh=E/jni4isZrCEQAPhyAqDbsgZ6BCoOSNdY5v29xmilUs=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=Py8xU2bm8JJ+pDY/a7NNUCZP2wyyyXSxoBL4UlONgB8VCQh8e9Wl488DURZZro/MD9ARZ00GukLbIO3PWN3/vipSyJC1HLmYLNgJChH8pz/n7xHhqhgK94f9svfeLMtrVy4xNHlMumYOLKAMeTvp73iuYdhNTf9VNbzCH4KTDhE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=aurel32.net; spf=pass smtp.mailfrom=aurel32.net; dkim=pass (2048-bit key) header.d=aurel32.net header.i=@aurel32.net header.b=kZCRIvKK; arc=none smtp.client-ip=195.154.119.183 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=aurel32.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=aurel32.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=aurel32.net header.i=@aurel32.net header.b="kZCRIvKK" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=aurel32.net ; s=202004.hall; h=In-Reply-To:Content-Transfer-Encoding:Content-Type: MIME-Version:References:Message-ID:Subject:Cc:To:From:Date:From:Reply-To: Subject:Content-ID:Content-Description:X-Debbugs-Cc; bh=r3xcQVlio1jAsYzH6bF2UOcPNsgAQ8fN2ZfKQURdl3I=; b=kZCRIvKKkVm1m36/YU+zN8rNvj xCLfp5trE+ZE9nJYUUQ4DWyF42Xy22kyakepBVvyiz2zhb0gsVcV14s2lCIIwBIkItslMCeCsjjho +n25CoOz67Mk05z+JLAU649JXXKUo35O06HzUYaeAcRPNfb5+eoXN9p7t7SDjvUSiZzSol4MPhwgt zAgNlR2qPJg+cHk6HC3ACWY/m3IP+C42uO6HeDSQB5TArDrWq+mWm4P2mIxi4ZZKOZv5+8cfu9+/P P9kpTEroZ+Y2bKuZK6uFHAzQC+pwlhWlxwKug8CYdwTScUQ1Y70cbGOBguzCXd1s1MbYo4DETCYZy FxnI5+Cg==; Received: from [2a01:e34:ec5d:a741:1ee1:92ff:feb4:5ec0] (helo=ohm.rr44.fr) by hall.aurel32.net with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1vaEq4-00000003Mt9-0yLp; Mon, 29 Dec 2025 16:07:16 +0100 Date: Mon, 29 Dec 2025 16:07:15 +0100 From: Aurelien Jarno To: Troy Mitchell Cc: Andi Shyti , Yixun Lan , Alex Elder , Michael Opdenacker , Troy Mitchell , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev Subject: Re: [PATCH v5 2/2] i2c: spacemit: introduce pio for k1 Message-ID: Mail-Followup-To: Troy Mitchell , Andi Shyti , Yixun Lan , Alex Elder , Michael Opdenacker , Troy Mitchell , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev References: <20251226-k1-i2c-atomic-v5-0-023c798c5523@linux.spacemit.com> <20251226-k1-i2c-atomic-v5-2-023c798c5523@linux.spacemit.com> Precedence: bulk X-Mailing-List: linux-i2c@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable In-Reply-To: <20251226-k1-i2c-atomic-v5-2-023c798c5523@linux.spacemit.com> User-Agent: Mutt/2.2.13 (2024-03-09) Hi, On 2025-12-26 11:31, Troy Mitchell wrote: > This patch introduces I2C PIO functionality for the Spacemit K1 SoC, > enabling the use of I2C in atomic context. >=20 > When i2c xfer_atomic is invoked, use_pio is set accordingly. >=20 > Since an atomic context is required, all interrupts are disabled when > operating in PIO mode. Even with interrupts disabled, the bits in the > ISR (Interrupt Status Register) will still be set, so error handling can > be performed by polling the relevant status bits in the ISR. >=20 > Signed-off-by: Troy Mitchell > --- > Changes in v5: > - optimize code logic > - refactor delay handling into spacemit_i2c_delay() helper > - introduce spacemit_i2c_complete() to centralize transfer completion > - rework PIO transfer wait logic for clarity and correctness > - modify and add some comments > - modify commit message > - Link to v4: https://lore.kernel.org/all/20251009-k1-i2c-atomic-v4-1-a89= 367870286@linux.spacemit.com/ >=20 > Changes in v4: > - refactor for better readability: simplify condition check and moving if= /else (timeout/ > wait_xfer_complete) logic into a function > - remove irrelevant changes > - remove the status clear call in spacemit_i2c_xfer_common() > - sort functions to avoid forward declarations, > move unavoidable ones above function definitions > - use udelay() in atomic context to avoid sleeping > - wait for MSD on the last byte in wait_pio_xfer() > - Link to v3: https://lore.kernel.org/r/20250929-k1-i2c-atomic-v3-1-f7e66= 0c138b6@linux.spacemit.com >=20 > Changes in v3: > - drop 1-5 patches (have been merged) > - modify commit message > - use readl_poll_timeout_atomic() in wait_pio_xfer() > - use msecs_to_jiffies() when get PIO mode timeout value > - factor out transfer state handling into spacemit_i2c_handle_state(). > - do not disable/enable the controller IRQ around PIO transfers. > - consolidate spacemit_i2c_init() interrupt setup > - rename is_pio -> use_pio > - rename spacemit_i2c_xfer() -> spacemit_i2c_xfer_common() > - rename spacemit_i2c_int_xfer() -> spacemit_i2c_xfer() > - rename spacemit_i2c_pio_xfer() -> spacemit_i2c_pio_xfer_atomic() > - call spacemit_i2c_err_check() in wait_pio_xfer() when write last byte > - Link to v2: https://lore.kernel.org/r/20250925-k1-i2c-atomic-v2-0-46dc1= 3311cda@linux.spacemit.com >=20 > Changes in v2: > - add is_pio judgement in irq_handler() > - use a fixed timeout value when PIO > - use readl_poll_timeout() in spacemit_i2c_wait_bus_idle() when PIO > - Link to v1: https://lore.kernel.org/r/20250827-k1-i2c-atomic-v1-0-e59be= a02d680@linux.spacemit.com > --- > drivers/i2c/busses/i2c-k1.c | 297 +++++++++++++++++++++++++++++++++-----= ------ > 1 file changed, 225 insertions(+), 72 deletions(-) >=20 > diff --git a/drivers/i2c/busses/i2c-k1.c b/drivers/i2c/busses/i2c-k1.c > index accef6653b56bd3505770328af17e441fad613a7..78a2de2c517e51e6ff997cc21= 402eb8f85054f85 100644 > --- a/drivers/i2c/busses/i2c-k1.c > +++ b/drivers/i2c/busses/i2c-k1.c =2E.. > @@ -383,8 +424,134 @@ static void spacemit_i2c_err_check(struct spacemit_= i2c_dev *i2c) > =20 > spacemit_i2c_clear_int_status(i2c, SPACEMIT_I2C_INT_STATUS_MASK); > =20 > - i2c->state =3D SPACEMIT_STATE_IDLE; > - complete(&i2c->complete); > + spacemit_i2c_complete(i2c); > +} > + > +static void spacemit_i2c_handle_state(struct spacemit_i2c_dev *i2c) > +{ > + u32 val; > + > + if (i2c->status & SPACEMIT_SR_ERR) > + goto err_out; > + > + val =3D readl(i2c->base + SPACEMIT_ICR); > + val &=3D ~(SPACEMIT_CR_TB | SPACEMIT_CR_ACKNAK | SPACEMIT_CR_STOP | SPA= CEMIT_CR_START); > + > + switch (i2c->state) { > + case SPACEMIT_STATE_START: > + spacemit_i2c_handle_start(i2c); > + break; > + case SPACEMIT_STATE_READ: > + spacemit_i2c_handle_read(i2c); > + break; > + case SPACEMIT_STATE_WRITE: > + spacemit_i2c_handle_write(i2c); > + break; > + default: > + break; > + } > + > + if (i2c->state !=3D SPACEMIT_STATE_IDLE) { > + val |=3D SPACEMIT_CR_TB; > + if (i2c->use_pio) > + val |=3D SPACEMIT_CR_ALDIE; > + > + > + if (spacemit_i2c_is_last_msg(i2c)) { > + /* trigger next byte with stop */ > + val |=3D SPACEMIT_CR_STOP; > + > + if (i2c->read) > + val |=3D SPACEMIT_CR_ACKNAK; > + } > + writel(val, i2c->base + SPACEMIT_ICR); > + } > + > +err_out: > + spacemit_i2c_err_check(i2c); > +} > + > +/* > + * In PIO mode, this function is used as a replacement for > + * wait_for_completion_timeout(), whose return value indicates > + * the remaining time. > + * > + * We do not have a meaningful remaining-time value here, so > + * return a non-zero value on success to indicate "not timed out". > + * Returning 1 ensures callers treating the return value as > + * time_left will not incorrectly report a timeout. > + */ > +static int spacemit_i2c_wait_pio_xfer(struct spacemit_i2c_dev *i2c) > +{ > + u32 mask, msec =3D jiffies_to_msecs(i2c->adapt.timeout); > + ktime_t timeout =3D ktime_add_ms(ktime_get(), msec); > + int ret; > + > + mask =3D SPACEMIT_SR_IRF | SPACEMIT_SR_ITE; > + > + do { > + i2c->status =3D readl(i2c->base + SPACEMIT_ISR); > + > + spacemit_i2c_clear_int_status(i2c, i2c->status); Do we actually need to clear the interrupt status even if none of above=20 bits are set? Said otherwise, can we move this line after the if and=20 before the handle_state? > + > + if (!(i2c->status & mask)) { > + udelay(10); It seems that the poll delay elsewhere in this patch is 30 =C2=B5s.=20 Maybe use a consistent value. > + continue; > + } > + > + spacemit_i2c_handle_state(i2c); > + > + Please delete the extra blank lines here. > + } while (i2c->unprocessed && ktime_compare(ktime_get(), timeout) < 0); > + Otherwise it sounds good, thanks for the changes. Regards Aurelien --=20 Aurelien Jarno GPG: 4096R/1DDD8C9B aurelien@aurel32.net http://aurel32.net 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 7380BE8FDBE for ; Mon, 29 Dec 2025 15:07:43 +0000 (UTC) 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:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc: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=/bhKAzHPftxBpbAckfZ6zrOjTmCv6KQXVFQe7ngiAPA=; b=eVXyNlkmApYd4a OHEtGShkZHRk0bMDW9vT/R53SrqTv0xmBgen+cVy1JxgbWve4cN1BiIVCyekfi9mTPHcbp3zK6nZl fA05USETChf7aSDmnpDIHSeQplWeQVi8o/ZtIpntSNqIoq4ZiOgWrxCtUEV04CT5rueSLFjgPmxHV pcgTtVw6gwMMLGshgRK6eVT+drYWswLc9J/CW/vFh9jYLN5gPjlZvI+Gb4BWBBFBbYsrcrO44hN4v V05sL1sLros6szkV80nA2TsGHHqPbZyioaFR0Dkevz3sMbCi3XjkU3PjKd7GbeCv475AEKGA8DqOq CoqFLrkM0pcyWneYQ++g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1vaEqE-00000003pCy-332y; Mon, 29 Dec 2025 15:07:26 +0000 Received: from hall.aurel32.net ([2001:bc8:30d7:100::1]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1vaEqC-00000003pCY-1qGS for linux-riscv@lists.infradead.org; Mon, 29 Dec 2025 15:07:26 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=aurel32.net ; s=202004.hall; h=In-Reply-To:Content-Transfer-Encoding:Content-Type: MIME-Version:References:Message-ID:Subject:Cc:To:From:Date:From:Reply-To: Subject:Content-ID:Content-Description:X-Debbugs-Cc; bh=r3xcQVlio1jAsYzH6bF2UOcPNsgAQ8fN2ZfKQURdl3I=; b=kZCRIvKKkVm1m36/YU+zN8rNvj xCLfp5trE+ZE9nJYUUQ4DWyF42Xy22kyakepBVvyiz2zhb0gsVcV14s2lCIIwBIkItslMCeCsjjho +n25CoOz67Mk05z+JLAU649JXXKUo35O06HzUYaeAcRPNfb5+eoXN9p7t7SDjvUSiZzSol4MPhwgt zAgNlR2qPJg+cHk6HC3ACWY/m3IP+C42uO6HeDSQB5TArDrWq+mWm4P2mIxi4ZZKOZv5+8cfu9+/P P9kpTEroZ+Y2bKuZK6uFHAzQC+pwlhWlxwKug8CYdwTScUQ1Y70cbGOBguzCXd1s1MbYo4DETCYZy FxnI5+Cg==; Received: from [2a01:e34:ec5d:a741:1ee1:92ff:feb4:5ec0] (helo=ohm.rr44.fr) by hall.aurel32.net with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1vaEq4-00000003Mt9-0yLp; Mon, 29 Dec 2025 16:07:16 +0100 Date: Mon, 29 Dec 2025 16:07:15 +0100 From: Aurelien Jarno To: Troy Mitchell Cc: Andi Shyti , Yixun Lan , Alex Elder , Michael Opdenacker , Troy Mitchell , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev Subject: Re: [PATCH v5 2/2] i2c: spacemit: introduce pio for k1 Message-ID: Mail-Followup-To: Troy Mitchell , Andi Shyti , Yixun Lan , Alex Elder , Michael Opdenacker , Troy Mitchell , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev References: <20251226-k1-i2c-atomic-v5-0-023c798c5523@linux.spacemit.com> <20251226-k1-i2c-atomic-v5-2-023c798c5523@linux.spacemit.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20251226-k1-i2c-atomic-v5-2-023c798c5523@linux.spacemit.com> User-Agent: Mutt/2.2.13 (2024-03-09) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20251229_070725_070671_85B49623 X-CRM114-Status: GOOD ( 31.60 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org SGksCgpPbiAyMDI1LTEyLTI2IDExOjMxLCBUcm95IE1pdGNoZWxsIHdyb3RlOgo+IFRoaXMgcGF0 Y2ggaW50cm9kdWNlcyBJMkMgUElPIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSBTcGFjZW1pdCBLMSBT b0MsCj4gZW5hYmxpbmcgdGhlIHVzZSBvZiBJMkMgaW4gYXRvbWljIGNvbnRleHQuCj4gCj4gV2hl biBpMmMgeGZlcl9hdG9taWMgaXMgaW52b2tlZCwgdXNlX3BpbyBpcyBzZXQgYWNjb3JkaW5nbHku Cj4gCj4gU2luY2UgYW4gYXRvbWljIGNvbnRleHQgaXMgcmVxdWlyZWQsIGFsbCBpbnRlcnJ1cHRz IGFyZSBkaXNhYmxlZCB3aGVuCj4gb3BlcmF0aW5nIGluIFBJTyBtb2RlLiBFdmVuIHdpdGggaW50 ZXJydXB0cyBkaXNhYmxlZCwgdGhlIGJpdHMgaW4gdGhlCj4gSVNSIChJbnRlcnJ1cHQgU3RhdHVz IFJlZ2lzdGVyKSB3aWxsIHN0aWxsIGJlIHNldCwgc28gZXJyb3IgaGFuZGxpbmcgY2FuCj4gYmUg cGVyZm9ybWVkIGJ5IHBvbGxpbmcgdGhlIHJlbGV2YW50IHN0YXR1cyBiaXRzIGluIHRoZSBJU1Iu Cj4gCj4gU2lnbmVkLW9mZi1ieTogVHJveSBNaXRjaGVsbCA8dHJveS5taXRjaGVsbEBsaW51eC5z cGFjZW1pdC5jb20+Cj4gLS0tCj4gQ2hhbmdlcyBpbiB2NToKPiAtIG9wdGltaXplIGNvZGUgbG9n aWMKPiAtIHJlZmFjdG9yIGRlbGF5IGhhbmRsaW5nIGludG8gc3BhY2VtaXRfaTJjX2RlbGF5KCkg aGVscGVyCj4gLSBpbnRyb2R1Y2Ugc3BhY2VtaXRfaTJjX2NvbXBsZXRlKCkgdG8gY2VudHJhbGl6 ZSB0cmFuc2ZlciBjb21wbGV0aW9uCj4gLSByZXdvcmsgUElPIHRyYW5zZmVyIHdhaXQgbG9naWMg Zm9yIGNsYXJpdHkgYW5kIGNvcnJlY3RuZXNzCj4gLSBtb2RpZnkgYW5kIGFkZCBzb21lIGNvbW1l bnRzCj4gLSBtb2RpZnkgY29tbWl0IG1lc3NhZ2UKPiAtIExpbmsgdG8gdjQ6IGh0dHBzOi8vbG9y ZS5rZXJuZWwub3JnL2FsbC8yMDI1MTAwOS1rMS1pMmMtYXRvbWljLXY0LTEtYTg5MzY3ODcwMjg2 QGxpbnV4LnNwYWNlbWl0LmNvbS8KPiAKPiBDaGFuZ2VzIGluIHY0Ogo+IC0gcmVmYWN0b3IgZm9y IGJldHRlciByZWFkYWJpbGl0eTogc2ltcGxpZnkgY29uZGl0aW9uIGNoZWNrIGFuZCBtb3Zpbmcg aWYvZWxzZSAodGltZW91dC8KPiAgIHdhaXRfeGZlcl9jb21wbGV0ZSkgbG9naWMgaW50byBhIGZ1 bmN0aW9uCj4gLSByZW1vdmUgaXJyZWxldmFudCBjaGFuZ2VzCj4gLSByZW1vdmUgdGhlIHN0YXR1 cyBjbGVhciBjYWxsIGluIHNwYWNlbWl0X2kyY194ZmVyX2NvbW1vbigpCj4gLSBzb3J0IGZ1bmN0 aW9ucyB0byBhdm9pZCBmb3J3YXJkIGRlY2xhcmF0aW9ucywKPiAgIG1vdmUgdW5hdm9pZGFibGUg b25lcyBhYm92ZSBmdW5jdGlvbiBkZWZpbml0aW9ucwo+IC0gdXNlIHVkZWxheSgpIGluIGF0b21p YyBjb250ZXh0IHRvIGF2b2lkIHNsZWVwaW5nCj4gLSB3YWl0IGZvciBNU0Qgb24gdGhlIGxhc3Qg Ynl0ZSBpbiB3YWl0X3Bpb194ZmVyKCkKPiAtIExpbmsgdG8gdjM6IGh0dHBzOi8vbG9yZS5rZXJu ZWwub3JnL3IvMjAyNTA5MjktazEtaTJjLWF0b21pYy12My0xLWY3ZTY2MGMxMzhiNkBsaW51eC5z cGFjZW1pdC5jb20KPiAKPiBDaGFuZ2VzIGluIHYzOgo+IC0gZHJvcCAxLTUgcGF0Y2hlcyAoaGF2 ZSBiZWVuIG1lcmdlZCkKPiAtIG1vZGlmeSBjb21taXQgbWVzc2FnZQo+IC0gdXNlIHJlYWRsX3Bv bGxfdGltZW91dF9hdG9taWMoKSBpbiB3YWl0X3Bpb194ZmVyKCkKPiAtIHVzZSBtc2Vjc190b19q aWZmaWVzKCkgd2hlbiBnZXQgUElPIG1vZGUgdGltZW91dCB2YWx1ZQo+IC0gZmFjdG9yIG91dCB0 cmFuc2ZlciBzdGF0ZSBoYW5kbGluZyBpbnRvIHNwYWNlbWl0X2kyY19oYW5kbGVfc3RhdGUoKS4K PiAtIGRvIG5vdCBkaXNhYmxlL2VuYWJsZSB0aGUgY29udHJvbGxlciBJUlEgYXJvdW5kIFBJTyB0 cmFuc2ZlcnMuCj4gLSBjb25zb2xpZGF0ZSBzcGFjZW1pdF9pMmNfaW5pdCgpIGludGVycnVwdCBz ZXR1cAo+IC0gcmVuYW1lIGlzX3BpbyAtPiB1c2VfcGlvCj4gLSByZW5hbWUgc3BhY2VtaXRfaTJj X3hmZXIoKSAtPiBzcGFjZW1pdF9pMmNfeGZlcl9jb21tb24oKQo+IC0gcmVuYW1lIHNwYWNlbWl0 X2kyY19pbnRfeGZlcigpIC0+IHNwYWNlbWl0X2kyY194ZmVyKCkKPiAtIHJlbmFtZSBzcGFjZW1p dF9pMmNfcGlvX3hmZXIoKSAtPiBzcGFjZW1pdF9pMmNfcGlvX3hmZXJfYXRvbWljKCkKPiAtIGNh bGwgc3BhY2VtaXRfaTJjX2Vycl9jaGVjaygpIGluIHdhaXRfcGlvX3hmZXIoKSB3aGVuIHdyaXRl IGxhc3QgYnl0ZQo+IC0gTGluayB0byB2MjogaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvci8yMDI1 MDkyNS1rMS1pMmMtYXRvbWljLXYyLTAtNDZkYzEzMzExY2RhQGxpbnV4LnNwYWNlbWl0LmNvbQo+ IAo+IENoYW5nZXMgaW4gdjI6Cj4gLSBhZGQgaXNfcGlvIGp1ZGdlbWVudCBpbiBpcnFfaGFuZGxl cigpCj4gLSB1c2UgYSBmaXhlZCB0aW1lb3V0IHZhbHVlIHdoZW4gUElPCj4gLSB1c2UgcmVhZGxf cG9sbF90aW1lb3V0KCkgaW4gIHNwYWNlbWl0X2kyY193YWl0X2J1c19pZGxlKCkgd2hlbiBQSU8K PiAtIExpbmsgdG8gdjE6IGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL3IvMjAyNTA4MjctazEtaTJj LWF0b21pYy12MS0wLWU1OWJlYTAyZDY4MEBsaW51eC5zcGFjZW1pdC5jb20KPiAtLS0KPiAgZHJp dmVycy9pMmMvYnVzc2VzL2kyYy1rMS5jIHwgMjk3ICsrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKy0tLS0tLS0tLS0tCj4gIDEgZmlsZSBjaGFuZ2VkLCAyMjUgaW5zZXJ0aW9ucygrKSwg NzIgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMt azEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtazEuYwo+IGluZGV4IGFjY2VmNjY1M2I1NmJk MzUwNTc3MDMyOGFmMTdlNDQxZmFkNjEzYTcuLjc4YTJkZTJjNTE3ZTUxZTZmZjk5N2NjMjE0MDJl YjhmODUwNTRmODUgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1rMS5jCj4g KysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1rMS5jCgouLi4KCj4gQEAgLTM4Myw4ICs0MjQs MTM0IEBAIHN0YXRpYyB2b2lkIHNwYWNlbWl0X2kyY19lcnJfY2hlY2soc3RydWN0IHNwYWNlbWl0 X2kyY19kZXYgKmkyYykKPiAgCj4gIAlzcGFjZW1pdF9pMmNfY2xlYXJfaW50X3N0YXR1cyhpMmMs IFNQQUNFTUlUX0kyQ19JTlRfU1RBVFVTX01BU0spOwo+ICAKPiAtCWkyYy0+c3RhdGUgPSBTUEFD RU1JVF9TVEFURV9JRExFOwo+IC0JY29tcGxldGUoJmkyYy0+Y29tcGxldGUpOwo+ICsJc3BhY2Vt aXRfaTJjX2NvbXBsZXRlKGkyYyk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHNwYWNlbWl0X2ky Y19oYW5kbGVfc3RhdGUoc3RydWN0IHNwYWNlbWl0X2kyY19kZXYgKmkyYykKPiArewo+ICsJdTMy IHZhbDsKPiArCj4gKwlpZiAoaTJjLT5zdGF0dXMgJiBTUEFDRU1JVF9TUl9FUlIpCj4gKwkJZ290 byBlcnJfb3V0Owo+ICsKPiArCXZhbCA9IHJlYWRsKGkyYy0+YmFzZSArIFNQQUNFTUlUX0lDUik7 Cj4gKwl2YWwgJj0gfihTUEFDRU1JVF9DUl9UQiB8IFNQQUNFTUlUX0NSX0FDS05BSyB8IFNQQUNF TUlUX0NSX1NUT1AgfCBTUEFDRU1JVF9DUl9TVEFSVCk7Cj4gKwo+ICsJc3dpdGNoIChpMmMtPnN0 YXRlKSB7Cj4gKwljYXNlIFNQQUNFTUlUX1NUQVRFX1NUQVJUOgo+ICsJCXNwYWNlbWl0X2kyY19o YW5kbGVfc3RhcnQoaTJjKTsKPiArCQlicmVhazsKPiArCWNhc2UgU1BBQ0VNSVRfU1RBVEVfUkVB RDoKPiArCQlzcGFjZW1pdF9pMmNfaGFuZGxlX3JlYWQoaTJjKTsKPiArCQlicmVhazsKPiArCWNh c2UgU1BBQ0VNSVRfU1RBVEVfV1JJVEU6Cj4gKwkJc3BhY2VtaXRfaTJjX2hhbmRsZV93cml0ZShp MmMpOwo+ICsJCWJyZWFrOwo+ICsJZGVmYXVsdDoKPiArCQlicmVhazsKPiArCX0KPiArCj4gKwlp ZiAoaTJjLT5zdGF0ZSAhPSBTUEFDRU1JVF9TVEFURV9JRExFKSB7Cj4gKwkJdmFsIHw9IFNQQUNF TUlUX0NSX1RCOwo+ICsJCWlmIChpMmMtPnVzZV9waW8pCj4gKwkJCXZhbCB8PSBTUEFDRU1JVF9D Ul9BTERJRTsKPiArCj4gKwo+ICsJCWlmIChzcGFjZW1pdF9pMmNfaXNfbGFzdF9tc2coaTJjKSkg ewo+ICsJCQkvKiB0cmlnZ2VyIG5leHQgYnl0ZSB3aXRoIHN0b3AgKi8KPiArCQkJdmFsIHw9IFNQ QUNFTUlUX0NSX1NUT1A7Cj4gKwo+ICsJCQlpZiAoaTJjLT5yZWFkKQo+ICsJCQkJdmFsIHw9IFNQ QUNFTUlUX0NSX0FDS05BSzsKPiArCQl9Cj4gKwkJd3JpdGVsKHZhbCwgaTJjLT5iYXNlICsgU1BB Q0VNSVRfSUNSKTsKPiArCX0KPiArCj4gK2Vycl9vdXQ6Cj4gKwlzcGFjZW1pdF9pMmNfZXJyX2No ZWNrKGkyYyk7Cj4gK30KPiArCj4gKy8qCj4gKyAqIEluIFBJTyBtb2RlLCB0aGlzIGZ1bmN0aW9u IGlzIHVzZWQgYXMgYSByZXBsYWNlbWVudCBmb3IKPiArICogd2FpdF9mb3JfY29tcGxldGlvbl90 aW1lb3V0KCksIHdob3NlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMKPiArICogdGhlIHJlbWFpbmlu ZyB0aW1lLgo+ICsgKgo+ICsgKiBXZSBkbyBub3QgaGF2ZSBhIG1lYW5pbmdmdWwgcmVtYWluaW5n LXRpbWUgdmFsdWUgaGVyZSwgc28KPiArICogcmV0dXJuIGEgbm9uLXplcm8gdmFsdWUgb24gc3Vj Y2VzcyB0byBpbmRpY2F0ZSAibm90IHRpbWVkIG91dCIuCj4gKyAqIFJldHVybmluZyAxIGVuc3Vy ZXMgY2FsbGVycyB0cmVhdGluZyB0aGUgcmV0dXJuIHZhbHVlIGFzCj4gKyAqIHRpbWVfbGVmdCB3 aWxsIG5vdCBpbmNvcnJlY3RseSByZXBvcnQgYSB0aW1lb3V0Lgo+ICsgKi8KPiArc3RhdGljIGlu dCBzcGFjZW1pdF9pMmNfd2FpdF9waW9feGZlcihzdHJ1Y3Qgc3BhY2VtaXRfaTJjX2RldiAqaTJj KQo+ICt7Cj4gKwl1MzIgbWFzaywgbXNlYyA9IGppZmZpZXNfdG9fbXNlY3MoaTJjLT5hZGFwdC50 aW1lb3V0KTsKPiArCWt0aW1lX3QgdGltZW91dCA9IGt0aW1lX2FkZF9tcyhrdGltZV9nZXQoKSwg bXNlYyk7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCW1hc2sgPSBTUEFDRU1JVF9TUl9JUkYgfCBTUEFD RU1JVF9TUl9JVEU7Cj4gKwo+ICsJZG8gewo+ICsJCWkyYy0+c3RhdHVzID0gcmVhZGwoaTJjLT5i YXNlICsgU1BBQ0VNSVRfSVNSKTsKPiArCj4gKwkJc3BhY2VtaXRfaTJjX2NsZWFyX2ludF9zdGF0 dXMoaTJjLCBpMmMtPnN0YXR1cyk7CgpEbyB3ZSBhY3R1YWxseSBuZWVkIHRvIGNsZWFyIHRoZSBp bnRlcnJ1cHQgc3RhdHVzIGV2ZW4gaWYgbm9uZSBvZiBhYm92ZSAKYml0cyBhcmUgc2V0PyBTYWlk IG90aGVyd2lzZSwgY2FuIHdlIG1vdmUgdGhpcyBsaW5lIGFmdGVyIHRoZSBpZiBhbmQgCmJlZm9y ZSB0aGUgaGFuZGxlX3N0YXRlPwoKPiArCj4gKwkJaWYgKCEoaTJjLT5zdGF0dXMgJiBtYXNrKSkg ewo+ICsJCQl1ZGVsYXkoMTApOwoKSXQgc2VlbXMgdGhhdCB0aGUgcG9sbCBkZWxheSBlbHNld2hl cmUgaW4gdGhpcyBwYXRjaCBpcyAzMCDCtXMuIApNYXliZSB1c2UgYSBjb25zaXN0ZW50IHZhbHVl LgoKPiArCQkJY29udGludWU7Cj4gKwkJfQo+ICsKPiArCQlzcGFjZW1pdF9pMmNfaGFuZGxlX3N0 YXRlKGkyYyk7Cj4gKwo+ICsKClBsZWFzZSBkZWxldGUgdGhlIGV4dHJhIGJsYW5rIGxpbmVzIGhl cmUuCgo+ICsJfSB3aGlsZSAoaTJjLT51bnByb2Nlc3NlZCAmJiBrdGltZV9jb21wYXJlKGt0aW1l X2dldCgpLCB0aW1lb3V0KSA8IDApOwo+ICsKCk90aGVyd2lzZSBpdCBzb3VuZHMgZ29vZCwgdGhh bmtzIGZvciB0aGUgY2hhbmdlcy4KClJlZ2FyZHMKQXVyZWxpZW4KCi0tIApBdXJlbGllbiBKYXJu byAgICAgICAgICAgICAgICAgICAgICAgICAgR1BHOiA0MDk2Ui8xREREOEM5QgphdXJlbGllbkBh dXJlbDMyLm5ldCAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9hdXJlbDMyLm5ldAoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtcmlzY3YgbWFp bGluZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmlu ZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1yaXNjdgo=