From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v5,4/7] dmaengine: xilinx_dma: program hardware supported buffer length From: Andrea Merello Message-Id: <20180907062502.8241-4-andrea.merello@gmail.com> Date: Fri, 7 Sep 2018 08:24:59 +0200 To: vkoul@kernel.org, dan.j.williams@intel.com, michal.simek@xilinx.com, appana.durga.rao@xilinx.com, dmaengine@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, robh+dt@kernel.org, mark.rutland@arm.com, devicetree@vger.kernel.org, radhey.shyam.pandey@xilinx.com, Andrea Merello List-ID: RnJvbTogUmFkaGV5IFNoeWFtIFBhbmRleSA8cmFkaGV5LnNoeWFtLnBhbmRleUB4aWxpbnguY29t PgoKQVhJLURNQSBJUCBzdXBwb3J0cyBjb25maWd1cmFibGUgKGNfc2dfbGVuZ3RoX3dpZHRoKSBi dWZmZXIgbGVuZ3RoCnJlZ2lzdGVyIHdpZHRoLCBoZW5jZSByZWFkIGJ1ZmZlciBsZW5ndGggKHhs bngsc2ctbGVuZ3RoLXdpZHRoKSBEVApwcm9wZXJ0eSBhbmQgZW5zdXJlIHRoYXQgZHJpdmVyIGRv ZXNuJ3QgcHJvZ3JhbSBidWZmZXIgbGVuZ3RoCmV4Y2VlZGluZyB0aGUgc3VwcG9ydGVkIGxpbWl0 LiBGb3IgVkRNQSBhbmQgQ0RNQSB0aGVyZSBpcyBubyBjaGFuZ2UuCgpDYzogUm9iIEhlcnJpbmcg PHJvYmgrZHRAa2VybmVsLm9yZz4KQ2M6IE1hcmsgUnV0bGFuZCA8bWFyay5ydXRsYW5kQGFybS5j b20+CkNjOiBkZXZpY2V0cmVlQHZnZXIua2VybmVsLm9yZwpTaWduZWQtb2ZmLWJ5OiBSYWRoZXkg U2h5YW0gUGFuZGV5IDxyYWRoZXkuc2h5YW0ucGFuZGV5QHhpbGlueC5jb20+ClNpZ25lZC1vZmYt Ynk6IE1pY2hhbCBTaW1layA8bWljaGFsLnNpbWVrQHhpbGlueC5jb20+ClNpZ25lZC1vZmYtYnk6 IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWEubWVyZWxsb0BnbWFpbC5jb20+IFtyZWJhc2UsIHJld29y ZF0KLS0tCkNoYW5nZXMgaW4gdjI6CiAgICAgICAgLSBkcm9wIG9yaWdpbmFsIHBhdGNoIGFuZCBy ZXBsYWNlIHdpdGggdGhlIG9uZSBpbiBYaWxpbnggdHJlZQpDaGFuZ2VzIGluIHYzOgoJLSBjYyBE VCBtYWludGFpbmVycy9NTApDaGFuZ2VzIGluIHY0OgoJLSB1cHBlciBib3VuZCBmb3IgdGhlIHBy b3BlcnR5IHNob3VsZCBiZSAyNiwgbm90IDIzCgktIGFkZCB3YXJuIGZvciB3aWR0aCA+IDIzIGFz IHBlciB4aWxpbnggb3JpZ2luYWwgcGF0Y2gKCS0gcmV3b3JrIGR1ZSB0byBjaGFuZ2VzIGludHJv ZHVjZWQgaW4gMS82CkNoYW5nZXMgaW4gdjU6CglOb25lCi0tLQogZHJpdmVycy9kbWEveGlsaW54 L3hpbGlueF9kbWEuYyB8IDM2ICsrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLQogMSBm aWxlIGNoYW5nZWQsIDI4IGluc2VydGlvbnMoKyksIDggZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0 IGEvZHJpdmVycy9kbWEveGlsaW54L3hpbGlueF9kbWEuYyBiL2RyaXZlcnMvZG1hL3hpbGlueC94 aWxpbnhfZG1hLmMKaW5kZXggYWFhNmRlOGE3MGU0Li5iMTdmMjRlNGVjMzUgMTAwNjQ0Ci0tLSBh L2RyaXZlcnMvZG1hL3hpbGlueC94aWxpbnhfZG1hLmMKKysrIGIvZHJpdmVycy9kbWEveGlsaW54 L3hpbGlueF9kbWEuYwpAQCAtMTU4LDcgKzE1OCw5IEBACiAjZGVmaW5lIFhJTElOWF9ETUFfUkVH X0JUVAkJMHgyOAogCiAvKiBBWEkgRE1BIFNwZWNpZmljIE1hc2tzL0JpdCBmaWVsZHMgKi8KLSNk ZWZpbmUgWElMSU5YX0RNQV9NQVhfVFJBTlNfTEVOCUdFTk1BU0soMjIsIDApCisjZGVmaW5lIFhJ TElOWF9ETUFfTUFYX1RSQU5TX0xFTl9NSU4JOAorI2RlZmluZSBYSUxJTlhfRE1BX01BWF9UUkFO U19MRU5fTUFYCTIzCisjZGVmaW5lIFhJTElOWF9ETUFfVjJfTUFYX1RSQU5TX0xFTl9NQVgJMjYK ICNkZWZpbmUgWElMSU5YX0RNQV9DUl9DT0FMRVNDRV9NQVgJR0VOTUFTSygyMywgMTYpCiAjZGVm aW5lIFhJTElOWF9ETUFfQ1JfQ1lDTElDX0JEX0VOX01BU0sJQklUKDQpCiAjZGVmaW5lIFhJTElO WF9ETUFfQ1JfQ09BTEVTQ0VfU0hJRlQJMTYKQEAgLTQxOCw2ICs0MjAsNyBAQCBzdHJ1Y3QgeGls aW54X2RtYV9jb25maWcgewogICogQHJ4c19jbGs6IERNQSBzMm1tIHN0cmVhbSBjbG9jawogICog QG5yX2NoYW5uZWxzOiBOdW1iZXIgb2YgY2hhbm5lbHMgRE1BIGRldmljZSBzdXBwb3J0cwogICog QGNoYW5faWQ6IERNQSBjaGFubmVsIGlkZW50aWZpZXIKKyAqIEBtYXhfYnVmZmVyX2xlbjogTWF4 IGJ1ZmZlciBsZW5ndGgKICAqLwogc3RydWN0IHhpbGlueF9kbWFfZGV2aWNlIHsKIAl2b2lkIF9f aW9tZW0gKnJlZ3M7CkBAIC00MzcsNiArNDQwLDcgQEAgc3RydWN0IHhpbGlueF9kbWFfZGV2aWNl IHsKIAlzdHJ1Y3QgY2xrICpyeHNfY2xrOwogCXUzMiBucl9jaGFubmVsczsKIAl1MzIgY2hhbl9p ZDsKKwl1MzIgbWF4X2J1ZmZlcl9sZW47CiB9OwogCiAvKiBNYWNyb3MgKi8KQEAgLTk2NCw3ICs5 NjgsNyBAQCBzdGF0aWMgaW50IHhpbGlueF9kbWFfY2FsY19jb3B5c2l6ZShzdHJ1Y3QgeGlsaW54 X2RtYV9jaGFuICpjaGFuLAogCQkJCSAgICBpbnQgc2l6ZSwgaW50IGRvbmUpCiB7CiAJc2l6ZV90 IGNvcHkgPSBtaW5fdChzaXplX3QsIHNpemUgLSBkb25lLAotCQkgICAgIFhJTElOWF9ETUFfTUFY X1RSQU5TX0xFTik7CisJCQkgICAgY2hhbi0+eGRldi0+bWF4X2J1ZmZlcl9sZW4pOwogCiAJaWYg KChjb3B5ICsgZG9uZSA8IHNpemUpICYmCiAJICAgIGNoYW4tPnhkZXYtPmNvbW1vbi5jb3B5X2Fs aWduKSB7CkBAIC0xMDExLDcgKzEwMTUsNyBAQCBzdGF0aWMgZW51bSBkbWFfc3RhdHVzIHhpbGlu eF9kbWFfdHhfc3RhdHVzKHN0cnVjdCBkbWFfY2hhbiAqZGNoYW4sCiAJCQlsaXN0X2Zvcl9lYWNo X2VudHJ5KHNlZ21lbnQsICZkZXNjLT5zZWdtZW50cywgbm9kZSkgewogCQkJCWh3ID0gJnNlZ21l bnQtPmh3OwogCQkJCXJlc2lkdWUgKz0gKGh3LT5jb250cm9sIC0gaHctPnN0YXR1cykgJgotCQkJ CQkgICBYSUxJTlhfRE1BX01BWF9UUkFOU19MRU47CisJCQkJCSAgIGNoYW4tPnhkZXYtPm1heF9i dWZmZXJfbGVuOwogCQkJfQogCQl9CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmxv Y2ssIGZsYWdzKTsKQEAgLTEyNjMsNyArMTI2Nyw3IEBAIHN0YXRpYyB2b2lkIHhpbGlueF9jZG1h X3N0YXJ0X3RyYW5zZmVyKHN0cnVjdCB4aWxpbnhfZG1hX2NoYW4gKmNoYW4pCiAKIAkJLyogU3Rh cnQgdGhlIHRyYW5zZmVyICovCiAJCWRtYV9jdHJsX3dyaXRlKGNoYW4sIFhJTElOWF9ETUFfUkVH X0JUVCwKLQkJCQlody0+Y29udHJvbCAmIFhJTElOWF9ETUFfTUFYX1RSQU5TX0xFTik7CisJCQkJ aHctPmNvbnRyb2wgJiBjaGFuLT54ZGV2LT5tYXhfYnVmZmVyX2xlbik7CiAJfQogCiAJbGlzdF9z cGxpY2VfdGFpbF9pbml0KCZjaGFuLT5wZW5kaW5nX2xpc3QsICZjaGFuLT5hY3RpdmVfbGlzdCk7 CkBAIC0xMzY2LDcgKzEzNzAsNyBAQCBzdGF0aWMgdm9pZCB4aWxpbnhfZG1hX3N0YXJ0X3RyYW5z ZmVyKHN0cnVjdCB4aWxpbnhfZG1hX2NoYW4gKmNoYW4pCiAKIAkJLyogU3RhcnQgdGhlIHRyYW5z ZmVyICovCiAJCWRtYV9jdHJsX3dyaXRlKGNoYW4sIFhJTElOWF9ETUFfUkVHX0JUVCwKLQkJCSAg ICAgICBody0+Y29udHJvbCAmIFhJTElOWF9ETUFfTUFYX1RSQU5TX0xFTik7CisJCQkgICAgICAg aHctPmNvbnRyb2wgJiBjaGFuLT54ZGV2LT5tYXhfYnVmZmVyX2xlbik7CiAJfQogCiAJbGlzdF9z cGxpY2VfdGFpbF9pbml0KCZjaGFuLT5wZW5kaW5nX2xpc3QsICZjaGFuLT5hY3RpdmVfbGlzdCk7 CkBAIC0xNzI3LDcgKzE3MzEsNyBAQCB4aWxpbnhfY2RtYV9wcmVwX21lbWNweShzdHJ1Y3QgZG1h X2NoYW4gKmRjaGFuLCBkbWFfYWRkcl90IGRtYV9kc3QsCiAJc3RydWN0IHhpbGlueF9jZG1hX3R4 X3NlZ21lbnQgKnNlZ21lbnQ7CiAJc3RydWN0IHhpbGlueF9jZG1hX2Rlc2NfaHcgKmh3OwogCi0J aWYgKCFsZW4gfHwgbGVuID4gWElMSU5YX0RNQV9NQVhfVFJBTlNfTEVOKQorCWlmICghbGVuIHx8 IGxlbiA+IGNoYW4tPnhkZXYtPm1heF9idWZmZXJfbGVuKQogCQlyZXR1cm4gTlVMTDsKIAogCWRl c2MgPSB4aWxpbnhfZG1hX2FsbG9jX3R4X2Rlc2NyaXB0b3IoY2hhbik7CkBAIC0yNTk2LDcgKzI2 MDAsNyBAQCBzdGF0aWMgaW50IHhpbGlueF9kbWFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldikKIAlzdHJ1Y3QgeGlsaW54X2RtYV9kZXZpY2UgKnhkZXY7CiAJc3RydWN0IGRldmlj ZV9ub2RlICpjaGlsZCwgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IHJlc291cmNl ICppbzsKLQl1MzIgbnVtX2ZyYW1lcywgYWRkcl93aWR0aDsKKwl1MzIgbnVtX2ZyYW1lcywgYWRk cl93aWR0aCwgbGVuX3dpZHRoOwogCWludCBpLCBlcnI7CiAKIAkvKiBBbGxvY2F0ZSBhbmQgaW5p dGlhbGl6ZSB0aGUgRE1BIGVuZ2luZSBzdHJ1Y3R1cmUgKi8KQEAgLTI2MjgsOCArMjYzMiwyNCBA QCBzdGF0aWMgaW50IHhpbGlueF9kbWFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRl dikKIAogCS8qIFJldHJpZXZlIHRoZSBETUEgZW5naW5lIHByb3BlcnRpZXMgZnJvbSB0aGUgZGV2 aWNlIHRyZWUgKi8KIAl4ZGV2LT5oYXNfc2cgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobm9kZSwg InhsbngsaW5jbHVkZS1zZyIpOwotCWlmICh4ZGV2LT5kbWFfY29uZmlnLT5kbWF0eXBlID09IFhE TUFfVFlQRV9BWElETUEpCisJeGRldi0+bWF4X2J1ZmZlcl9sZW4gPSBHRU5NQVNLKFhJTElOWF9E TUFfTUFYX1RSQU5TX0xFTl9NQVggLSAxLCAwKTsKKworCWlmICh4ZGV2LT5kbWFfY29uZmlnLT5k bWF0eXBlID09IFhETUFfVFlQRV9BWElETUEpIHsKIAkJeGRldi0+bWNkbWEgPSBvZl9wcm9wZXJ0 eV9yZWFkX2Jvb2wobm9kZSwgInhsbngsbWNkbWEiKTsKKwkJaWYgKCFvZl9wcm9wZXJ0eV9yZWFk X3UzMihub2RlLCAieGxueCxzZy1sZW5ndGgtd2lkdGgiLAorCQkJCQkgICZsZW5fd2lkdGgpKSB7 CisJCQlpZiAobGVuX3dpZHRoIDwgWElMSU5YX0RNQV9NQVhfVFJBTlNfTEVOX01JTiB8fAorCQkJ ICAgIGxlbl93aWR0aCA+IFhJTElOWF9ETUFfVjJfTUFYX1RSQU5TX0xFTl9NQVgpIHsKKwkJCQlk ZXZfd2Fybih4ZGV2LT5kZXYsCisJCQkJCSAiaW52YWxpZCB4bG54LHNnLWxlbmd0aC13aWR0aCBw cm9wZXJ0eSB2YWx1ZS4gVXNpbmcgZGVmYXVsdCB3aWR0aFxuIik7CisJCQl9IGVsc2UgeworCQkJ CWlmIChsZW5fd2lkdGggPiBYSUxJTlhfRE1BX01BWF9UUkFOU19MRU5fTUFYKQorCQkJCQlkZXZf d2Fybih4ZGV2LT5kZXYsICJQbGVhc2UgZW5zdXJlIHRoYXQgSVAgc3VwcG9ydHMgYnVmZmVyIGxl bmd0aCA+IDIzIGJpdHNcbiIpOworCQkJCXhkZXYtPm1heF9idWZmZXJfbGVuID0KKwkJCQkJR0VO TUFTSyhsZW5fd2lkdGggLSAxLCAwKTsKKwkJCX0KKwkJfQorCX0KIAogCWlmICh4ZGV2LT5kbWFf Y29uZmlnLT5kbWF0eXBlID09IFhETUFfVFlQRV9WRE1BKSB7CiAJCWVyciA9IG9mX3Byb3BlcnR5 X3JlYWRfdTMyKG5vZGUsICJ4bG54LG51bS1mc3RvcmVzIiwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: andrea.merello@gmail.com (Andrea Merello) Date: Fri, 7 Sep 2018 08:24:59 +0200 Subject: [PATCH v5 4/7] dmaengine: xilinx_dma: program hardware supported buffer length In-Reply-To: <20180907062502.8241-1-andrea.merello@gmail.com> References: <20180907062502.8241-1-andrea.merello@gmail.com> Message-ID: <20180907062502.8241-4-andrea.merello@gmail.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org From: Radhey Shyam Pandey AXI-DMA IP supports configurable (c_sg_length_width) buffer length register width, hence read buffer length (xlnx,sg-length-width) DT property and ensure that driver doesn't program buffer length exceeding the supported limit. For VDMA and CDMA there is no change. Cc: Rob Herring Cc: Mark Rutland Cc: devicetree at vger.kernel.org Signed-off-by: Radhey Shyam Pandey Signed-off-by: Michal Simek Signed-off-by: Andrea Merello [rebase, reword] --- Changes in v2: - drop original patch and replace with the one in Xilinx tree Changes in v3: - cc DT maintainers/ML Changes in v4: - upper bound for the property should be 26, not 23 - add warn for width > 23 as per xilinx original patch - rework due to changes introduced in 1/6 Changes in v5: None --- drivers/dma/xilinx/xilinx_dma.c | 36 +++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dma.c index aaa6de8a70e4..b17f24e4ec35 100644 --- a/drivers/dma/xilinx/xilinx_dma.c +++ b/drivers/dma/xilinx/xilinx_dma.c @@ -158,7 +158,9 @@ #define XILINX_DMA_REG_BTT 0x28 /* AXI DMA Specific Masks/Bit fields */ -#define XILINX_DMA_MAX_TRANS_LEN GENMASK(22, 0) +#define XILINX_DMA_MAX_TRANS_LEN_MIN 8 +#define XILINX_DMA_MAX_TRANS_LEN_MAX 23 +#define XILINX_DMA_V2_MAX_TRANS_LEN_MAX 26 #define XILINX_DMA_CR_COALESCE_MAX GENMASK(23, 16) #define XILINX_DMA_CR_CYCLIC_BD_EN_MASK BIT(4) #define XILINX_DMA_CR_COALESCE_SHIFT 16 @@ -418,6 +420,7 @@ struct xilinx_dma_config { * @rxs_clk: DMA s2mm stream clock * @nr_channels: Number of channels DMA device supports * @chan_id: DMA channel identifier + * @max_buffer_len: Max buffer length */ struct xilinx_dma_device { void __iomem *regs; @@ -437,6 +440,7 @@ struct xilinx_dma_device { struct clk *rxs_clk; u32 nr_channels; u32 chan_id; + u32 max_buffer_len; }; /* Macros */ @@ -964,7 +968,7 @@ static int xilinx_dma_calc_copysize(struct xilinx_dma_chan *chan, int size, int done) { size_t copy = min_t(size_t, size - done, - XILINX_DMA_MAX_TRANS_LEN); + chan->xdev->max_buffer_len); if ((copy + done < size) && chan->xdev->common.copy_align) { @@ -1011,7 +1015,7 @@ static enum dma_status xilinx_dma_tx_status(struct dma_chan *dchan, list_for_each_entry(segment, &desc->segments, node) { hw = &segment->hw; residue += (hw->control - hw->status) & - XILINX_DMA_MAX_TRANS_LEN; + chan->xdev->max_buffer_len; } } spin_unlock_irqrestore(&chan->lock, flags); @@ -1263,7 +1267,7 @@ static void xilinx_cdma_start_transfer(struct xilinx_dma_chan *chan) /* Start the transfer */ dma_ctrl_write(chan, XILINX_DMA_REG_BTT, - hw->control & XILINX_DMA_MAX_TRANS_LEN); + hw->control & chan->xdev->max_buffer_len); } list_splice_tail_init(&chan->pending_list, &chan->active_list); @@ -1366,7 +1370,7 @@ static void xilinx_dma_start_transfer(struct xilinx_dma_chan *chan) /* Start the transfer */ dma_ctrl_write(chan, XILINX_DMA_REG_BTT, - hw->control & XILINX_DMA_MAX_TRANS_LEN); + hw->control & chan->xdev->max_buffer_len); } list_splice_tail_init(&chan->pending_list, &chan->active_list); @@ -1727,7 +1731,7 @@ xilinx_cdma_prep_memcpy(struct dma_chan *dchan, dma_addr_t dma_dst, struct xilinx_cdma_tx_segment *segment; struct xilinx_cdma_desc_hw *hw; - if (!len || len > XILINX_DMA_MAX_TRANS_LEN) + if (!len || len > chan->xdev->max_buffer_len) return NULL; desc = xilinx_dma_alloc_tx_descriptor(chan); @@ -2596,7 +2600,7 @@ static int xilinx_dma_probe(struct platform_device *pdev) struct xilinx_dma_device *xdev; struct device_node *child, *np = pdev->dev.of_node; struct resource *io; - u32 num_frames, addr_width; + u32 num_frames, addr_width, len_width; int i, err; /* Allocate and initialize the DMA engine structure */ @@ -2628,8 +2632,24 @@ static int xilinx_dma_probe(struct platform_device *pdev) /* Retrieve the DMA engine properties from the device tree */ xdev->has_sg = of_property_read_bool(node, "xlnx,include-sg"); - if (xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA) + xdev->max_buffer_len = GENMASK(XILINX_DMA_MAX_TRANS_LEN_MAX - 1, 0); + + if (xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA) { xdev->mcdma = of_property_read_bool(node, "xlnx,mcdma"); + if (!of_property_read_u32(node, "xlnx,sg-length-width", + &len_width)) { + if (len_width < XILINX_DMA_MAX_TRANS_LEN_MIN || + len_width > XILINX_DMA_V2_MAX_TRANS_LEN_MAX) { + dev_warn(xdev->dev, + "invalid xlnx,sg-length-width property value. Using default width\n"); + } else { + if (len_width > XILINX_DMA_MAX_TRANS_LEN_MAX) + dev_warn(xdev->dev, "Please ensure that IP supports buffer length > 23 bits\n"); + xdev->max_buffer_len = + GENMASK(len_width - 1, 0); + } + } + } if (xdev->dma_config->dmatype == XDMA_TYPE_VDMA) { err = of_property_read_u32(node, "xlnx,num-fstores", -- 2.17.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrea Merello Subject: [PATCH v5 4/7] dmaengine: xilinx_dma: program hardware supported buffer length Date: Fri, 7 Sep 2018 08:24:59 +0200 Message-ID: <20180907062502.8241-4-andrea.merello@gmail.com> References: <20180907062502.8241-1-andrea.merello@gmail.com> Return-path: In-Reply-To: <20180907062502.8241-1-andrea.merello@gmail.com> Sender: linux-kernel-owner@vger.kernel.org To: vkoul@kernel.org, dan.j.williams@intel.com, michal.simek@xilinx.com, appana.durga.rao@xilinx.com, dmaengine@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, robh+dt@kernel.org, mark.rutland@arm.com, devicetree@vger.kernel.org, radhey.shyam.pandey@xilinx.com, Andrea Merello List-Id: devicetree@vger.kernel.org From: Radhey Shyam Pandey AXI-DMA IP supports configurable (c_sg_length_width) buffer length register width, hence read buffer length (xlnx,sg-length-width) DT property and ensure that driver doesn't program buffer length exceeding the supported limit. For VDMA and CDMA there is no change. Cc: Rob Herring Cc: Mark Rutland Cc: devicetree@vger.kernel.org Signed-off-by: Radhey Shyam Pandey Signed-off-by: Michal Simek Signed-off-by: Andrea Merello [rebase, reword] --- Changes in v2: - drop original patch and replace with the one in Xilinx tree Changes in v3: - cc DT maintainers/ML Changes in v4: - upper bound for the property should be 26, not 23 - add warn for width > 23 as per xilinx original patch - rework due to changes introduced in 1/6 Changes in v5: None --- drivers/dma/xilinx/xilinx_dma.c | 36 +++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dma.c index aaa6de8a70e4..b17f24e4ec35 100644 --- a/drivers/dma/xilinx/xilinx_dma.c +++ b/drivers/dma/xilinx/xilinx_dma.c @@ -158,7 +158,9 @@ #define XILINX_DMA_REG_BTT 0x28 /* AXI DMA Specific Masks/Bit fields */ -#define XILINX_DMA_MAX_TRANS_LEN GENMASK(22, 0) +#define XILINX_DMA_MAX_TRANS_LEN_MIN 8 +#define XILINX_DMA_MAX_TRANS_LEN_MAX 23 +#define XILINX_DMA_V2_MAX_TRANS_LEN_MAX 26 #define XILINX_DMA_CR_COALESCE_MAX GENMASK(23, 16) #define XILINX_DMA_CR_CYCLIC_BD_EN_MASK BIT(4) #define XILINX_DMA_CR_COALESCE_SHIFT 16 @@ -418,6 +420,7 @@ struct xilinx_dma_config { * @rxs_clk: DMA s2mm stream clock * @nr_channels: Number of channels DMA device supports * @chan_id: DMA channel identifier + * @max_buffer_len: Max buffer length */ struct xilinx_dma_device { void __iomem *regs; @@ -437,6 +440,7 @@ struct xilinx_dma_device { struct clk *rxs_clk; u32 nr_channels; u32 chan_id; + u32 max_buffer_len; }; /* Macros */ @@ -964,7 +968,7 @@ static int xilinx_dma_calc_copysize(struct xilinx_dma_chan *chan, int size, int done) { size_t copy = min_t(size_t, size - done, - XILINX_DMA_MAX_TRANS_LEN); + chan->xdev->max_buffer_len); if ((copy + done < size) && chan->xdev->common.copy_align) { @@ -1011,7 +1015,7 @@ static enum dma_status xilinx_dma_tx_status(struct dma_chan *dchan, list_for_each_entry(segment, &desc->segments, node) { hw = &segment->hw; residue += (hw->control - hw->status) & - XILINX_DMA_MAX_TRANS_LEN; + chan->xdev->max_buffer_len; } } spin_unlock_irqrestore(&chan->lock, flags); @@ -1263,7 +1267,7 @@ static void xilinx_cdma_start_transfer(struct xilinx_dma_chan *chan) /* Start the transfer */ dma_ctrl_write(chan, XILINX_DMA_REG_BTT, - hw->control & XILINX_DMA_MAX_TRANS_LEN); + hw->control & chan->xdev->max_buffer_len); } list_splice_tail_init(&chan->pending_list, &chan->active_list); @@ -1366,7 +1370,7 @@ static void xilinx_dma_start_transfer(struct xilinx_dma_chan *chan) /* Start the transfer */ dma_ctrl_write(chan, XILINX_DMA_REG_BTT, - hw->control & XILINX_DMA_MAX_TRANS_LEN); + hw->control & chan->xdev->max_buffer_len); } list_splice_tail_init(&chan->pending_list, &chan->active_list); @@ -1727,7 +1731,7 @@ xilinx_cdma_prep_memcpy(struct dma_chan *dchan, dma_addr_t dma_dst, struct xilinx_cdma_tx_segment *segment; struct xilinx_cdma_desc_hw *hw; - if (!len || len > XILINX_DMA_MAX_TRANS_LEN) + if (!len || len > chan->xdev->max_buffer_len) return NULL; desc = xilinx_dma_alloc_tx_descriptor(chan); @@ -2596,7 +2600,7 @@ static int xilinx_dma_probe(struct platform_device *pdev) struct xilinx_dma_device *xdev; struct device_node *child, *np = pdev->dev.of_node; struct resource *io; - u32 num_frames, addr_width; + u32 num_frames, addr_width, len_width; int i, err; /* Allocate and initialize the DMA engine structure */ @@ -2628,8 +2632,24 @@ static int xilinx_dma_probe(struct platform_device *pdev) /* Retrieve the DMA engine properties from the device tree */ xdev->has_sg = of_property_read_bool(node, "xlnx,include-sg"); - if (xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA) + xdev->max_buffer_len = GENMASK(XILINX_DMA_MAX_TRANS_LEN_MAX - 1, 0); + + if (xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA) { xdev->mcdma = of_property_read_bool(node, "xlnx,mcdma"); + if (!of_property_read_u32(node, "xlnx,sg-length-width", + &len_width)) { + if (len_width < XILINX_DMA_MAX_TRANS_LEN_MIN || + len_width > XILINX_DMA_V2_MAX_TRANS_LEN_MAX) { + dev_warn(xdev->dev, + "invalid xlnx,sg-length-width property value. Using default width\n"); + } else { + if (len_width > XILINX_DMA_MAX_TRANS_LEN_MAX) + dev_warn(xdev->dev, "Please ensure that IP supports buffer length > 23 bits\n"); + xdev->max_buffer_len = + GENMASK(len_width - 1, 0); + } + } + } if (xdev->dma_config->dmatype == XDMA_TYPE_VDMA) { err = of_property_read_u32(node, "xlnx,num-fstores", -- 2.17.1