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 DDDBDC369C2 for ; Tue, 22 Apr 2025 10:52:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type: Content-Transfer-Encoding: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-Owner; bh=57lyUIEE7vSaZrCMWMWd1cdH5EZ4FUPWsTI4YfTuZfY=; b=r+2Js4xl3T5UEF57+U7m/LOhzb eal92PE5sM4hgLgjBEa1xO4p2uSOlyd6z/pzqsUByhiPlJ+SxzB9/vjiOSNtI/2ugiYYBidVo454Z BWganGuATe7GixkmW61nYeDzAO9aLerFjOgOVKbv8tmzc9Wm3E6/MvLmr0kps3wUsuCb4D4Kba8ie nl/JRAF1JedgJJsdyW8D2yov1npx3mSDc5KTmIAzFY5dnFt/FZQvAhWviGp3iRYoad7Q5ANWMGt+v +iUdaHt12w7xUmQySyYmR+Bwb2dT6yXWBNkp9Ji0xOsUbA+sWfRgj5eSaNNBahZ/6qMjBQzM6YrIe 6QFNs4fg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1u7BEY-00000006q88-2U5K; Tue, 22 Apr 2025 10:52:10 +0000 Received: from gloria.sntech.de ([185.11.138.130]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1u7A3z-00000006aEa-3CN9; Tue, 22 Apr 2025 09:37:13 +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:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID; bh=57lyUIEE7vSaZrCMWMWd1cdH5EZ4FUPWsTI4YfTuZfY=; b=SgG+lzHMUCx8/+Lz3f5uoburLu CQNnXEe4FEviGlERtVrUbzbdeZf/HnYumB4MsUIGyFmYvtk4xtUWLPl67qT9/96LP/S+PsWi0WJiU yBXkPJO0ZUOa8K4IkpQYDlYyK2lwdL1XqY6d7PvhEdKkM+o029yBlWJz9SkrX18Of40a/7hpFrtk2 P+ulQSVjx3Yn2nqriwP4OR7GgEjO3wEMNZ2X0ZQ7RM0kASFnjb3ZbJfvtrnTcQ75RsUdY2ri6Vm3p q1vSOQG1gBwKecGYZU55CexPpFA+gRCqbhnOds9dCcXuaiSjQFdwsjllH16mhs/7nfJm+2y+7Nvc0 HLSeeJWw==; Received: from i53875b95.versanet.de ([83.135.91.149] helo=diego.localnet) by gloria.sntech.de with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1u7A3v-00014B-J1; Tue, 22 Apr 2025 11:37:07 +0200 From: Heiko =?UTF-8?B?U3TDvGJuZXI=?= To: Srinivas Kandagatla , Jonas Karlman Cc: linux-rockchip@lists.infradead.org, Jonas Karlman , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] nvmem: rockchip-otp: Handle internal word_size in main reg_read op Date: Tue, 22 Apr 2025 11:37:06 +0200 Message-ID: <3635379.iIbC2pHGDl@diego> In-Reply-To: <20250316191900.1858944-1-jonas@kwiboo.se> References: <20250316191900.1858944-1-jonas@kwiboo.se> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250422_023711_825010_20D718B1 X-CRM114-Status: GOOD ( 26.35 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Am Sonntag, 16. M=C3=A4rz 2025, 20:18:58 Mitteleurop=C3=A4ische Sommerzeit = schrieb Jonas Karlman: > Rockchip SoCs RK3576 and RK3588 read data from the OTP using 32-bit > words instead of normal 8-bit bytes. Similar RK3506, RK3528, RK3562 and > RK3568 will read data from OTP using 16-bit words. >=20 > The nvmem core stride and word_size cannot fully be used as cells is not > always aligned. Continue to report a stride=3D1 and word_size=3D1 in > nvmem_config and instead handle use of SoC specific word_size internally > in the driver. >=20 > Move current SoC specific word_size handling from the RK3588 read_reg > operation to the main read_reg operation to help simplify the SoC > specific read_reg operation and allow code reuse in a future RK3568 > reg_read operation. >=20 > Signed-off-by: Jonas Karlman Reviewed-by: Heiko Stuebner On both rk3576 and rk3588 compared nvmem content before and after the change, so Tested-by: Heiko Stuebner > --- > This closely matches how I refactored the Rockchip eFUSE and OTP driver > in mainline U-Boot to handle word/block reads back in 2023, see [1]. >=20 > [1] http://lore.kernel.org/r/20230222224436.1570224-3-jonas@kwiboo.se/ > --- > drivers/nvmem/rockchip-otp.c | 72 ++++++++++++++++++++---------------- > 1 file changed, 40 insertions(+), 32 deletions(-) >=20 > diff --git a/drivers/nvmem/rockchip-otp.c b/drivers/nvmem/rockchip-otp.c > index d88f12c53242..45bbb6147fb7 100644 > --- a/drivers/nvmem/rockchip-otp.c > +++ b/drivers/nvmem/rockchip-otp.c > @@ -59,7 +59,6 @@ > #define RK3588_OTPC_AUTO_EN 0x08 > #define RK3588_OTPC_INT_ST 0x84 > #define RK3588_OTPC_DOUT0 0x20 > -#define RK3588_NBYTES 4 > #define RK3588_BURST_NUM 1 > #define RK3588_BURST_SHIFT 8 > #define RK3588_ADDR_SHIFT 16 > @@ -69,6 +68,7 @@ > struct rockchip_data { > int size; > int read_offset; > + int word_size; > const char * const *clks; > int num_clks; > nvmem_reg_read_t reg_read; > @@ -185,48 +185,28 @@ static int px30_otp_read(void *context, unsigned in= t offset, > } > =20 > static int rk3588_otp_read(void *context, unsigned int offset, > - void *val, size_t bytes) > + void *val, size_t count) > { > struct rockchip_otp *otp =3D context; > - unsigned int addr_start, addr_end, addr_len; > - int ret, i =3D 0; > - u32 data; > - u8 *buf; > - > - addr_start =3D round_down(offset, RK3588_NBYTES) / RK3588_NBYTES; > - addr_end =3D round_up(offset + bytes, RK3588_NBYTES) / RK3588_NBYTES; > - addr_len =3D addr_end - addr_start; > - addr_start +=3D otp->data->read_offset / RK3588_NBYTES; > - > - buf =3D kzalloc(array_size(addr_len, RK3588_NBYTES), GFP_KERNEL); > - if (!buf) > - return -ENOMEM; > + u32 *buf =3D val; > + int ret; > =20 > - while (addr_len--) { > - writel((addr_start << RK3588_ADDR_SHIFT) | > + while (count--) { > + writel((offset++ << RK3588_ADDR_SHIFT) | > (RK3588_BURST_NUM << RK3588_BURST_SHIFT), > otp->base + RK3588_OTPC_AUTO_CTRL); > writel(RK3588_AUTO_EN, otp->base + RK3588_OTPC_AUTO_EN); > =20 > ret =3D rockchip_otp_wait_status(otp, RK3588_OTPC_INT_ST, > RK3588_RD_DONE); > - if (ret < 0) { > + if (ret) { > dev_err(otp->dev, "timeout during read setup\n"); > - goto read_end; > + return ret; > } > =20 > - data =3D readl(otp->base + RK3588_OTPC_DOUT0); > - memcpy(&buf[i], &data, RK3588_NBYTES); > - > - i +=3D RK3588_NBYTES; > - addr_start++; > + *buf++ =3D readl(otp->base + RK3588_OTPC_DOUT0); > } > =20 > - memcpy(val, buf + offset % RK3588_NBYTES, bytes); > - > -read_end: > - kfree(buf); > - > return ret; > } > =20 > @@ -234,7 +214,7 @@ static int rockchip_otp_read(void *context, unsigned = int offset, > void *val, size_t bytes) > { > struct rockchip_otp *otp =3D context; > - int ret; > + int ret, word_size; > =20 > if (!otp->data || !otp->data->reg_read) > return -EINVAL; > @@ -245,8 +225,34 @@ static int rockchip_otp_read(void *context, unsigned= int offset, > return ret; > } > =20 > - ret =3D otp->data->reg_read(context, offset, val, bytes); > + offset +=3D otp->data->read_offset; > + word_size =3D otp->data->word_size; > + > + if (word_size > 1) { > + unsigned int addr_start, addr_end; > + size_t count; > + u8 *buf; > + > + addr_start =3D offset / word_size; > + addr_end =3D DIV_ROUND_UP(offset + bytes, word_size); > + count =3D addr_end - addr_start; > + > + buf =3D kzalloc(array_size(count, word_size), GFP_KERNEL); > + if (!buf) { > + ret =3D -ENOMEM; > + goto err; > + } > + > + ret =3D otp->data->reg_read(context, addr_start, buf, count); > + if (!ret) > + memcpy(val, buf + (offset % word_size), bytes); > + > + kfree(buf); > + } else { > + ret =3D otp->data->reg_read(context, offset, val, bytes); > + } > =20 > +err: > clk_bulk_disable_unprepare(otp->data->num_clks, otp->clks); > =20 > return ret; > @@ -259,7 +265,7 @@ static struct nvmem_config otp_config =3D { > .type =3D NVMEM_TYPE_OTP, > .read_only =3D true, > .stride =3D 1, > - .word_size =3D 1, > + .word_size =3D sizeof(u8), > .reg_read =3D rockchip_otp_read, > }; > =20 > @@ -277,6 +283,7 @@ static const struct rockchip_data px30_data =3D { > static const struct rockchip_data rk3576_data =3D { > .size =3D 0x100, > .read_offset =3D 0x700, > + .word_size =3D sizeof(u32), > .clks =3D px30_otp_clocks, > .num_clks =3D ARRAY_SIZE(px30_otp_clocks), > .reg_read =3D rk3588_otp_read, > @@ -289,6 +296,7 @@ static const char * const rk3588_otp_clocks[] =3D { > static const struct rockchip_data rk3588_data =3D { > .size =3D 0x400, > .read_offset =3D 0xc00, > + .word_size =3D sizeof(u32), > .clks =3D rk3588_otp_clocks, > .num_clks =3D ARRAY_SIZE(rk3588_otp_clocks), > .reg_read =3D rk3588_otp_read, >=20 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 DFF97C369C2 for ; Tue, 22 Apr 2025 10:28:33 +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: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-Owner; bh=S3XyQQSpxUOCPWkaiUQcJP8uA9IKarPPucOBH8vdtAE=; b=2xMzebZ2kCvJ07 NyiWmMYAib6Zp3eft2U6B+2Og65CLlbtf6w/qRb+5JzDT1PFTc6YS6csWz/GF5ruMnbaUkN5Cf9FN /lPFzFFiwJyQ2rD6SHSdvfCO8t7nntV582kdsr0exwNeyNo64Zqpqwg0eAMZE42vwQnC62QFmjNke 0W19V1qjYsAFDuhU4m3C2V33athrZuwGSz1HTq2oc6MaA6lSmuqK4pBk3LDTs2zkKGD+YSNK24Pl0 EzgMqUz5pgvuIGDFqNGi0CryozkpOf4QURj5BGSzocp8yw+8blICrlfMVekjQoAqiUzXSXh0hQ64W yiqayxvFGujDptXtOd2Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1u7Ara-00000006lJA-44KS; Tue, 22 Apr 2025 10:28:26 +0000 Received: from gloria.sntech.de ([185.11.138.130]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1u7A3z-00000006aEa-3CN9; Tue, 22 Apr 2025 09:37:13 +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:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID; bh=57lyUIEE7vSaZrCMWMWd1cdH5EZ4FUPWsTI4YfTuZfY=; b=SgG+lzHMUCx8/+Lz3f5uoburLu CQNnXEe4FEviGlERtVrUbzbdeZf/HnYumB4MsUIGyFmYvtk4xtUWLPl67qT9/96LP/S+PsWi0WJiU yBXkPJO0ZUOa8K4IkpQYDlYyK2lwdL1XqY6d7PvhEdKkM+o029yBlWJz9SkrX18Of40a/7hpFrtk2 P+ulQSVjx3Yn2nqriwP4OR7GgEjO3wEMNZ2X0ZQ7RM0kASFnjb3ZbJfvtrnTcQ75RsUdY2ri6Vm3p q1vSOQG1gBwKecGYZU55CexPpFA+gRCqbhnOds9dCcXuaiSjQFdwsjllH16mhs/7nfJm+2y+7Nvc0 HLSeeJWw==; Received: from i53875b95.versanet.de ([83.135.91.149] helo=diego.localnet) by gloria.sntech.de with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1u7A3v-00014B-J1; Tue, 22 Apr 2025 11:37:07 +0200 From: Heiko =?UTF-8?B?U3TDvGJuZXI=?= To: Srinivas Kandagatla , Jonas Karlman Cc: linux-rockchip@lists.infradead.org, Jonas Karlman , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] nvmem: rockchip-otp: Handle internal word_size in main reg_read op Date: Tue, 22 Apr 2025 11:37:06 +0200 Message-ID: <3635379.iIbC2pHGDl@diego> In-Reply-To: <20250316191900.1858944-1-jonas@kwiboo.se> References: <20250316191900.1858944-1-jonas@kwiboo.se> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250422_023711_825010_20D718B1 X-CRM114-Status: GOOD ( 26.35 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org QW0gU29ubnRhZywgMTYuIE3DpHJ6IDIwMjUsIDIwOjE4OjU4IE1pdHRlbGV1cm9ww6Rpc2NoZSBT b21tZXJ6ZWl0IHNjaHJpZWIgSm9uYXMgS2FybG1hbjoKPiBSb2NrY2hpcCBTb0NzIFJLMzU3NiBh bmQgUkszNTg4IHJlYWQgZGF0YSBmcm9tIHRoZSBPVFAgdXNpbmcgMzItYml0Cj4gd29yZHMgaW5z dGVhZCBvZiBub3JtYWwgOC1iaXQgYnl0ZXMuIFNpbWlsYXIgUkszNTA2LCBSSzM1MjgsIFJLMzU2 MiBhbmQKPiBSSzM1Njggd2lsbCByZWFkIGRhdGEgZnJvbSBPVFAgdXNpbmcgMTYtYml0IHdvcmRz Lgo+IAo+IFRoZSBudm1lbSBjb3JlIHN0cmlkZSBhbmQgd29yZF9zaXplIGNhbm5vdCBmdWxseSBi ZSB1c2VkIGFzIGNlbGxzIGlzIG5vdAo+IGFsd2F5cyBhbGlnbmVkLiBDb250aW51ZSB0byByZXBv cnQgYSBzdHJpZGU9MSBhbmQgd29yZF9zaXplPTEgaW4KPiBudm1lbV9jb25maWcgYW5kIGluc3Rl YWQgaGFuZGxlIHVzZSBvZiBTb0Mgc3BlY2lmaWMgd29yZF9zaXplIGludGVybmFsbHkKPiBpbiB0 aGUgZHJpdmVyLgo+IAo+IE1vdmUgY3VycmVudCBTb0Mgc3BlY2lmaWMgd29yZF9zaXplIGhhbmRs aW5nIGZyb20gdGhlIFJLMzU4OCByZWFkX3JlZwo+IG9wZXJhdGlvbiB0byB0aGUgbWFpbiByZWFk X3JlZyBvcGVyYXRpb24gdG8gaGVscCBzaW1wbGlmeSB0aGUgU29DCj4gc3BlY2lmaWMgcmVhZF9y ZWcgb3BlcmF0aW9uIGFuZCBhbGxvdyBjb2RlIHJldXNlIGluIGEgZnV0dXJlIFJLMzU2OAo+IHJl Z19yZWFkIG9wZXJhdGlvbi4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBKb25hcyBLYXJsbWFuIDxqb25h c0Brd2lib28uc2U+CgpSZXZpZXdlZC1ieTogSGVpa28gU3R1ZWJuZXIgPGhlaWtvQHNudGVjaC5k ZT4KCk9uIGJvdGggcmszNTc2IGFuZCByazM1ODggY29tcGFyZWQgbnZtZW0gY29udGVudCBiZWZv cmUgYW5kIGFmdGVyCnRoZSBjaGFuZ2UsIHNvCgpUZXN0ZWQtYnk6IEhlaWtvIFN0dWVibmVyIDxo ZWlrb0BzbnRlY2guZGU+CgoKPiAtLS0KPiBUaGlzIGNsb3NlbHkgbWF0Y2hlcyBob3cgSSByZWZh Y3RvcmVkIHRoZSBSb2NrY2hpcCBlRlVTRSBhbmQgT1RQIGRyaXZlcgo+IGluIG1haW5saW5lIFUt Qm9vdCB0byBoYW5kbGUgd29yZC9ibG9jayByZWFkcyBiYWNrIGluIDIwMjMsIHNlZSBbMV0uCj4g Cj4gWzFdIGh0dHA6Ly9sb3JlLmtlcm5lbC5vcmcvci8yMDIzMDIyMjIyNDQzNi4xNTcwMjI0LTMt am9uYXNAa3dpYm9vLnNlLwo+IC0tLQo+ICBkcml2ZXJzL252bWVtL3JvY2tjaGlwLW90cC5jIHwg NzIgKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tCj4gIDEgZmlsZSBjaGFuZ2Vk LCA0MCBpbnNlcnRpb25zKCspLCAzMiBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9udm1lbS9yb2NrY2hpcC1vdHAuYyBiL2RyaXZlcnMvbnZtZW0vcm9ja2NoaXAtb3RwLmMK PiBpbmRleCBkODhmMTJjNTMyNDIuLjQ1YmJiNjE0N2ZiNyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJz L252bWVtL3JvY2tjaGlwLW90cC5jCj4gKysrIGIvZHJpdmVycy9udm1lbS9yb2NrY2hpcC1vdHAu Ywo+IEBAIC01OSw3ICs1OSw2IEBACj4gICNkZWZpbmUgUkszNTg4X09UUENfQVVUT19FTgkJMHgw OAo+ICAjZGVmaW5lIFJLMzU4OF9PVFBDX0lOVF9TVAkJMHg4NAo+ICAjZGVmaW5lIFJLMzU4OF9P VFBDX0RPVVQwCQkweDIwCj4gLSNkZWZpbmUgUkszNTg4X05CWVRFUwkJCTQKPiAgI2RlZmluZSBS SzM1ODhfQlVSU1RfTlVNCQkxCj4gICNkZWZpbmUgUkszNTg4X0JVUlNUX1NISUZUCQk4Cj4gICNk ZWZpbmUgUkszNTg4X0FERFJfU0hJRlQJCTE2Cj4gQEAgLTY5LDYgKzY4LDcgQEAKPiAgc3RydWN0 IHJvY2tjaGlwX2RhdGEgewo+ICAJaW50IHNpemU7Cj4gIAlpbnQgcmVhZF9vZmZzZXQ7Cj4gKwlp bnQgd29yZF9zaXplOwo+ICAJY29uc3QgY2hhciAqIGNvbnN0ICpjbGtzOwo+ICAJaW50IG51bV9j bGtzOwo+ICAJbnZtZW1fcmVnX3JlYWRfdCByZWdfcmVhZDsKPiBAQCAtMTg1LDQ4ICsxODUsMjgg QEAgc3RhdGljIGludCBweDMwX290cF9yZWFkKHZvaWQgKmNvbnRleHQsIHVuc2lnbmVkIGludCBv ZmZzZXQsCj4gIH0KPiAgCj4gIHN0YXRpYyBpbnQgcmszNTg4X290cF9yZWFkKHZvaWQgKmNvbnRl eHQsIHVuc2lnbmVkIGludCBvZmZzZXQsCj4gLQkJCSAgIHZvaWQgKnZhbCwgc2l6ZV90IGJ5dGVz KQo+ICsJCQkgICB2b2lkICp2YWwsIHNpemVfdCBjb3VudCkKPiAgewo+ICAJc3RydWN0IHJvY2tj aGlwX290cCAqb3RwID0gY29udGV4dDsKPiAtCXVuc2lnbmVkIGludCBhZGRyX3N0YXJ0LCBhZGRy X2VuZCwgYWRkcl9sZW47Cj4gLQlpbnQgcmV0LCBpID0gMDsKPiAtCXUzMiBkYXRhOwo+IC0JdTgg KmJ1ZjsKPiAtCj4gLQlhZGRyX3N0YXJ0ID0gcm91bmRfZG93bihvZmZzZXQsIFJLMzU4OF9OQllU RVMpIC8gUkszNTg4X05CWVRFUzsKPiAtCWFkZHJfZW5kID0gcm91bmRfdXAob2Zmc2V0ICsgYnl0 ZXMsIFJLMzU4OF9OQllURVMpIC8gUkszNTg4X05CWVRFUzsKPiAtCWFkZHJfbGVuID0gYWRkcl9l bmQgLSBhZGRyX3N0YXJ0Owo+IC0JYWRkcl9zdGFydCArPSBvdHAtPmRhdGEtPnJlYWRfb2Zmc2V0 IC8gUkszNTg4X05CWVRFUzsKPiAtCj4gLQlidWYgPSBremFsbG9jKGFycmF5X3NpemUoYWRkcl9s ZW4sIFJLMzU4OF9OQllURVMpLCBHRlBfS0VSTkVMKTsKPiAtCWlmICghYnVmKQo+IC0JCXJldHVy biAtRU5PTUVNOwo+ICsJdTMyICpidWYgPSB2YWw7Cj4gKwlpbnQgcmV0Owo+ICAKPiAtCXdoaWxl IChhZGRyX2xlbi0tKSB7Cj4gLQkJd3JpdGVsKChhZGRyX3N0YXJ0IDw8IFJLMzU4OF9BRERSX1NI SUZUKSB8Cj4gKwl3aGlsZSAoY291bnQtLSkgewo+ICsJCXdyaXRlbCgob2Zmc2V0KysgPDwgUksz NTg4X0FERFJfU0hJRlQpIHwKPiAgCQkgICAgICAgKFJLMzU4OF9CVVJTVF9OVU0gPDwgUkszNTg4 X0JVUlNUX1NISUZUKSwKPiAgCQkgICAgICAgb3RwLT5iYXNlICsgUkszNTg4X09UUENfQVVUT19D VFJMKTsKPiAgCQl3cml0ZWwoUkszNTg4X0FVVE9fRU4sIG90cC0+YmFzZSArIFJLMzU4OF9PVFBD X0FVVE9fRU4pOwo+ICAKPiAgCQlyZXQgPSByb2NrY2hpcF9vdHBfd2FpdF9zdGF0dXMob3RwLCBS SzM1ODhfT1RQQ19JTlRfU1QsCj4gIAkJCQkJICAgICAgIFJLMzU4OF9SRF9ET05FKTsKPiAtCQlp ZiAocmV0IDwgMCkgewo+ICsJCWlmIChyZXQpIHsKPiAgCQkJZGV2X2VycihvdHAtPmRldiwgInRp bWVvdXQgZHVyaW5nIHJlYWQgc2V0dXBcbiIpOwo+IC0JCQlnb3RvIHJlYWRfZW5kOwo+ICsJCQly ZXR1cm4gcmV0Owo+ICAJCX0KPiAgCj4gLQkJZGF0YSA9IHJlYWRsKG90cC0+YmFzZSArIFJLMzU4 OF9PVFBDX0RPVVQwKTsKPiAtCQltZW1jcHkoJmJ1ZltpXSwgJmRhdGEsIFJLMzU4OF9OQllURVMp Owo+IC0KPiAtCQlpICs9IFJLMzU4OF9OQllURVM7Cj4gLQkJYWRkcl9zdGFydCsrOwo+ICsJCSpi dWYrKyA9IHJlYWRsKG90cC0+YmFzZSArIFJLMzU4OF9PVFBDX0RPVVQwKTsKPiAgCX0KPiAgCj4g LQltZW1jcHkodmFsLCBidWYgKyBvZmZzZXQgJSBSSzM1ODhfTkJZVEVTLCBieXRlcyk7Cj4gLQo+ IC1yZWFkX2VuZDoKPiAtCWtmcmVlKGJ1Zik7Cj4gLQo+ICAJcmV0dXJuIHJldDsKPiAgfQo+ICAK PiBAQCAtMjM0LDcgKzIxNCw3IEBAIHN0YXRpYyBpbnQgcm9ja2NoaXBfb3RwX3JlYWQodm9pZCAq Y29udGV4dCwgdW5zaWduZWQgaW50IG9mZnNldCwKPiAgCQkJICAgICB2b2lkICp2YWwsIHNpemVf dCBieXRlcykKPiAgewo+ICAJc3RydWN0IHJvY2tjaGlwX290cCAqb3RwID0gY29udGV4dDsKPiAt CWludCByZXQ7Cj4gKwlpbnQgcmV0LCB3b3JkX3NpemU7Cj4gIAo+ICAJaWYgKCFvdHAtPmRhdGEg fHwgIW90cC0+ZGF0YS0+cmVnX3JlYWQpCj4gIAkJcmV0dXJuIC1FSU5WQUw7Cj4gQEAgLTI0NSw4 ICsyMjUsMzQgQEAgc3RhdGljIGludCByb2NrY2hpcF9vdHBfcmVhZCh2b2lkICpjb250ZXh0LCB1 bnNpZ25lZCBpbnQgb2Zmc2V0LAo+ICAJCXJldHVybiByZXQ7Cj4gIAl9Cj4gIAo+IC0JcmV0ID0g b3RwLT5kYXRhLT5yZWdfcmVhZChjb250ZXh0LCBvZmZzZXQsIHZhbCwgYnl0ZXMpOwo+ICsJb2Zm c2V0ICs9IG90cC0+ZGF0YS0+cmVhZF9vZmZzZXQ7Cj4gKwl3b3JkX3NpemUgPSBvdHAtPmRhdGEt PndvcmRfc2l6ZTsKPiArCj4gKwlpZiAod29yZF9zaXplID4gMSkgewo+ICsJCXVuc2lnbmVkIGlu dCBhZGRyX3N0YXJ0LCBhZGRyX2VuZDsKPiArCQlzaXplX3QgY291bnQ7Cj4gKwkJdTggKmJ1ZjsK PiArCj4gKwkJYWRkcl9zdGFydCA9IG9mZnNldCAvIHdvcmRfc2l6ZTsKPiArCQlhZGRyX2VuZCA9 IERJVl9ST1VORF9VUChvZmZzZXQgKyBieXRlcywgd29yZF9zaXplKTsKPiArCQljb3VudCA9IGFk ZHJfZW5kIC0gYWRkcl9zdGFydDsKPiArCj4gKwkJYnVmID0ga3phbGxvYyhhcnJheV9zaXplKGNv dW50LCB3b3JkX3NpemUpLCBHRlBfS0VSTkVMKTsKPiArCQlpZiAoIWJ1Zikgewo+ICsJCQlyZXQg PSAtRU5PTUVNOwo+ICsJCQlnb3RvIGVycjsKPiArCQl9Cj4gKwo+ICsJCXJldCA9IG90cC0+ZGF0 YS0+cmVnX3JlYWQoY29udGV4dCwgYWRkcl9zdGFydCwgYnVmLCBjb3VudCk7Cj4gKwkJaWYgKCFy ZXQpCj4gKwkJCW1lbWNweSh2YWwsIGJ1ZiArIChvZmZzZXQgJSB3b3JkX3NpemUpLCBieXRlcyk7 Cj4gKwo+ICsJCWtmcmVlKGJ1Zik7Cj4gKwl9IGVsc2Ugewo+ICsJCXJldCA9IG90cC0+ZGF0YS0+ cmVnX3JlYWQoY29udGV4dCwgb2Zmc2V0LCB2YWwsIGJ5dGVzKTsKPiArCX0KPiAgCj4gK2VycjoK PiAgCWNsa19idWxrX2Rpc2FibGVfdW5wcmVwYXJlKG90cC0+ZGF0YS0+bnVtX2Nsa3MsIG90cC0+ Y2xrcyk7Cj4gIAo+ICAJcmV0dXJuIHJldDsKPiBAQCAtMjU5LDcgKzI2NSw3IEBAIHN0YXRpYyBz dHJ1Y3QgbnZtZW1fY29uZmlnIG90cF9jb25maWcgPSB7Cj4gIAkudHlwZSA9IE5WTUVNX1RZUEVf T1RQLAo+ICAJLnJlYWRfb25seSA9IHRydWUsCj4gIAkuc3RyaWRlID0gMSwKPiAtCS53b3JkX3Np emUgPSAxLAo+ICsJLndvcmRfc2l6ZSA9IHNpemVvZih1OCksCj4gIAkucmVnX3JlYWQgPSByb2Nr Y2hpcF9vdHBfcmVhZCwKPiAgfTsKPiAgCj4gQEAgLTI3Nyw2ICsyODMsNyBAQCBzdGF0aWMgY29u c3Qgc3RydWN0IHJvY2tjaGlwX2RhdGEgcHgzMF9kYXRhID0gewo+ICBzdGF0aWMgY29uc3Qgc3Ry dWN0IHJvY2tjaGlwX2RhdGEgcmszNTc2X2RhdGEgPSB7Cj4gIAkuc2l6ZSA9IDB4MTAwLAo+ICAJ LnJlYWRfb2Zmc2V0ID0gMHg3MDAsCj4gKwkud29yZF9zaXplID0gc2l6ZW9mKHUzMiksCj4gIAku Y2xrcyA9IHB4MzBfb3RwX2Nsb2NrcywKPiAgCS5udW1fY2xrcyA9IEFSUkFZX1NJWkUocHgzMF9v dHBfY2xvY2tzKSwKPiAgCS5yZWdfcmVhZCA9IHJrMzU4OF9vdHBfcmVhZCwKPiBAQCAtMjg5LDYg KzI5Niw3IEBAIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmszNTg4X290cF9jbG9ja3NbXSA9 IHsKPiAgc3RhdGljIGNvbnN0IHN0cnVjdCByb2NrY2hpcF9kYXRhIHJrMzU4OF9kYXRhID0gewo+ ICAJLnNpemUgPSAweDQwMCwKPiAgCS5yZWFkX29mZnNldCA9IDB4YzAwLAo+ICsJLndvcmRfc2l6 ZSA9IHNpemVvZih1MzIpLAo+ICAJLmNsa3MgPSByazM1ODhfb3RwX2Nsb2NrcywKPiAgCS5udW1f Y2xrcyA9IEFSUkFZX1NJWkUocmszNTg4X290cF9jbG9ja3MpLAo+ICAJLnJlZ19yZWFkID0gcmsz NTg4X290cF9yZWFkLAo+IAoKCgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCkxpbnV4LXJvY2tjaGlwIG1haWxpbmcgbGlzdApMaW51eC1yb2NrY2hpcEBs aXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlz dGluZm8vbGludXgtcm9ja2NoaXAK