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 314BCC44516 for ; Fri, 17 Jul 2026 13:09:24 +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-Transfer-Encoding: Content-Type:MIME-Version:Message-ID:Date:References:In-Reply-To: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=Cn1pFl0mrxmZ5O9Dm58NQlDdGx8NzY2f6Z+2/X5Kfqo=; b=k+dsF4SJmlB7Ssf724D+8khq2m uRjq4aRJ6WxcsUnq6jXNn/C1GW/WK2G2yUSNUkcvQdJ73QaCGhuDUYYOrI0dneYQjJY8SRL+8WYyc wq3t9hEulkhoN2Yj88jwvDkVF3v/RJDc2YQzu/QtoBqDGhXt5j2uWQdsa1rxlasLzEQ2GhSW/rvo3 eaGgliATPkMlYtNKicKbNLGwNqCj3wMJxmzjSOBaSwetBgpYCFdko3zq4q3CqUZ4bjd5UgTBFkJor xoPqlJjc+Ns8WU/oUOUuohX/Oi5vcoUHLjbKAKwgpuVLuFUR0mPMZ7LhbfncIM54vuCPtUHQnecxz HSG2KEmw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wkiJX-00000002Myb-2fwt; Fri, 17 Jul 2026 13:09:15 +0000 Received: from smtpout-02.galae.net ([185.246.84.56]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wkiJS-00000002Muq-3rva for linux-arm-kernel@lists.infradead.org; Fri, 17 Jul 2026 13:09:13 +0000 Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 91B921A104C; Fri, 17 Jul 2026 13:09:07 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 604E360361; Fri, 17 Jul 2026 13:09:07 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 78D5A11BD0158; Fri, 17 Jul 2026 15:09:03 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1784293746; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Cn1pFl0mrxmZ5O9Dm58NQlDdGx8NzY2f6Z+2/X5Kfqo=; b=jWW7QdQ9WgtCFeBDx7anwxwxvIRt/ADCZj39QvGO/0PSwpXBSjOChomR3Dr5GmZiM+/BMZ CoQUHGqv3tTqeUcpCL6AAMytPZMvKel27zuWzPgJnrOdzkT+PTN6dt0wExcDB1bXK21M5i Ro11bNmhblT5MsF7zRzrpM5kNacc4trRWe7k3V7f9M72j81j5X26hxNDhD3CcJvRfJE6jF ctUgVwn7ObdGvIgOy2b3oomyQd5dEAJ4oM+drStkfghEA6qAGsLeRzbFrA5gJZRysMffBa ekOZx/SqXN6fQeO6Xm83cVO9SphTKN9QEfd+27thoqz5hfikpKZBBCmxeXrYBw== From: Miquel Raynal To: James Hilliard Cc: linux-mtd@lists.infradead.org, linux-sunxi@lists.linux.dev, Richard Weinberger , Vignesh Raghavendra , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Richard Genoud , Geert Uytterhoeven , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] mtd: rawnand: sunxi: add H616 MBUS DMA support In-Reply-To: <20260715162444.789303-1-james.hilliard1@gmail.com> (James Hilliard's message of "Wed, 15 Jul 2026 10:24:40 -0600") References: <20260715162444.789303-1-james.hilliard1@gmail.com> User-Agent: mu4e 1.12.7; emacs 30.2 Date: Fri, 17 Jul 2026 15:09:02 +0200 Message-ID: <87v7adix01.fsf@bootlin.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Last-TLS-Session-Version: TLSv1.3 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260717_060911_245845_5BF7CEE8 X-CRM114-Status: GOOD ( 36.34 ) 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 Hi James, On 15/07/2026 at 10:24:40 -06, James Hilliard w= rote: > The H616 NAND controller uses a descriptor-based internal MBUS DMA > engine instead of the direct address and count registers used by the > A23/A33 controller. Since the driver does not support these descriptors, > it currently attempts to request an external rxtx DMA channel and falls > back to PIO when none is provided. > > Add a single-descriptor backend to the existing ECC page DMA paths. > Allocate the descriptor coherently, constrain data mappings to the > controller's 32-bit address range, program the H6-style data block mask, > and request an interrupt for both command and DMA completion. Keep the > existing external DMA and legacy MBUS DMA paths unchanged, and fall back > to PIO if the descriptor cannot be allocated. > > Hardware testing on an H616 board with 2 KiB-page SLC NAND > confirmed that the descriptor path improves sustained read throughput. I would be nice to show the output of a flash_speed -dc100 /dev/mtdX before and after. > Signed-off-by: James Hilliard > --- > drivers/mtd/nand/raw/sunxi_nand.c | 110 ++++++++++++++++++++++++++---- > 1 file changed, 95 insertions(+), 15 deletions(-) > > diff --git a/drivers/mtd/nand/raw/sunxi_nand.c b/drivers/mtd/nand/raw/sun= xi_nand.c > index 02647565c8ba..8a136b9fa7cc 100644 > --- a/drivers/mtd/nand/raw/sunxi_nand.c > +++ b/drivers/mtd/nand/raw/sunxi_nand.c > @@ -79,6 +79,10 @@ > #define NFC_REG_H6_MDMA_BUF_ADDR 0x0210 > #define NFC_REG_H6_MDMA_CNT 0x0214 >=20=20 > +#define NFC_MDMA_DESC_LAST BIT(2) > +#define NFC_MDMA_DESC_FIRST BIT(3) > +#define NFC_MDMA_DESC_SIZE_MASK GENMASK(15, 0) > + > #define NFC_RAM0_BASE 0x0400 > #define NFC_RAM1_BASE 0x0800 >=20=20 > @@ -267,12 +271,19 @@ static inline struct sunxi_nand_chip *to_sunxi_nand= (struct nand_chip *nand) > return container_of(nand, struct sunxi_nand_chip, nand); > } >=20=20 > +struct sunxi_nfc_mdma_desc { > + __le32 config; > + __le32 size; > + __le32 buf; > + __le32 next; > +}; Shouldn't this be declared __packed and possibly even __aligned? > /* > * NAND Controller capabilities structure: stores NAND controller capabi= lities > * for distinction between compatible strings. > * > - * @has_mdma: Use mbus dma mode, otherwise general dma > - * through MBUS on A23/A33 needs extra configuration. > + * @has_mdma: Use A23/A33-style MBUS DMA registers > + * @has_mdma_desc: MBUS DMA uses H6-style descriptors > * @has_ecc_block_512: If the ECC can handle 512B or only 1024B chunks > * @has_ecc_clk: If the controller needs an ECC clock. > * @has_mbus_clk: If the controller needs a mbus clock. > @@ -304,6 +315,7 @@ static inline struct sunxi_nand_chip *to_sunxi_nand(s= truct nand_chip *nand) > */ > struct sunxi_nfc_caps { > bool has_mdma; > + bool has_mdma_desc; > bool has_ecc_block_512; > bool has_ecc_clk; > bool has_mbus_clk; > @@ -346,6 +358,8 @@ struct sunxi_nfc_caps { > * controller > * @complete: a completion object used to wait for NAND controller events > * @dmac: the DMA channel attached to the NAND controller > + * @mdma_desc: H6-style MBUS DMA descriptor > + * @mdma_desc_dma: DMA address of @mdma_desc > * @caps: NAND Controller capabilities > */ > struct sunxi_nfc { > @@ -362,6 +376,8 @@ struct sunxi_nfc { > struct list_head chips; > struct completion complete; > struct dma_chan *dmac; > + struct sunxi_nfc_mdma_desc *mdma_desc; > + dma_addr_t mdma_desc_dma; > const struct sunxi_nfc_caps *caps; > }; >=20=20 > @@ -370,6 +386,11 @@ static inline struct sunxi_nfc *to_sunxi_nfc(struct = nand_controller *ctrl) > return container_of(ctrl, struct sunxi_nfc, controller); > } >=20=20 > +static bool sunxi_nfc_uses_mdma(const struct sunxi_nfc *nfc) may I suggest sunxi_nfc_use_mdma? > +{ > + return nfc->caps->has_mdma || nfc->mdma_desc; I don't get the || there? What are you trying to check exactly? > +} > + > static irqreturn_t sunxi_nfc_interrupt(int irq, void *dev_id) > { > struct sunxi_nfc *nfc =3D dev_id; > @@ -466,7 +487,9 @@ static int sunxi_nfc_dma_op_prepare(struct sunxi_nfc = *nfc, const void *buf, > { > struct dma_async_tx_descriptor *dmad; > enum dma_transfer_direction tdir; > + dma_addr_t buf_dma; > dma_cookie_t dmat; > + int len =3D chunksize * nchunks; > int ret; >=20=20 > if (ddir =3D=3D DMA_FROM_DEVICE) > @@ -474,12 +497,21 @@ static int sunxi_nfc_dma_op_prepare(struct sunxi_nf= c *nfc, const void *buf, > else > tdir =3D DMA_MEM_TO_DEV; >=20=20 > - sg_init_one(sg, buf, nchunks * chunksize); > + sg_init_one(sg, buf, len); > ret =3D dma_map_sg(nfc->dev, sg, 1, ddir); > if (!ret) > return -ENOMEM; >=20=20 > - if (!nfc->caps->has_mdma) { > + buf_dma =3D sg_dma_address(sg); > + > + if (nfc->mdma_desc && > + (len > NFC_MDMA_DESC_SIZE_MASK || !IS_ALIGNED(len, 8) || > + !IS_ALIGNED(buf_dma, 4) || upper_32_bits(buf_dma))) { > + ret =3D -EINVAL; > + goto err_unmap_buf; > + } > + > + if (!sunxi_nfc_uses_mdma(nfc)) { > dmad =3D dmaengine_prep_slave_sg(nfc->dmac, sg, 1, tdir, DMA_CTRL_ACK); > if (!dmad) { > ret =3D -EINVAL; > @@ -489,14 +521,30 @@ static int sunxi_nfc_dma_op_prepare(struct sunxi_nf= c *nfc, const void *buf, >=20=20 > writel(readl(nfc->regs + NFC_REG_CTL) | NFC_RAM_METHOD, > nfc->regs + NFC_REG_CTL); > - writel(nchunks, nfc->regs + NFC_REG_SECTOR_NUM); > + writel(nfc->mdma_desc ? GENMASK(nchunks - 1, 0) : nchunks, Very unclear, can this be simplified or at least explained? > + nfc->regs + NFC_REG_SECTOR_NUM); > writel(chunksize, nfc->regs + NFC_REG_CNT); >=20=20 > - if (nfc->caps->has_mdma) { > + if (sunxi_nfc_uses_mdma(nfc)) > writel(readl(nfc->regs + NFC_REG_CTL) & ~NFC_DMA_TYPE_NORMAL, > nfc->regs + NFC_REG_CTL); > - writel(chunksize * nchunks, nfc->regs + NFC_REG_MDMA_CNT); > - writel(sg_dma_address(sg), nfc->regs + NFC_REG_MDMA_ADDR); > + > + if (nfc->mdma_desc) { > + struct sunxi_nfc_mdma_desc *desc =3D nfc->mdma_desc; > + > + desc->config =3D cpu_to_le32(NFC_MDMA_DESC_FIRST | > + NFC_MDMA_DESC_LAST); > + desc->size =3D cpu_to_le32(len); > + desc->buf =3D cpu_to_le32(lower_32_bits(buf_dma)); Does lower_32_bits() mean anything here since you already check for the upper bits before? This check may even be redundant given the fact that the addressing capability has already been set to 32 bits, so the dma_map* call would catch this anyway. > + desc->next =3D cpu_to_le32(lower_32_bits(nfc->mdma_desc_dma)); Ditto Plus, the endianness of the controller is little endian, so writel already does the endianness conversion if need be. cpu_to_le32() here seems irrelevant. > + > + writel(BIT(0), nfc->regs + NFC_REG_H6_MDMA_STA); BIT(0) should be #define'd > + dma_wmb(); > + writel(lower_32_bits(nfc->mdma_desc_dma), > + nfc->regs + NFC_REG_H6_MDMA_DLBA_REG); > + } else if (nfc->caps->has_mdma) { > + writel(len, nfc->regs + NFC_REG_MDMA_CNT); > + writel(buf_dma, nfc->regs + NFC_REG_MDMA_ADDR); > } else { > dmat =3D dmaengine_submit(dmad); >=20=20 > @@ -525,6 +573,14 @@ static void sunxi_nfc_dma_op_cleanup(struct sunxi_nf= c *nfc, > nfc->regs + NFC_REG_CTL); > } >=20=20 > +static void sunxi_nfc_dma_op_abort(struct sunxi_nfc *nfc) > +{ > + if (nfc->mdma_desc) I would prefer to stick to the same condition all the time whether we are using peripheral dma (MDMA) or not. > + sunxi_nfc_rst(nfc); > + else if (!nfc->caps->has_mdma) Shouldn't this be a "else" here? > + dmaengine_terminate_all(nfc->dmac); > +} > + > static void sunxi_nfc_select_chip(struct nand_chip *nand, unsigned int c= s) > { > struct mtd_info *mtd =3D nand_to_mtd(nand); > @@ -1202,7 +1258,7 @@ static int sunxi_nfc_hw_ecc_read_chunks_dma(struct = nand_chip *nand, uint8_t *buf >=20=20 > wait =3D NFC_CMD_INT_FLAG; >=20=20 > - if (nfc->caps->has_mdma) > + if (sunxi_nfc_uses_mdma(nfc)) > wait |=3D NFC_DMA_INT_FLAG; > else > dma_async_issue_pending(nfc->dmac); Thanks, Miqu=C3=A8l 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 1119AC4451C for ; Fri, 17 Jul 2026 13:09: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: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-ID:Date:References :In-Reply-To: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=A2LmB48/F3O03kwnbzWwhyATOSCjI+QhsMw4WkhM86o=; b=GGnBvxNXoaD9V8 qrY4o9rpVCMY+5rmL/1Lr7wEin7TFpMHTWh33bBXwrXDiQHq6Y6DWtUSx3/RYHS/9LisRxV7TRaTy 9LHFS1RZSKpbwh4PVeBeB0XpL0r5GAqkg1YpUPygTvTPYBTRN/355a8PooTnxslVPz1VD0GM4UAzU v9t+kcgXzQkC3tS80BktJxB2/g7aOiyXjRf2Hea5MKWyNm9SWEu8hX+lM/DdfWYRpz/H+8i0SSM7P 5owHeIrhF70CHu7bE4iNiFHq0D3h6+G12hPzIew5VtVAWeWWSp5tDvZsmZLnPrVjrrnWYF8Fq05jq x/DpWjnDiWxhd3Ot2/1w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wkiJX-00000002Mym-3HnW; Fri, 17 Jul 2026 13:09:15 +0000 Received: from smtpout-03.galae.net ([185.246.85.4]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wkiJT-00000002Mv8-0KpB for linux-mtd@lists.infradead.org; Fri, 17 Jul 2026 13:09:13 +0000 Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 950424E40E0E; Fri, 17 Jul 2026 13:09:07 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 604E360361; Fri, 17 Jul 2026 13:09:07 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 78D5A11BD0158; Fri, 17 Jul 2026 15:09:03 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1784293746; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Cn1pFl0mrxmZ5O9Dm58NQlDdGx8NzY2f6Z+2/X5Kfqo=; b=jWW7QdQ9WgtCFeBDx7anwxwxvIRt/ADCZj39QvGO/0PSwpXBSjOChomR3Dr5GmZiM+/BMZ CoQUHGqv3tTqeUcpCL6AAMytPZMvKel27zuWzPgJnrOdzkT+PTN6dt0wExcDB1bXK21M5i Ro11bNmhblT5MsF7zRzrpM5kNacc4trRWe7k3V7f9M72j81j5X26hxNDhD3CcJvRfJE6jF ctUgVwn7ObdGvIgOy2b3oomyQd5dEAJ4oM+drStkfghEA6qAGsLeRzbFrA5gJZRysMffBa ekOZx/SqXN6fQeO6Xm83cVO9SphTKN9QEfd+27thoqz5hfikpKZBBCmxeXrYBw== From: Miquel Raynal To: James Hilliard Cc: linux-mtd@lists.infradead.org, linux-sunxi@lists.linux.dev, Richard Weinberger , Vignesh Raghavendra , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Richard Genoud , Geert Uytterhoeven , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] mtd: rawnand: sunxi: add H616 MBUS DMA support In-Reply-To: <20260715162444.789303-1-james.hilliard1@gmail.com> (James Hilliard's message of "Wed, 15 Jul 2026 10:24:40 -0600") References: <20260715162444.789303-1-james.hilliard1@gmail.com> User-Agent: mu4e 1.12.7; emacs 30.2 Date: Fri, 17 Jul 2026 15:09:02 +0200 Message-ID: <87v7adix01.fsf@bootlin.com> MIME-Version: 1.0 X-Last-TLS-Session-Version: TLSv1.3 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260717_060911_406832_1636D6DD X-CRM114-Status: GOOD ( 35.85 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org SGkgSmFtZXMsCgpPbiAxNS8wNy8yMDI2IGF0IDEwOjI0OjQwIC0wNiwgSmFtZXMgSGlsbGlhcmQg PGphbWVzLmhpbGxpYXJkMUBnbWFpbC5jb20+IHdyb3RlOgoKPiBUaGUgSDYxNiBOQU5EIGNvbnRy b2xsZXIgdXNlcyBhIGRlc2NyaXB0b3ItYmFzZWQgaW50ZXJuYWwgTUJVUyBETUEKPiBlbmdpbmUg aW5zdGVhZCBvZiB0aGUgZGlyZWN0IGFkZHJlc3MgYW5kIGNvdW50IHJlZ2lzdGVycyB1c2VkIGJ5 IHRoZQo+IEEyMy9BMzMgY29udHJvbGxlci4gU2luY2UgdGhlIGRyaXZlciBkb2VzIG5vdCBzdXBw b3J0IHRoZXNlIGRlc2NyaXB0b3JzLAo+IGl0IGN1cnJlbnRseSBhdHRlbXB0cyB0byByZXF1ZXN0 IGFuIGV4dGVybmFsIHJ4dHggRE1BIGNoYW5uZWwgYW5kIGZhbGxzCj4gYmFjayB0byBQSU8gd2hl biBub25lIGlzIHByb3ZpZGVkLgo+Cj4gQWRkIGEgc2luZ2xlLWRlc2NyaXB0b3IgYmFja2VuZCB0 byB0aGUgZXhpc3RpbmcgRUNDIHBhZ2UgRE1BIHBhdGhzLgo+IEFsbG9jYXRlIHRoZSBkZXNjcmlw dG9yIGNvaGVyZW50bHksIGNvbnN0cmFpbiBkYXRhIG1hcHBpbmdzIHRvIHRoZQo+IGNvbnRyb2xs ZXIncyAzMi1iaXQgYWRkcmVzcyByYW5nZSwgcHJvZ3JhbSB0aGUgSDYtc3R5bGUgZGF0YSBibG9j ayBtYXNrLAo+IGFuZCByZXF1ZXN0IGFuIGludGVycnVwdCBmb3IgYm90aCBjb21tYW5kIGFuZCBE TUEgY29tcGxldGlvbi4gS2VlcCB0aGUKPiBleGlzdGluZyBleHRlcm5hbCBETUEgYW5kIGxlZ2Fj eSBNQlVTIERNQSBwYXRocyB1bmNoYW5nZWQsIGFuZCBmYWxsIGJhY2sKPiB0byBQSU8gaWYgdGhl IGRlc2NyaXB0b3IgY2Fubm90IGJlIGFsbG9jYXRlZC4KPgo+IEhhcmR3YXJlIHRlc3Rpbmcgb24g YW4gSDYxNiBib2FyZCB3aXRoIDIgS2lCLXBhZ2UgU0xDIE5BTkQKPiBjb25maXJtZWQgdGhhdCB0 aGUgZGVzY3JpcHRvciBwYXRoIGltcHJvdmVzIHN1c3RhaW5lZCByZWFkIHRocm91Z2hwdXQuCgpJ IHdvdWxkIGJlIG5pY2UgdG8gc2hvdyB0aGUgb3V0cHV0IG9mIGEgZmxhc2hfc3BlZWQgLWRjMTAw IC9kZXYvbXRkWApiZWZvcmUgYW5kIGFmdGVyLgoKPiBTaWduZWQtb2ZmLWJ5OiBKYW1lcyBIaWxs aWFyZCA8amFtZXMuaGlsbGlhcmQxQGdtYWlsLmNvbT4KPiAtLS0KPiAgZHJpdmVycy9tdGQvbmFu ZC9yYXcvc3VueGlfbmFuZC5jIHwgMTEwICsrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLQo+ ICAxIGZpbGUgY2hhbmdlZCwgOTUgaW5zZXJ0aW9ucygrKSwgMTUgZGVsZXRpb25zKC0pCj4KPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvc3VueGlfbmFuZC5jIGIvZHJpdmVycy9t dGQvbmFuZC9yYXcvc3VueGlfbmFuZC5jCj4gaW5kZXggMDI2NDc1NjVjOGJhLi44YTEzNmI5ZmE3 Y2MgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvc3VueGlfbmFuZC5jCj4gKysr IGIvZHJpdmVycy9tdGQvbmFuZC9yYXcvc3VueGlfbmFuZC5jCj4gQEAgLTc5LDYgKzc5LDEwIEBA Cj4gICNkZWZpbmUgTkZDX1JFR19INl9NRE1BX0JVRl9BRERSIDB4MDIxMAo+ICAjZGVmaW5lIE5G Q19SRUdfSDZfTURNQV9DTlQJMHgwMjE0Cj4gIAo+ICsjZGVmaW5lIE5GQ19NRE1BX0RFU0NfTEFT VAlCSVQoMikKPiArI2RlZmluZSBORkNfTURNQV9ERVNDX0ZJUlNUCUJJVCgzKQo+ICsjZGVmaW5l IE5GQ19NRE1BX0RFU0NfU0laRV9NQVNLCUdFTk1BU0soMTUsIDApCj4gKwo+ICAjZGVmaW5lIE5G Q19SQU0wX0JBU0UJCTB4MDQwMAo+ICAjZGVmaW5lIE5GQ19SQU0xX0JBU0UJCTB4MDgwMAo+ICAK PiBAQCAtMjY3LDEyICsyNzEsMTkgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3VueGlfbmFuZF9j aGlwICp0b19zdW54aV9uYW5kKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQpCj4gIAlyZXR1cm4gY29u dGFpbmVyX29mKG5hbmQsIHN0cnVjdCBzdW54aV9uYW5kX2NoaXAsIG5hbmQpOwo+ICB9Cj4gIAo+ ICtzdHJ1Y3Qgc3VueGlfbmZjX21kbWFfZGVzYyB7Cj4gKwlfX2xlMzIgY29uZmlnOwo+ICsJX19s ZTMyIHNpemU7Cj4gKwlfX2xlMzIgYnVmOwo+ICsJX19sZTMyIG5leHQ7Cj4gK307CgpTaG91bGRu J3QgdGhpcyBiZSBkZWNsYXJlZCBfX3BhY2tlZCBhbmQgcG9zc2libHkgZXZlbiBfX2FsaWduZWQ/ Cgo+ICAvKgo+ICAgKiBOQU5EIENvbnRyb2xsZXIgY2FwYWJpbGl0aWVzIHN0cnVjdHVyZTogc3Rv cmVzIE5BTkQgY29udHJvbGxlciBjYXBhYmlsaXRpZXMKPiAgICogZm9yIGRpc3RpbmN0aW9uIGJl dHdlZW4gY29tcGF0aWJsZSBzdHJpbmdzLgo+ICAgKgo+IC0gKiBAaGFzX21kbWE6CQlVc2UgbWJ1 cyBkbWEgbW9kZSwgb3RoZXJ3aXNlIGdlbmVyYWwgZG1hCj4gLSAqCQkJdGhyb3VnaCBNQlVTIG9u IEEyMy9BMzMgbmVlZHMgZXh0cmEgY29uZmlndXJhdGlvbi4KPiArICogQGhhc19tZG1hOgkJVXNl IEEyMy9BMzMtc3R5bGUgTUJVUyBETUEgcmVnaXN0ZXJzCj4gKyAqIEBoYXNfbWRtYV9kZXNjOglN QlVTIERNQSB1c2VzIEg2LXN0eWxlIGRlc2NyaXB0b3JzCj4gICAqIEBoYXNfZWNjX2Jsb2NrXzUx MjoJSWYgdGhlIEVDQyBjYW4gaGFuZGxlIDUxMkIgb3Igb25seSAxMDI0QiBjaHVua3MKPiAgICog QGhhc19lY2NfY2xrOglJZiB0aGUgY29udHJvbGxlciBuZWVkcyBhbiBFQ0MgY2xvY2suCj4gICAq IEBoYXNfbWJ1c19jbGs6CUlmIHRoZSBjb250cm9sbGVyIG5lZWRzIGEgbWJ1cyBjbG9jay4KPiBA QCAtMzA0LDYgKzMxNSw3IEBAIHN0YXRpYyBpbmxpbmUgc3RydWN0IHN1bnhpX25hbmRfY2hpcCAq dG9fc3VueGlfbmFuZChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kKQo+ICAgKi8KPiAgc3RydWN0IHN1 bnhpX25mY19jYXBzIHsKPiAgCWJvb2wgaGFzX21kbWE7Cj4gKwlib29sIGhhc19tZG1hX2Rlc2M7 Cj4gIAlib29sIGhhc19lY2NfYmxvY2tfNTEyOwo+ICAJYm9vbCBoYXNfZWNjX2NsazsKPiAgCWJv b2wgaGFzX21idXNfY2xrOwo+IEBAIC0zNDYsNiArMzU4LDggQEAgc3RydWN0IHN1bnhpX25mY19j YXBzIHsKPiAgICoJICAgY29udHJvbGxlcgo+ICAgKiBAY29tcGxldGU6IGEgY29tcGxldGlvbiBv YmplY3QgdXNlZCB0byB3YWl0IGZvciBOQU5EIGNvbnRyb2xsZXIgZXZlbnRzCj4gICAqIEBkbWFj OiB0aGUgRE1BIGNoYW5uZWwgYXR0YWNoZWQgdG8gdGhlIE5BTkQgY29udHJvbGxlcgo+ICsgKiBA bWRtYV9kZXNjOiBINi1zdHlsZSBNQlVTIERNQSBkZXNjcmlwdG9yCj4gKyAqIEBtZG1hX2Rlc2Nf ZG1hOiBETUEgYWRkcmVzcyBvZiBAbWRtYV9kZXNjCj4gICAqIEBjYXBzOiBOQU5EIENvbnRyb2xs ZXIgY2FwYWJpbGl0aWVzCj4gICAqLwo+ICBzdHJ1Y3Qgc3VueGlfbmZjIHsKPiBAQCAtMzYyLDYg KzM3Niw4IEBAIHN0cnVjdCBzdW54aV9uZmMgewo+ICAJc3RydWN0IGxpc3RfaGVhZCBjaGlwczsK PiAgCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRlOwo+ICAJc3RydWN0IGRtYV9jaGFuICpkbWFj Owo+ICsJc3RydWN0IHN1bnhpX25mY19tZG1hX2Rlc2MgKm1kbWFfZGVzYzsKPiArCWRtYV9hZGRy X3QgbWRtYV9kZXNjX2RtYTsKPiAgCWNvbnN0IHN0cnVjdCBzdW54aV9uZmNfY2FwcyAqY2FwczsK PiAgfTsKPiAgCj4gQEAgLTM3MCw2ICszODYsMTEgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3Vu eGlfbmZjICp0b19zdW54aV9uZmMoc3RydWN0IG5hbmRfY29udHJvbGxlciAqY3RybCkKPiAgCXJl dHVybiBjb250YWluZXJfb2YoY3RybCwgc3RydWN0IHN1bnhpX25mYywgY29udHJvbGxlcik7Cj4g IH0KPiAgCj4gK3N0YXRpYyBib29sIHN1bnhpX25mY191c2VzX21kbWEoY29uc3Qgc3RydWN0IHN1 bnhpX25mYyAqbmZjKQoKbWF5IEkgc3VnZ2VzdCBzdW54aV9uZmNfdXNlX21kbWE/Cgo+ICt7Cj4g KwlyZXR1cm4gbmZjLT5jYXBzLT5oYXNfbWRtYSB8fCBuZmMtPm1kbWFfZGVzYzsKCkkgZG9uJ3Qg Z2V0IHRoZSB8fCB0aGVyZT8gV2hhdCBhcmUgeW91IHRyeWluZyB0byBjaGVjayBleGFjdGx5PwoK PiArfQo+ICsKPiAgc3RhdGljIGlycXJldHVybl90IHN1bnhpX25mY19pbnRlcnJ1cHQoaW50IGly cSwgdm9pZCAqZGV2X2lkKQo+ICB7Cj4gIAlzdHJ1Y3Qgc3VueGlfbmZjICpuZmMgPSBkZXZfaWQ7 Cj4gQEAgLTQ2Niw3ICs0ODcsOSBAQCBzdGF0aWMgaW50IHN1bnhpX25mY19kbWFfb3BfcHJlcGFy ZShzdHJ1Y3Qgc3VueGlfbmZjICpuZmMsIGNvbnN0IHZvaWQgKmJ1ZiwKPiAgewo+ICAJc3RydWN0 IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkbWFkOwo+ICAJZW51bSBkbWFfdHJhbnNmZXJfZGly ZWN0aW9uIHRkaXI7Cj4gKwlkbWFfYWRkcl90IGJ1Zl9kbWE7Cj4gIAlkbWFfY29va2llX3QgZG1h dDsKPiArCWludCBsZW4gPSBjaHVua3NpemUgKiBuY2h1bmtzOwo+ICAJaW50IHJldDsKPiAgCj4g IAlpZiAoZGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpCj4gQEAgLTQ3NCwxMiArNDk3LDIxIEBAIHN0 YXRpYyBpbnQgc3VueGlfbmZjX2RtYV9vcF9wcmVwYXJlKHN0cnVjdCBzdW54aV9uZmMgKm5mYywg Y29uc3Qgdm9pZCAqYnVmLAo+ICAJZWxzZQo+ICAJCXRkaXIgPSBETUFfTUVNX1RPX0RFVjsKPiAg Cj4gLQlzZ19pbml0X29uZShzZywgYnVmLCBuY2h1bmtzICogY2h1bmtzaXplKTsKPiArCXNnX2lu aXRfb25lKHNnLCBidWYsIGxlbik7Cj4gIAlyZXQgPSBkbWFfbWFwX3NnKG5mYy0+ZGV2LCBzZywg MSwgZGRpcik7Cj4gIAlpZiAoIXJldCkKPiAgCQlyZXR1cm4gLUVOT01FTTsKPiAgCj4gLQlpZiAo IW5mYy0+Y2Fwcy0+aGFzX21kbWEpIHsKPiArCWJ1Zl9kbWEgPSBzZ19kbWFfYWRkcmVzcyhzZyk7 Cj4gKwo+ICsJaWYgKG5mYy0+bWRtYV9kZXNjICYmCj4gKwkgICAgKGxlbiA+IE5GQ19NRE1BX0RF U0NfU0laRV9NQVNLIHx8ICFJU19BTElHTkVEKGxlbiwgOCkgfHwKPiArCSAgICAgIUlTX0FMSUdO RUQoYnVmX2RtYSwgNCkgfHwgdXBwZXJfMzJfYml0cyhidWZfZG1hKSkpIHsKPiArCQlyZXQgPSAt RUlOVkFMOwo+ICsJCWdvdG8gZXJyX3VubWFwX2J1ZjsKPiArCX0KPiArCj4gKwlpZiAoIXN1bnhp X25mY191c2VzX21kbWEobmZjKSkgewo+ICAJCWRtYWQgPSBkbWFlbmdpbmVfcHJlcF9zbGF2ZV9z ZyhuZmMtPmRtYWMsIHNnLCAxLCB0ZGlyLCBETUFfQ1RSTF9BQ0spOwo+ICAJCWlmICghZG1hZCkg ewo+ICAJCQlyZXQgPSAtRUlOVkFMOwo+IEBAIC00ODksMTQgKzUyMSwzMCBAQCBzdGF0aWMgaW50 IHN1bnhpX25mY19kbWFfb3BfcHJlcGFyZShzdHJ1Y3Qgc3VueGlfbmZjICpuZmMsIGNvbnN0IHZv aWQgKmJ1ZiwKPiAgCj4gIAl3cml0ZWwocmVhZGwobmZjLT5yZWdzICsgTkZDX1JFR19DVEwpIHwg TkZDX1JBTV9NRVRIT0QsCj4gIAkgICAgICAgbmZjLT5yZWdzICsgTkZDX1JFR19DVEwpOwo+IC0J d3JpdGVsKG5jaHVua3MsIG5mYy0+cmVncyArIE5GQ19SRUdfU0VDVE9SX05VTSk7Cj4gKwl3cml0 ZWwobmZjLT5tZG1hX2Rlc2MgPyBHRU5NQVNLKG5jaHVua3MgLSAxLCAwKSA6IG5jaHVua3MsCgpW ZXJ5IHVuY2xlYXIsIGNhbiB0aGlzIGJlIHNpbXBsaWZpZWQgb3IgYXQgbGVhc3QgZXhwbGFpbmVk PwoKPiArCSAgICAgICBuZmMtPnJlZ3MgKyBORkNfUkVHX1NFQ1RPUl9OVU0pOwo+ICAJd3JpdGVs KGNodW5rc2l6ZSwgbmZjLT5yZWdzICsgTkZDX1JFR19DTlQpOwo+ICAKPiAtCWlmIChuZmMtPmNh cHMtPmhhc19tZG1hKSB7Cj4gKwlpZiAoc3VueGlfbmZjX3VzZXNfbWRtYShuZmMpKQo+ICAJCXdy aXRlbChyZWFkbChuZmMtPnJlZ3MgKyBORkNfUkVHX0NUTCkgJiB+TkZDX0RNQV9UWVBFX05PUk1B TCwKPiAgCQkgICAgICAgbmZjLT5yZWdzICsgTkZDX1JFR19DVEwpOwo+IC0JCXdyaXRlbChjaHVu a3NpemUgKiBuY2h1bmtzLCBuZmMtPnJlZ3MgKyBORkNfUkVHX01ETUFfQ05UKTsKPiAtCQl3cml0 ZWwoc2dfZG1hX2FkZHJlc3Moc2cpLCBuZmMtPnJlZ3MgKyBORkNfUkVHX01ETUFfQUREUik7Cj4g Kwo+ICsJaWYgKG5mYy0+bWRtYV9kZXNjKSB7Cj4gKwkJc3RydWN0IHN1bnhpX25mY19tZG1hX2Rl c2MgKmRlc2MgPSBuZmMtPm1kbWFfZGVzYzsKPiArCj4gKwkJZGVzYy0+Y29uZmlnID0gY3B1X3Rv X2xlMzIoTkZDX01ETUFfREVTQ19GSVJTVCB8Cj4gKwkJCQkJICAgTkZDX01ETUFfREVTQ19MQVNU KTsKPiArCQlkZXNjLT5zaXplID0gY3B1X3RvX2xlMzIobGVuKTsKPiArCQlkZXNjLT5idWYgPSBj cHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKGJ1Zl9kbWEpKTsKCkRvZXMgbG93ZXJfMzJfYml0cygp IG1lYW4gYW55dGhpbmcgaGVyZSBzaW5jZSB5b3UgYWxyZWFkeSBjaGVjayBmb3IgdGhlCnVwcGVy IGJpdHMgYmVmb3JlPyBUaGlzIGNoZWNrIG1heSBldmVuIGJlIHJlZHVuZGFudCBnaXZlbiB0aGUg ZmFjdCB0aGF0CnRoZSBhZGRyZXNzaW5nIGNhcGFiaWxpdHkgaGFzIGFscmVhZHkgYmVlbiBzZXQg dG8gMzIgYml0cywgc28gdGhlCmRtYV9tYXAqIGNhbGwgd291bGQgY2F0Y2ggdGhpcyBhbnl3YXku Cgo+ICsJCWRlc2MtPm5leHQgPSBjcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKG5mYy0+bWRtYV9k ZXNjX2RtYSkpOwoKRGl0dG8KClBsdXMsIHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBjb250cm9sbGVy IGlzIGxpdHRsZSBlbmRpYW4sIHNvIHdyaXRlbAphbHJlYWR5IGRvZXMgdGhlIGVuZGlhbm5lc3Mg Y29udmVyc2lvbiBpZiBuZWVkIGJlLiBjcHVfdG9fbGUzMigpIGhlcmUKc2VlbXMgaXJyZWxldmFu dC4KCj4gKwo+ICsJCXdyaXRlbChCSVQoMCksIG5mYy0+cmVncyArIE5GQ19SRUdfSDZfTURNQV9T VEEpOwoKQklUKDApIHNob3VsZCBiZSAjZGVmaW5lJ2QKCj4gKwkJZG1hX3dtYigpOwo+ICsJCXdy aXRlbChsb3dlcl8zMl9iaXRzKG5mYy0+bWRtYV9kZXNjX2RtYSksCj4gKwkJICAgICAgIG5mYy0+ cmVncyArIE5GQ19SRUdfSDZfTURNQV9ETEJBX1JFRyk7Cj4gKwl9IGVsc2UgaWYgKG5mYy0+Y2Fw cy0+aGFzX21kbWEpIHsKPiArCQl3cml0ZWwobGVuLCBuZmMtPnJlZ3MgKyBORkNfUkVHX01ETUFf Q05UKTsKPiArCQl3cml0ZWwoYnVmX2RtYSwgbmZjLT5yZWdzICsgTkZDX1JFR19NRE1BX0FERFIp Owo+ICAJfSBlbHNlIHsKPiAgCQlkbWF0ID0gZG1hZW5naW5lX3N1Ym1pdChkbWFkKTsKPiAgCj4g QEAgLTUyNSw2ICs1NzMsMTQgQEAgc3RhdGljIHZvaWQgc3VueGlfbmZjX2RtYV9vcF9jbGVhbnVw KHN0cnVjdCBzdW54aV9uZmMgKm5mYywKPiAgCSAgICAgICBuZmMtPnJlZ3MgKyBORkNfUkVHX0NU TCk7Cj4gIH0KPiAgCj4gK3N0YXRpYyB2b2lkIHN1bnhpX25mY19kbWFfb3BfYWJvcnQoc3RydWN0 IHN1bnhpX25mYyAqbmZjKQo+ICt7Cj4gKwlpZiAobmZjLT5tZG1hX2Rlc2MpCgpJIHdvdWxkIHBy ZWZlciB0byBzdGljayB0byB0aGUgc2FtZSBjb25kaXRpb24gYWxsIHRoZSB0aW1lIHdoZXRoZXIg d2UKYXJlIHVzaW5nIHBlcmlwaGVyYWwgZG1hIChNRE1BKSBvciBub3QuCgo+ICsJCXN1bnhpX25m Y19yc3QobmZjKTsKPiArCWVsc2UgaWYgKCFuZmMtPmNhcHMtPmhhc19tZG1hKQoKU2hvdWxkbid0 IHRoaXMgYmUgYSAiZWxzZSIgaGVyZT8KCj4gKwkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwobmZj LT5kbWFjKTsKPiArfQo+ICsKPiAgc3RhdGljIHZvaWQgc3VueGlfbmZjX3NlbGVjdF9jaGlwKHN0 cnVjdCBuYW5kX2NoaXAgKm5hbmQsIHVuc2lnbmVkIGludCBjcykKPiAgewo+ICAJc3RydWN0IG10 ZF9pbmZvICptdGQgPSBuYW5kX3RvX210ZChuYW5kKTsKPiBAQCAtMTIwMiw3ICsxMjU4LDcgQEAg c3RhdGljIGludCBzdW54aV9uZmNfaHdfZWNjX3JlYWRfY2h1bmtzX2RtYShzdHJ1Y3QgbmFuZF9j aGlwICpuYW5kLCB1aW50OF90ICpidWYKPiAgCj4gIAl3YWl0ID0gTkZDX0NNRF9JTlRfRkxBRzsK PiAgCj4gLQlpZiAobmZjLT5jYXBzLT5oYXNfbWRtYSkKPiArCWlmIChzdW54aV9uZmNfdXNlc19t ZG1hKG5mYykpCj4gIAkJd2FpdCB8PSBORkNfRE1BX0lOVF9GTEFHOwo+ICAJZWxzZQo+ICAJCWRt YV9hc3luY19pc3N1ZV9wZW5kaW5nKG5mYy0+ZG1hYyk7CgpUaGFua3MsCk1pcXXDqGwKCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eCBN VEQgZGlzY3Vzc2lvbiBtYWlsaW5nIGxpc3QKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1tdGQvCg==