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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C696AEB64DD for ; Tue, 1 Aug 2023 07:20:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229885AbjHAHU4 (ORCPT ); Tue, 1 Aug 2023 03:20:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40820 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229503AbjHAHUz (ORCPT ); Tue, 1 Aug 2023 03:20:55 -0400 Received: from relay9-d.mail.gandi.net (relay9-d.mail.gandi.net [IPv6:2001:4b98:dc4:8::229]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5546EDA for ; Tue, 1 Aug 2023 00:20:53 -0700 (PDT) Received: by mail.gandi.net (Postfix) with ESMTPSA id 0C0C4FF802; Tue, 1 Aug 2023 07:20:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1690874451; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=3qDPxUkBRSC6g6QGK/oFvOXYQ+Yax+tO5DnQhHJWMZ0=; b=dDjQ539jZysxC1eA+8Pos0njyYJu6mHKm6SDSX7bPM5zqrDPUQ341nD8ZgHSyQ8ZEMqK0Q 0/+EeZhyjGzDcPXevfoCr27NdsT6n6MO2brEQp1DKT1SjUAu3OFUwXrcLaU8B6+dkCyUBe QaCyXKzA7ELBbvyiLnonWKtlAyQOa6Im4LmziahqxPo1I5o9z4pVyzscQaXFyjkoCtXY/F nX1SCMQ3spl73yoCXpnTArlxvYDskIIQpxWyO7a4NmLuzJrQ54MyEbIx0u2UA9dkoejm0M GoSgBwVxhw5ZYhiNcE0zNX7UceLhuOIKL7NNADDhOZv7ie3OvtfvCjm7Nbm4oQ== Date: Tue, 1 Aug 2023 09:20:48 +0200 From: Miquel Raynal To: Lizhi Hou Cc: Brian Xu , Raj Kumar Rampelli , Vinod Koul , Michal Simek , Max Zhen , "Sonal Santan" , , , Thomas Petazzoni Subject: Re: [PATCH 4/4] dmaengine: xilinx: xdma: Support cyclic transfers Message-ID: <20230801092048.326d0ee1@xps-13> In-Reply-To: References: <20230731101442.792514-1-miquel.raynal@bootlin.com> <20230731101442.792514-5-miquel.raynal@bootlin.com> Organization: Bootlin X-Mailer: Claws Mail 4.0.0 (GTK+ 3.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-GND-Sasl: miquel.raynal@bootlin.com Precedence: bulk List-ID: X-Mailing-List: dmaengine@vger.kernel.org Hi Lizhi, > > + * xdma_prep_dma_cyclic - prepare for cyclic DMA transactions > > + * @chan: DMA channel pointer > > + * @address: Device DMA address to access > > + * @size: Total length to transfer > > + * @period_size: Period size to use for each transfer > > + * @dir: Transfer direction > > + * @flags: Transfer ack flags > > + */ > > +static struct dma_async_tx_descriptor * > > +xdma_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t address, > > + size_t size, size_t period_size, > > + enum dma_transfer_direction dir, > > + unsigned long flags) > > +{ > > + struct xdma_chan *xdma_chan =3D to_xdma_chan(chan); > > + struct xdma_device *xdev =3D xdma_chan->xdev_hdl; > > + unsigned int periods =3D size / period_size; =20 > What if size is not multiple of period_size? Can this really happen? I would have expected a bug if size was not a multiple of period_size, because the headers explicitly tell that we should expect an interrupt after each period and we should loop over when we reach the last one. This makes it very impractical to handle the situation you mention. > > + struct dma_async_tx_descriptor *tx_desc; > > + u64 addr, dev_addr, *src, *dst; > > + struct xdma_desc_block *dblk; > > + struct xdma_hw_desc *desc; > > + struct xdma_desc *sw_desc; > > + unsigned int i; > > + > > + /* > > + * Simplify the whole logic by preventing an abnormally high number of > > + * periods and periods size. > > + */ > > + if (period_size > XDMA_DESC_BLEN_MAX) { > > + xdma_err(xdev, "period size limited to %lu bytes\n", XDMA_DESC_BLEN_= MAX); > > + return NULL; > > + } > > + > > + if (periods > XDMA_DESC_ADJACENT) { > > + xdma_err(xdev, "number of periods limited to %u\n", XDMA_DESC_ADJACE= NT); > > + return NULL; > > + } > > + > > + sw_desc =3D xdma_alloc_desc(xdma_chan, periods, true); > > + if (!sw_desc) > > + return NULL; > > + > > + sw_desc->periods =3D periods; > > + sw_desc->period_size =3D period_size; > > + sw_desc->dir =3D dir; > > + > > + if (dir =3D=3D DMA_MEM_TO_DEV) { > > + dev_addr =3D xdma_chan->cfg.dst_addr; > > + src =3D &addr; > > + dst =3D &dev_addr; > > + } else { > > + dev_addr =3D xdma_chan->cfg.src_addr; > > + src =3D &dev_addr; > > + dst =3D &addr; > > + } > > + > > + dblk =3D sw_desc->desc_blocks; > > + desc =3D dblk->virt_addr; > > + for (i =3D 0; i < periods; i++) { > > + addr =3D address; > > + > > + /* fill hardware descriptor */ > > + desc->bytes =3D cpu_to_le32(period_size); > > + desc->src_addr =3D cpu_to_le64(*src); > > + desc->dst_addr =3D cpu_to_le64(*dst); > > + > > + desc++; > > + address +=3D period_size; > > + } > > + > > + tx_desc =3D vchan_tx_prep(&xdma_chan->vchan, &sw_desc->vdesc, flags); > > + if (!tx_desc) > > + goto failed; > > + > > + return tx_desc; > > + > > +failed: > > + xdma_free_desc(&sw_desc->vdesc); > > + > > + return NULL; > > +} > > + > > /** > > * xdma_device_config - Configure the DMA channel > > * @chan: DMA channel > > @@ -583,7 +698,36 @@ static int xdma_alloc_chan_resources(struct dma_ch= an *chan) > > static enum dma_status xdma_tx_status(struct dma_chan *chan, dma_cook= ie_t cookie, > > struct dma_tx_state *state) > > { > > - return dma_cookie_status(chan, cookie, state); > > + struct xdma_chan *xdma_chan =3D to_xdma_chan(chan); > > + struct virt_dma_desc *vd; > > + struct xdma_desc *desc; > > + enum dma_status ret; > > + unsigned long flags; > > + unsigned int period_idx; > > + u32 residue =3D 0; > > + > > + ret =3D dma_cookie_status(chan, cookie, state); > > + if (ret =3D=3D DMA_COMPLETE || !state) =20 > > probably do not need to check state. Or at least check before calling dma= _cookie_status. Good idea. > > + return ret; > > + > > + spin_lock_irqsave(&xdma_chan->vchan.lock, flags); > > + > > + vd =3D vchan_find_desc(&xdma_chan->vchan, cookie); > > + if (vd) > > + desc =3D to_xdma_desc(vd); > > + if (!desc || !desc->cyclic) { =20 > > desc is un-initialized if vd is NULL. Yes, handled in v2. > > + spin_unlock_irqrestore(&xdma_chan->vchan.lock, flags); > > + return ret; > > + } > > + > > + period_idx =3D desc->completed_desc_num % desc->periods; > > + residue =3D (desc->periods - period_idx) * desc->period_size; > > + > > + spin_unlock_irqrestore(&xdma_chan->vchan.lock, flags); > > + > > + dma_set_residue(state, residue); > > + > > + return ret; > > } =20 > > > /** =20 > > @@ -599,6 +743,7 @@ static irqreturn_t xdma_channel_isr(int irq, void *= dev_id) > > struct virt_dma_desc *vd; > > struct xdma_desc *desc; > > int ret; > > + u32 st; =20 > > > spin_lock(&xchan->vchan.lock); > > > @@ -617,6 +762,19 @@ static irqreturn_t xdma_channel_isr(int irq, v= oid *dev_id) =20 > > goto out; =20 > > > desc->completed_desc_num +=3D complete_desc_num; =20 > > + > > + if (desc->cyclic) { > > + ret =3D regmap_read(xdev->rmap, xchan->base + XDMA_CHAN_STATUS, > > + &st); > > + if (ret) > > + goto out; > > + > > + regmap_write(xdev->rmap, xchan->base + XDMA_CHAN_STATUS, st); =20 >=20 > What does reading/writing channel status register do here? It clears the status register to allow the next interrupt to trigger. 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 30A26EB64DD for ; Tue, 1 Aug 2023 07:21:32 +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: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=o1JnVNrYDv2xOrIG070qimvKdPkihzLAFp3yT7ElJl0=; b=Hx+BBN89l6MBCX H82PUbUlOPmV6L7UIM8LWVzR2qqzmPTd3m+aicG3BAVR9MC+RNyIpUFRw6xpSHVSaCwYnwUhrnfJe YWZjXsNN4lbMExcGTRIO1zZerrDoegJ/orjE4exO/xutgRsHdH7G3oubbeeJ02z86ujLKQ0ZUzm20 ddvUKXiQrwtLBDxpvt/67NYuLiduFDjZKxLNPo/t8uF55812+/O++qRJh48sDL6kGJqAIjZooSKu8 xS73Z9DiJP5CAxBemv701xuGHTxr+0zgkmmxV1zW2KYcxof7FMTSvp/wMMH4rmfpUWQoFLXM2Y4dh zYxmXAbB9fhzHYSw6YjQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qQjgj-000XpW-21; Tue, 01 Aug 2023 07:21:01 +0000 Received: from relay9-d.mail.gandi.net ([217.70.183.199]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qQjgg-000Xop-1O for linux-arm-kernel@lists.infradead.org; Tue, 01 Aug 2023 07:21:00 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id 0C0C4FF802; Tue, 1 Aug 2023 07:20:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1690874451; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=3qDPxUkBRSC6g6QGK/oFvOXYQ+Yax+tO5DnQhHJWMZ0=; b=dDjQ539jZysxC1eA+8Pos0njyYJu6mHKm6SDSX7bPM5zqrDPUQ341nD8ZgHSyQ8ZEMqK0Q 0/+EeZhyjGzDcPXevfoCr27NdsT6n6MO2brEQp1DKT1SjUAu3OFUwXrcLaU8B6+dkCyUBe QaCyXKzA7ELBbvyiLnonWKtlAyQOa6Im4LmziahqxPo1I5o9z4pVyzscQaXFyjkoCtXY/F nX1SCMQ3spl73yoCXpnTArlxvYDskIIQpxWyO7a4NmLuzJrQ54MyEbIx0u2UA9dkoejm0M GoSgBwVxhw5ZYhiNcE0zNX7UceLhuOIKL7NNADDhOZv7ie3OvtfvCjm7Nbm4oQ== Date: Tue, 1 Aug 2023 09:20:48 +0200 From: Miquel Raynal To: Lizhi Hou Cc: Brian Xu , Raj Kumar Rampelli , Vinod Koul , Michal Simek , Max Zhen , "Sonal Santan" , , , Thomas Petazzoni Subject: Re: [PATCH 4/4] dmaengine: xilinx: xdma: Support cyclic transfers Message-ID: <20230801092048.326d0ee1@xps-13> In-Reply-To: References: <20230731101442.792514-1-miquel.raynal@bootlin.com> <20230731101442.792514-5-miquel.raynal@bootlin.com> Organization: Bootlin X-Mailer: Claws Mail 4.0.0 (GTK+ 3.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-GND-Sasl: miquel.raynal@bootlin.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230801_002058_726527_3D10515A X-CRM114-Status: GOOD ( 23.86 ) 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: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgTGl6aGksCgo+ID4gKyAqIHhkbWFfcHJlcF9kbWFfY3ljbGljIC0gcHJlcGFyZSBmb3IgY3lj bGljIERNQSB0cmFuc2FjdGlvbnMKPiA+ICsgKiBAY2hhbjogRE1BIGNoYW5uZWwgcG9pbnRlcgo+ ID4gKyAqIEBhZGRyZXNzOiBEZXZpY2UgRE1BIGFkZHJlc3MgdG8gYWNjZXNzCj4gPiArICogQHNp emU6IFRvdGFsIGxlbmd0aCB0byB0cmFuc2Zlcgo+ID4gKyAqIEBwZXJpb2Rfc2l6ZTogUGVyaW9k IHNpemUgdG8gdXNlIGZvciBlYWNoIHRyYW5zZmVyCj4gPiArICogQGRpcjogVHJhbnNmZXIgZGly ZWN0aW9uCj4gPiArICogQGZsYWdzOiBUcmFuc2ZlciBhY2sgZmxhZ3MKPiA+ICsgKi8KPiA+ICtz dGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKPiA+ICt4ZG1hX3ByZXBfZG1h X2N5Y2xpYyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3QgYWRkcmVzcywKPiA+ICsJ CSAgICAgc2l6ZV90IHNpemUsIHNpemVfdCBwZXJpb2Rfc2l6ZSwKPiA+ICsJCSAgICAgZW51bSBk bWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpciwKPiA+ICsJCSAgICAgdW5zaWduZWQgbG9uZyBmbGFn cykKPiA+ICt7Cj4gPiArCXN0cnVjdCB4ZG1hX2NoYW4gKnhkbWFfY2hhbiA9IHRvX3hkbWFfY2hh bihjaGFuKTsKPiA+ICsJc3RydWN0IHhkbWFfZGV2aWNlICp4ZGV2ID0geGRtYV9jaGFuLT54ZGV2 X2hkbDsKPiA+ICsJdW5zaWduZWQgaW50IHBlcmlvZHMgPSBzaXplIC8gcGVyaW9kX3NpemU7ICAK Cj4gV2hhdCBpZiBzaXplIGlzIG5vdCBtdWx0aXBsZSBvZiBwZXJpb2Rfc2l6ZT8KCkNhbiB0aGlz IHJlYWxseSBoYXBwZW4/IEkgd291bGQgaGF2ZSBleHBlY3RlZCBhIGJ1ZyBpZiBzaXplIHdhcyBu b3QgYQptdWx0aXBsZSBvZiBwZXJpb2Rfc2l6ZSwgYmVjYXVzZSB0aGUgaGVhZGVycyBleHBsaWNp dGx5IHRlbGwgdGhhdCB3ZQpzaG91bGQgZXhwZWN0IGFuIGludGVycnVwdCBhZnRlciBlYWNoIHBl cmlvZCBhbmQgd2Ugc2hvdWxkIGxvb3Agb3Zlcgp3aGVuIHdlIHJlYWNoIHRoZSBsYXN0IG9uZS4g VGhpcyBtYWtlcyBpdCB2ZXJ5IGltcHJhY3RpY2FsIHRvIGhhbmRsZQp0aGUgc2l0dWF0aW9uIHlv dSBtZW50aW9uLgoKPiA+ICsJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eF9kZXNj Owo+ID4gKwl1NjQgYWRkciwgZGV2X2FkZHIsICpzcmMsICpkc3Q7Cj4gPiArCXN0cnVjdCB4ZG1h X2Rlc2NfYmxvY2sgKmRibGs7Cj4gPiArCXN0cnVjdCB4ZG1hX2h3X2Rlc2MgKmRlc2M7Cj4gPiAr CXN0cnVjdCB4ZG1hX2Rlc2MgKnN3X2Rlc2M7Cj4gPiArCXVuc2lnbmVkIGludCBpOwo+ID4gKwo+ ID4gKwkvKgo+ID4gKwkgKiBTaW1wbGlmeSB0aGUgd2hvbGUgbG9naWMgYnkgcHJldmVudGluZyBh biBhYm5vcm1hbGx5IGhpZ2ggbnVtYmVyIG9mCj4gPiArCSAqIHBlcmlvZHMgYW5kIHBlcmlvZHMg c2l6ZS4KPiA+ICsJICovCj4gPiArCWlmIChwZXJpb2Rfc2l6ZSA+IFhETUFfREVTQ19CTEVOX01B WCkgewo+ID4gKwkJeGRtYV9lcnIoeGRldiwgInBlcmlvZCBzaXplIGxpbWl0ZWQgdG8gJWx1IGJ5 dGVzXG4iLCBYRE1BX0RFU0NfQkxFTl9NQVgpOwo+ID4gKwkJcmV0dXJuIE5VTEw7Cj4gPiArCX0K PiA+ICsKPiA+ICsJaWYgKHBlcmlvZHMgPiBYRE1BX0RFU0NfQURKQUNFTlQpIHsKPiA+ICsJCXhk bWFfZXJyKHhkZXYsICJudW1iZXIgb2YgcGVyaW9kcyBsaW1pdGVkIHRvICV1XG4iLCBYRE1BX0RF U0NfQURKQUNFTlQpOwo+ID4gKwkJcmV0dXJuIE5VTEw7Cj4gPiArCX0KPiA+ICsKPiA+ICsJc3df ZGVzYyA9IHhkbWFfYWxsb2NfZGVzYyh4ZG1hX2NoYW4sIHBlcmlvZHMsIHRydWUpOwo+ID4gKwlp ZiAoIXN3X2Rlc2MpCj4gPiArCQlyZXR1cm4gTlVMTDsKPiA+ICsKPiA+ICsJc3dfZGVzYy0+cGVy aW9kcyA9IHBlcmlvZHM7Cj4gPiArCXN3X2Rlc2MtPnBlcmlvZF9zaXplID0gcGVyaW9kX3NpemU7 Cj4gPiArCXN3X2Rlc2MtPmRpciA9IGRpcjsKPiA+ICsKPiA+ICsJaWYgKGRpciA9PSBETUFfTUVN X1RPX0RFVikgewo+ID4gKwkJZGV2X2FkZHIgPSB4ZG1hX2NoYW4tPmNmZy5kc3RfYWRkcjsKPiA+ ICsJCXNyYyA9ICZhZGRyOwo+ID4gKwkJZHN0ID0gJmRldl9hZGRyOwo+ID4gKwl9IGVsc2Ugewo+ ID4gKwkJZGV2X2FkZHIgPSB4ZG1hX2NoYW4tPmNmZy5zcmNfYWRkcjsKPiA+ICsJCXNyYyA9ICZk ZXZfYWRkcjsKPiA+ICsJCWRzdCA9ICZhZGRyOwo+ID4gKwl9Cj4gPiArCj4gPiArCWRibGsgPSBz d19kZXNjLT5kZXNjX2Jsb2NrczsKPiA+ICsJZGVzYyA9IGRibGstPnZpcnRfYWRkcjsKPiA+ICsJ Zm9yIChpID0gMDsgaSA8IHBlcmlvZHM7IGkrKykgewo+ID4gKwkJYWRkciA9IGFkZHJlc3M7Cj4g PiArCj4gPiArCQkvKiBmaWxsIGhhcmR3YXJlIGRlc2NyaXB0b3IgKi8KPiA+ICsJCWRlc2MtPmJ5 dGVzID0gY3B1X3RvX2xlMzIocGVyaW9kX3NpemUpOwo+ID4gKwkJZGVzYy0+c3JjX2FkZHIgPSBj cHVfdG9fbGU2NCgqc3JjKTsKPiA+ICsJCWRlc2MtPmRzdF9hZGRyID0gY3B1X3RvX2xlNjQoKmRz dCk7Cj4gPiArCj4gPiArCQlkZXNjKys7Cj4gPiArCQlhZGRyZXNzICs9IHBlcmlvZF9zaXplOwo+ ID4gKwl9Cj4gPiArCj4gPiArCXR4X2Rlc2MgPSB2Y2hhbl90eF9wcmVwKCZ4ZG1hX2NoYW4tPnZj aGFuLCAmc3dfZGVzYy0+dmRlc2MsIGZsYWdzKTsKPiA+ICsJaWYgKCF0eF9kZXNjKQo+ID4gKwkJ Z290byBmYWlsZWQ7Cj4gPiArCj4gPiArCXJldHVybiB0eF9kZXNjOwo+ID4gKwo+ID4gK2ZhaWxl ZDoKPiA+ICsJeGRtYV9mcmVlX2Rlc2MoJnN3X2Rlc2MtPnZkZXNjKTsKPiA+ICsKPiA+ICsJcmV0 dXJuIE5VTEw7Cj4gPiArfQo+ID4gKwo+ID4gICAvKioKPiA+ICAgICogeGRtYV9kZXZpY2VfY29u ZmlnIC0gQ29uZmlndXJlIHRoZSBETUEgY2hhbm5lbAo+ID4gICAgKiBAY2hhbjogRE1BIGNoYW5u ZWwKPiA+IEBAIC01ODMsNyArNjk4LDM2IEBAIHN0YXRpYyBpbnQgeGRtYV9hbGxvY19jaGFuX3Jl c291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCj4gPiAgIHN0YXRpYyBlbnVtIGRtYV9zdGF0 dXMgeGRtYV90eF9zdGF0dXMoc3RydWN0IGRtYV9jaGFuICpjaGFuLCBkbWFfY29va2llX3QgY29v a2llLAo+ID4gICAJCQkJICAgICAgc3RydWN0IGRtYV90eF9zdGF0ZSAqc3RhdGUpCj4gPiAgIHsK PiA+IC0JcmV0dXJuIGRtYV9jb29raWVfc3RhdHVzKGNoYW4sIGNvb2tpZSwgc3RhdGUpOwo+ID4g KwlzdHJ1Y3QgeGRtYV9jaGFuICp4ZG1hX2NoYW4gPSB0b194ZG1hX2NoYW4oY2hhbik7Cj4gPiAr CXN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZDsKPiA+ICsJc3RydWN0IHhkbWFfZGVzYyAqZGVzYzsK PiA+ICsJZW51bSBkbWFfc3RhdHVzIHJldDsKPiA+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiA+ ICsJdW5zaWduZWQgaW50IHBlcmlvZF9pZHg7Cj4gPiArCXUzMiByZXNpZHVlID0gMDsKPiA+ICsK PiA+ICsJcmV0ID0gZG1hX2Nvb2tpZV9zdGF0dXMoY2hhbiwgY29va2llLCBzdGF0ZSk7Cj4gPiAr CWlmIChyZXQgPT0gRE1BX0NPTVBMRVRFIHx8ICFzdGF0ZSkgIAo+Cj4gcHJvYmFibHkgZG8gbm90 IG5lZWQgdG8gY2hlY2sgc3RhdGUuIE9yIGF0IGxlYXN0IGNoZWNrIGJlZm9yZSBjYWxsaW5nIGRt YV9jb29raWVfc3RhdHVzLgoKR29vZCBpZGVhLgoKPiA+ICsJCXJldHVybiByZXQ7Cj4gPiArCj4g PiArCXNwaW5fbG9ja19pcnFzYXZlKCZ4ZG1hX2NoYW4tPnZjaGFuLmxvY2ssIGZsYWdzKTsKPiA+ ICsKPiA+ICsJdmQgPSB2Y2hhbl9maW5kX2Rlc2MoJnhkbWFfY2hhbi0+dmNoYW4sIGNvb2tpZSk7 Cj4gPiArCWlmICh2ZCkKPiA+ICsJCWRlc2MgPSB0b194ZG1hX2Rlc2ModmQpOwo+ID4gKwlpZiAo IWRlc2MgfHwgIWRlc2MtPmN5Y2xpYykgeyAgCj4KPiBkZXNjIGlzIHVuLWluaXRpYWxpemVkIGlm IHZkIGlzIE5VTEwuCgpZZXMsIGhhbmRsZWQgaW4gdjIuCgo+ID4gKwkJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmeGRtYV9jaGFuLT52Y2hhbi5sb2NrLCBmbGFncyk7Cj4gPiArCQlyZXR1cm4gcmV0 Owo+ID4gKwl9Cj4gPiArCj4gPiArCXBlcmlvZF9pZHggPSBkZXNjLT5jb21wbGV0ZWRfZGVzY19u dW0gJSBkZXNjLT5wZXJpb2RzOwo+ID4gKwlyZXNpZHVlID0gKGRlc2MtPnBlcmlvZHMgLSBwZXJp b2RfaWR4KSAqIGRlc2MtPnBlcmlvZF9zaXplOwo+ID4gKwo+ID4gKwlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZ4ZG1hX2NoYW4tPnZjaGFuLmxvY2ssIGZsYWdzKTsKPiA+ICsKPiA+ICsJZG1hX3Nl dF9yZXNpZHVlKHN0YXRlLCByZXNpZHVlKTsKPiA+ICsKPiA+ICsJcmV0dXJuIHJldDsKPiA+ICAg fSAgCj4gPiAgID4gICAvKiogIAo+ID4gQEAgLTU5OSw2ICs3NDMsNyBAQCBzdGF0aWMgaXJxcmV0 dXJuX3QgeGRtYV9jaGFubmVsX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCj4gPiAgIAlzdHJ1 Y3QgdmlydF9kbWFfZGVzYyAqdmQ7Cj4gPiAgIAlzdHJ1Y3QgeGRtYV9kZXNjICpkZXNjOwo+ID4g ICAJaW50IHJldDsKPiA+ICsJdTMyIHN0OyAgCj4gPiAgID4gICAJc3Bpbl9sb2NrKCZ4Y2hhbi0+ dmNoYW4ubG9jayk7Cj4gPiAgID4gQEAgLTYxNyw2ICs3NjIsMTkgQEAgc3RhdGljIGlycXJldHVy bl90IHhkbWFfY2hhbm5lbF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKSAgCj4gPiAgIAkJZ290 byBvdXQ7ICAKPiA+ICAgPiAgIAlkZXNjLT5jb21wbGV0ZWRfZGVzY19udW0gKz0gY29tcGxldGVf ZGVzY19udW07ICAKPiA+ICsKPiA+ICsJaWYgKGRlc2MtPmN5Y2xpYykgewo+ID4gKwkJcmV0ID0g cmVnbWFwX3JlYWQoeGRldi0+cm1hcCwgeGNoYW4tPmJhc2UgKyBYRE1BX0NIQU5fU1RBVFVTLAo+ ID4gKwkJCQkgICZzdCk7Cj4gPiArCQlpZiAocmV0KQo+ID4gKwkJCWdvdG8gb3V0Owo+ID4gKwo+ ID4gKwkJcmVnbWFwX3dyaXRlKHhkZXYtPnJtYXAsIHhjaGFuLT5iYXNlICsgWERNQV9DSEFOX1NU QVRVUywgc3QpOyAgCj4gCj4gV2hhdCBkb2VzIHJlYWRpbmcvd3JpdGluZyBjaGFubmVsIHN0YXR1 cyByZWdpc3RlciBkbyBoZXJlPwoKSXQgY2xlYXJzIHRoZSBzdGF0dXMgcmVnaXN0ZXIgdG8gYWxs b3cgdGhlIG5leHQgaW50ZXJydXB0IHRvIHRyaWdnZXIuCgpUaGFua3MsCk1pcXXDqGwKCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJu ZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRw Oi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK