devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v6 0/2] Add support for Loongson1 DMA
@ 2024-03-16 11:33 Keguang Zhang via B4 Relay
  2024-03-16 11:33 ` [PATCH v6 1/2] dt-bindings: dma: Add Loongson-1 DMA Keguang Zhang via B4 Relay
                   ` (2 more replies)
  0 siblings, 3 replies; 18+ messages in thread
From: Keguang Zhang via B4 Relay @ 2024-03-16 11:33 UTC (permalink / raw)
  To: Keguang Zhang, Vinod Koul, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: linux-mips, dmaengine, devicetree, linux-kernel

Add the driver and dt-binding document for Loongson1 DMA.

Changelog
V5 -> V6:
   Change the compatible to the fallback
   Implement .device_prep_dma_cyclic for Loongson1 sound driver,
   as well as .device_pause and .device_resume.
   Set the limitation LS1X_DMA_MAX_DESC and put all descriptors
   into one page to save memory
   Move dma_pool_zalloc() into ls1x_dma_alloc_desc()
   Drop dma_slave_config structure
   Use .remove_new instead of .remove
   Use KBUILD_MODNAME for the driver name
   Improve the debug information
   Some minor fixes
V4 -> V5:
   Add the dt-binding document
   Add DT support
   Use DT information instead of platform data
   Use chan_id of struct dma_chan instead of own id
   Use of_dma_xlate_by_chan_id() instead of ls1x_dma_filter()
   Update the author information to my official name
V3 -> V4:
   Use dma_slave_map to find the proper channel.
   Explicitly call devm_request_irq() and tasklet_kill().
   Fix namespace issue.
   Some minor fixes and cleanups.
V2 -> V3:
   Rename ls1x_dma_filter_fn to ls1x_dma_filter.
V1 -> V2:
   Change the config from 'DMA_LOONGSON1' to 'LOONGSON1_DMA',
   and rearrange it in alphabetical order in Kconfig and Makefile.
   Fix comment style.

Keguang Zhang (2):
  dt-bindings: dma: Add Loongson-1 DMA
  dmaengine: Loongson1: Add Loongson1 dmaengine driver

 .../bindings/dma/loongson,ls1x-dma.yaml       |  64 +++
 drivers/dma/Kconfig                           |   9 +
 drivers/dma/Makefile                          |   1 +
 drivers/dma/loongson1-dma.c                   | 492 ++++++++++++++++++
 4 files changed, 566 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml
 create mode 100644 drivers/dma/loongson1-dma.c

--
2.39.2

base-commit: 719136e5c24768ebdf80b9daa53facebbdd377c3
---
Keguang Zhang (2):
      dt-bindings: dma: Add Loongson-1 DMA
      dmaengine: Loongson1: Add Loongson1 dmaengine driver

 .../devicetree/bindings/dma/loongson,ls1x-dma.yaml |  66 ++
 drivers/dma/Kconfig                                |   9 +
 drivers/dma/Makefile                               |   1 +
 drivers/dma/loongson1-dma.c                        | 665 +++++++++++++++++++++
 4 files changed, 741 insertions(+)
---
base-commit: a1e7655b77e3391b58ac28256789ea45b1685abb
change-id: 20231120-loongson1-dma-163afe5708b9

Best regards,
-- 
Keguang Zhang <keguang.zhang@gmail.com>


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH v6 1/2] dt-bindings: dma: Add Loongson-1 DMA
  2024-03-16 11:33 [PATCH v6 0/2] Add support for Loongson1 DMA Keguang Zhang via B4 Relay
@ 2024-03-16 11:33 ` Keguang Zhang via B4 Relay
  2024-03-17 14:40   ` Conor Dooley
  2024-03-16 11:33 ` [PATCH v6 2/2] dmaengine: Loongson1: Add Loongson1 dmaengine driver Keguang Zhang via B4 Relay
  2024-03-16 14:04 ` [PATCH v6 0/2] Add support for Loongson1 DMA Huacai Chen
  2 siblings, 1 reply; 18+ messages in thread
From: Keguang Zhang via B4 Relay @ 2024-03-16 11:33 UTC (permalink / raw)
  To: Keguang Zhang, Vinod Koul, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: linux-mips, dmaengine, devicetree, linux-kernel

From: Keguang Zhang <keguang.zhang@gmail.com>

Add devicetree binding document for Loongson-1 DMA.

Signed-off-by: Keguang Zhang <keguang.zhang@gmail.com>
---
V5 -> V6:
   Change the compatible to the fallback
   Some minor fixes
V4 -> V5:
   A newly added patch
---
 .../devicetree/bindings/dma/loongson,ls1x-dma.yaml | 66 ++++++++++++++++++++++
 1 file changed, 66 insertions(+)

diff --git a/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml b/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml
new file mode 100644
index 000000000000..06358df725c6
--- /dev/null
+++ b/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml
@@ -0,0 +1,66 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/dma/loongson,ls1x-dma.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Loongson-1 DMA Controller
+
+maintainers:
+  - Keguang Zhang <keguang.zhang@gmail.com>
+
+description:
+  Loongson-1 DMA controller provides 3 independent channels for
+  peripherals such as NAND and AC97.
+
+properties:
+  compatible:
+    oneOf:
+      - const: loongson,ls1b-dma
+      - items:
+          - enum:
+              - loongson,ls1c-dma
+          - const: loongson,ls1b-dma
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    description: Each channel has a dedicated interrupt line.
+    minItems: 1
+    maxItems: 3
+
+  interrupt-names:
+    minItems: 1
+    items:
+      - pattern: ch0
+      - pattern: ch1
+      - pattern: ch2
+
+  '#dma-cells':
+    const: 1
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - interrupt-names
+  - '#dma-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/irq.h>
+    dma-controller@1fd01160 {
+        compatible = "loongson,ls1b-dma";
+        reg = <0x1fd01160 0x4>;
+
+        interrupt-parent = <&intc0>;
+        interrupts = <13 IRQ_TYPE_EDGE_RISING>,
+                     <14 IRQ_TYPE_EDGE_RISING>,
+                     <15 IRQ_TYPE_EDGE_RISING>;
+        interrupt-names = "ch0", "ch1", "ch2";
+
+        #dma-cells = <1>;
+    };

-- 
2.40.1


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH v6 2/2] dmaengine: Loongson1: Add Loongson1 dmaengine driver
  2024-03-16 11:33 [PATCH v6 0/2] Add support for Loongson1 DMA Keguang Zhang via B4 Relay
  2024-03-16 11:33 ` [PATCH v6 1/2] dt-bindings: dma: Add Loongson-1 DMA Keguang Zhang via B4 Relay
@ 2024-03-16 11:33 ` Keguang Zhang via B4 Relay
  2024-03-16 14:04 ` [PATCH v6 0/2] Add support for Loongson1 DMA Huacai Chen
  2 siblings, 0 replies; 18+ messages in thread
From: Keguang Zhang via B4 Relay @ 2024-03-16 11:33 UTC (permalink / raw)
  To: Keguang Zhang, Vinod Koul, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: linux-mips, dmaengine, devicetree, linux-kernel

From: Keguang Zhang <keguang.zhang@gmail.com>

This patch adds DMA Engine driver for Loongson1 SoCs.

Signed-off-by: Keguang Zhang <keguang.zhang@gmail.com>
---
V5 -> V6:
   Implement .device_prep_dma_cyclic for Loongson1 sound driver,
   as well as .device_pause and .device_resume.
   Set the limitation LS1X_DMA_MAX_DESC and put all descriptors
   into one page to save memory
   Move dma_pool_zalloc() into ls1x_dma_alloc_desc()
   Drop dma_slave_config structure
   Use .remove_new instead of .remove
   Use KBUILD_MODNAME for the driver name
   Improve the debug information
V4 -> V5:
   Add DT support
   Use DT data instead of platform data
   Use chan_id of struct dma_chan instead of own id
   Use of_dma_xlate_by_chan_id() instead of ls1x_dma_filter()
   Update the author information to my official name
V3 -> V4:
   Use dma_slave_map to find the proper channel.
   Explicitly call devm_request_irq() and tasklet_kill().
   Fix namespace issue.
   Some minor fixes and cleanups.
V2 -> V3:
   Rename ls1x_dma_filter_fn to ls1x_dma_filter.
V1 -> V2:
   Change the config from 'DMA_LOONGSON1' to 'LOONGSON1_DMA',
   and rearrange it in alphabetical order in Kconfig and Makefile.
   Fix comment style.
---
 drivers/dma/Kconfig         |   9 +
 drivers/dma/Makefile        |   1 +
 drivers/dma/loongson1-dma.c | 665 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 675 insertions(+)

diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index 002a5ec80620..837163b05c94 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -369,6 +369,15 @@ config K3_DMA
 	  Support the DMA engine for Hisilicon K3 platform
 	  devices.
 
+config LOONGSON1_DMA
+	tristate "Loongson1 DMA support"
+	depends on MACH_LOONGSON32
+	select DMA_ENGINE
+	select DMA_VIRTUAL_CHANNELS
+	help
+	  This selects support for the DMA controller in Loongson1 SoCs,
+	  which is required by Loongson1 NAND and sound support.
+
 config LPC18XX_DMAMUX
 	bool "NXP LPC18xx/43xx DMA MUX for PL080"
 	depends on ARCH_LPC18XX || COMPILE_TEST
diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile
index dfd40d14e408..5e3604f09b89 100644
--- a/drivers/dma/Makefile
+++ b/drivers/dma/Makefile
@@ -47,6 +47,7 @@ obj-$(CONFIG_INTEL_IDMA64) += idma64.o
 obj-$(CONFIG_INTEL_IOATDMA) += ioat/
 obj-y += idxd/
 obj-$(CONFIG_K3_DMA) += k3dma.o
+obj-$(CONFIG_LOONGSON1_DMA) += loongson1-dma.o
 obj-$(CONFIG_LPC18XX_DMAMUX) += lpc18xx-dmamux.o
 obj-$(CONFIG_LS2X_APB_DMA) += ls2x-apb-dma.o
 obj-$(CONFIG_MILBEAUT_HDMAC) += milbeaut-hdmac.o
diff --git a/drivers/dma/loongson1-dma.c b/drivers/dma/loongson1-dma.c
new file mode 100644
index 000000000000..947b607c5121
--- /dev/null
+++ b/drivers/dma/loongson1-dma.c
@@ -0,0 +1,665 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * DMA Driver for Loongson-1 SoC
+ *
+ * Copyright (C) 2015-2024 Keguang Zhang <keguang.zhang@gmail.com>
+ */
+
+#include <linux/dmapool.h>
+#include <linux/dma-mapping.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/iopoll.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_dma.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+
+#include "dmaengine.h"
+#include "virt-dma.h"
+
+/* Loongson-1 DMA Control Register */
+#define DMA_CTRL			0x0
+
+/* DMA Control Register Bits */
+#define DMA_STOP			BIT(4)
+#define DMA_START			BIT(3)
+#define DMA_ASK_VALID			BIT(2)
+
+#define DMA_ADDR_MASK			GENMASK(31, 6)
+
+/* DMA Next Field Bits */
+#define DMA_NEXT_VALID			BIT(0)
+
+/* DMA Command Field Bits */
+#define DMA_RAM2DEV			BIT(12)
+#define DMA_INT				BIT(1)
+#define DMA_INT_MASK			BIT(0)
+
+#define LS1X_DMA_MAX_CHANNELS		3
+
+/* Size of allocations for hardware descriptors */
+#define LS1X_DMA_DESCS_SIZE		PAGE_SIZE
+#define LS1X_DMA_MAX_DESC		\
+	(LS1X_DMA_DESCS_SIZE / sizeof(struct ls1x_dma_hwdesc))
+
+struct ls1x_dma_hwdesc {
+	u32 next;		/* next descriptor address */
+	u32 saddr;		/* memory DMA address */
+	u32 daddr;		/* device DMA address */
+	u32 length;
+	u32 stride;
+	u32 cycles;
+	u32 cmd;
+	u32 stats;
+};
+
+struct ls1x_dma_desc {
+	struct virt_dma_desc vdesc;
+	enum dma_transfer_direction dir;
+	enum dma_transaction_type type;
+	unsigned int bus_width;
+
+	unsigned int nr_descs;	/* number of descriptors */
+
+	struct ls1x_dma_hwdesc *hwdesc;
+	dma_addr_t hwdesc_phys;
+};
+
+struct ls1x_dma_chan {
+	struct virt_dma_chan vchan;
+	struct dma_pool *desc_pool;
+	phys_addr_t src_addr;
+	phys_addr_t dst_addr;
+	enum dma_slave_buswidth src_addr_width;
+	enum dma_slave_buswidth dst_addr_width;
+
+	void __iomem *reg_base;
+	int irq;
+
+	struct ls1x_dma_desc *desc;
+
+	struct ls1x_dma_hwdesc *curr_hwdesc;
+	dma_addr_t curr_hwdesc_phys;
+};
+
+struct ls1x_dma {
+	struct dma_device ddev;
+	void __iomem *reg_base;
+
+	unsigned int nr_chans;
+	struct ls1x_dma_chan chan[];
+};
+
+#define to_ls1x_dma_chan(dchan)		\
+	container_of(dchan, struct ls1x_dma_chan, vchan.chan)
+
+#define to_ls1x_dma_desc(vd)		\
+	container_of(vd, struct ls1x_dma_desc, vdesc)
+
+/* macros for registers read/write */
+#define chan_readl(chan, off)		\
+	readl((chan)->reg_base + (off))
+
+#define chan_writel(chan, off, val)	\
+	writel((val), (chan)->reg_base + (off))
+
+static inline struct device *chan2dev(struct dma_chan *chan)
+{
+	return &chan->dev->device;
+}
+
+static inline int ls1x_dma_query(struct ls1x_dma_chan *chan,
+				 dma_addr_t *hwdesc_phys)
+{
+	struct dma_chan *dchan = &chan->vchan.chan;
+	int val, ret;
+
+	val = *hwdesc_phys & DMA_ADDR_MASK;
+	val |= DMA_ASK_VALID;
+	val |= dchan->chan_id;
+	chan_writel(chan, DMA_CTRL, val);
+	ret = readl_poll_timeout_atomic(chan->reg_base + DMA_CTRL, val,
+					!(val & DMA_ASK_VALID), 0, 3000);
+	if (ret)
+		dev_err(chan2dev(dchan), "failed to query DMA\n");
+
+	return ret;
+}
+
+static inline int ls1x_dma_start(struct ls1x_dma_chan *chan,
+				 dma_addr_t *hwdesc_phys)
+{
+	struct dma_chan *dchan = &chan->vchan.chan;
+	int val, ret;
+
+	dev_dbg(chan2dev(dchan), "cookie=%d, starting hwdesc=%x\n",
+		dchan->cookie, *hwdesc_phys);
+
+	val = *hwdesc_phys & DMA_ADDR_MASK;
+	val |= DMA_START;
+	val |= dchan->chan_id;
+	chan_writel(chan, DMA_CTRL, val);
+	ret = readl_poll_timeout(chan->reg_base + DMA_CTRL, val,
+				 !(val & DMA_START), 0, 3000);
+	if (ret)
+		dev_err(chan2dev(dchan), "failed to start DMA\n");
+
+	return ret;
+}
+
+static inline void ls1x_dma_stop(struct ls1x_dma_chan *chan)
+{
+	chan_writel(chan, DMA_CTRL, chan_readl(chan, DMA_CTRL) | DMA_STOP);
+}
+
+static void ls1x_dma_free_chan_resources(struct dma_chan *dchan)
+{
+	struct ls1x_dma_chan *chan = to_ls1x_dma_chan(dchan);
+
+	dma_free_coherent(chan2dev(dchan), sizeof(struct ls1x_dma_hwdesc),
+			  chan->curr_hwdesc, chan->curr_hwdesc_phys);
+	vchan_free_chan_resources(&chan->vchan);
+	dma_pool_destroy(chan->desc_pool);
+	chan->desc_pool = NULL;
+}
+
+static int ls1x_dma_alloc_chan_resources(struct dma_chan *dchan)
+{
+	struct ls1x_dma_chan *chan = to_ls1x_dma_chan(dchan);
+
+	chan->desc_pool = dma_pool_create(dma_chan_name(dchan),
+					  chan2dev(dchan),
+					  sizeof(struct ls1x_dma_hwdesc),
+					  __alignof__(struct ls1x_dma_hwdesc),
+					  0);
+	if (!chan->desc_pool)
+		return -ENOMEM;
+
+	/* allocate memory for querying current HW descriptor */
+	dma_set_coherent_mask(chan2dev(dchan), DMA_BIT_MASK(32));
+	chan->curr_hwdesc = dma_alloc_coherent(chan2dev(dchan),
+					       sizeof(struct ls1x_dma_hwdesc),
+					       &chan->curr_hwdesc_phys,
+					       GFP_KERNEL);
+	if (!chan->curr_hwdesc)
+		return -ENOMEM;
+
+	return 0;
+}
+
+static void ls1x_dma_free_desc(struct virt_dma_desc *vdesc)
+{
+	struct ls1x_dma_desc *desc = to_ls1x_dma_desc(vdesc);
+	struct ls1x_dma_chan *chan = to_ls1x_dma_chan(vdesc->tx.chan);
+
+	dma_pool_free(chan->desc_pool, desc->hwdesc, desc->hwdesc_phys);
+	chan->desc = NULL;
+	kfree(desc);
+}
+
+static struct ls1x_dma_desc *
+ls1x_dma_alloc_desc(struct dma_chan *dchan, int sg_len,
+		    enum dma_transfer_direction direction,
+		    enum dma_transaction_type type)
+{
+	struct ls1x_dma_chan *chan = to_ls1x_dma_chan(dchan);
+	struct ls1x_dma_desc *desc;
+
+	if (sg_len > LS1X_DMA_MAX_DESC) {
+		dev_err(chan2dev(dchan), "sg_len %u exceeds limit %lu",
+			sg_len, LS1X_DMA_MAX_DESC);
+		return NULL;
+	}
+
+	desc = kzalloc(sizeof(*desc), GFP_NOWAIT);
+	if (!desc)
+		return NULL;
+
+	/* allocate HW descriptors */
+	desc->hwdesc = dma_pool_zalloc(chan->desc_pool, GFP_NOWAIT,
+				       &desc->hwdesc_phys);
+	if (!desc->hwdesc) {
+		dev_err(chan2dev(dchan), "failed to alloc HW descriptors\n");
+		ls1x_dma_free_desc(&desc->vdesc);
+		return NULL;
+	}
+
+	desc->dir = direction;
+	desc->type = type;
+	desc->nr_descs = sg_len;
+
+	return desc;
+}
+
+static int ls1x_dma_setup_hwdescs(struct dma_chan *dchan,
+				  struct ls1x_dma_desc *desc,
+				  struct scatterlist *sgl, unsigned int sg_len)
+{
+	struct ls1x_dma_chan *chan = to_ls1x_dma_chan(dchan);
+	dma_addr_t next_hwdesc_phys = desc->hwdesc_phys;
+
+	struct scatterlist *sg;
+	unsigned int dev_addr, cmd, i;
+
+	switch (desc->dir) {
+	case DMA_MEM_TO_DEV:
+		dev_addr = chan->dst_addr;
+		desc->bus_width = chan->dst_addr_width;
+		cmd = DMA_RAM2DEV | DMA_INT;
+		break;
+	case DMA_DEV_TO_MEM:
+		dev_addr = chan->src_addr;
+		desc->bus_width = chan->src_addr_width;
+		cmd = DMA_INT;
+		break;
+	default:
+		dev_err(chan2dev(dchan), "unsupported DMA direction: %s\n",
+			dmaengine_get_direction_text(desc->dir));
+		return -EINVAL;
+	}
+
+	/* setup HW descriptors */
+	for_each_sg(sgl, sg, sg_len, i) {
+		dma_addr_t buf_addr = sg_dma_address(sg);
+		size_t buf_len = sg_dma_len(sg);
+		struct ls1x_dma_hwdesc *hwdesc = &desc->hwdesc[i];
+
+		if (!is_dma_copy_aligned(dchan->device, buf_addr, 0, buf_len)) {
+			dev_err(chan2dev(dchan), "buffer is not aligned!\n");
+			return -EINVAL;
+		}
+
+		hwdesc->saddr = buf_addr;
+		hwdesc->daddr = dev_addr;
+		hwdesc->length = buf_len / desc->bus_width;
+		hwdesc->stride = 0;
+		hwdesc->cycles = 1;
+		hwdesc->cmd = cmd;
+
+		if (i) {
+			next_hwdesc_phys += sizeof(*hwdesc);
+			desc->hwdesc[i - 1].next = next_hwdesc_phys
+			    | DMA_NEXT_VALID;
+		}
+	}
+
+	if (desc->type == DMA_CYCLIC)
+		desc->hwdesc[i - 1].next = desc->hwdesc_phys | DMA_NEXT_VALID;
+
+	for_each_sg(sgl, sg, sg_len, i) {
+		struct ls1x_dma_hwdesc *hwdesc = &desc->hwdesc[i];
+
+		print_hex_dump_debug("HW DESC: ", DUMP_PREFIX_OFFSET, 16, 4,
+				     hwdesc, sizeof(*hwdesc), false);
+	}
+
+	return 0;
+}
+
+static struct dma_async_tx_descriptor *
+ls1x_dma_prep_slave_sg(struct dma_chan *dchan,
+		       struct scatterlist *sgl, unsigned int sg_len,
+		       enum dma_transfer_direction direction,
+		       unsigned long flags, void *context)
+{
+	struct ls1x_dma_chan *chan = to_ls1x_dma_chan(dchan);
+	struct ls1x_dma_desc *desc;
+
+	dev_dbg(chan2dev(dchan), "sg_len=%u flags=0x%lx dir=%s\n",
+		sg_len, flags, dmaengine_get_direction_text(direction));
+
+	desc = ls1x_dma_alloc_desc(dchan, sg_len, direction, DMA_SLAVE);
+	if (!desc)
+		return NULL;
+
+	if (ls1x_dma_setup_hwdescs(dchan, desc, sgl, sg_len)) {
+		ls1x_dma_free_desc(&desc->vdesc);
+		return NULL;
+	}
+
+	return vchan_tx_prep(&chan->vchan, &desc->vdesc, flags);
+}
+
+static struct dma_async_tx_descriptor *
+ls1x_dma_prep_dma_cyclic(struct dma_chan *dchan,
+			 dma_addr_t buf_addr, size_t buf_len, size_t period_len,
+			 enum dma_transfer_direction direction,
+			 unsigned long flags)
+{
+	struct ls1x_dma_chan *chan = to_ls1x_dma_chan(dchan);
+	struct ls1x_dma_desc *desc;
+	struct scatterlist *sgl;
+	unsigned int sg_len;
+	unsigned int i;
+
+	dev_dbg(chan2dev(dchan),
+		"buf_len=%d period_len=%zu flags=0x%lx dir=%s\n", buf_len,
+		period_len, flags, dmaengine_get_direction_text(direction));
+
+	sg_len = buf_len / period_len;
+	desc = ls1x_dma_alloc_desc(dchan, sg_len, direction, DMA_CYCLIC);
+	if (!desc)
+		return NULL;
+
+	/* allocate the scatterlist */
+	sgl = kmalloc_array(sg_len, sizeof(*sgl), GFP_NOWAIT);
+	if (!sgl)
+		return NULL;
+
+	sg_init_table(sgl, sg_len);
+	for (i = 0; i < sg_len; ++i) {
+		sg_set_page(&sgl[i], pfn_to_page(PFN_DOWN(buf_addr)),
+			    period_len, offset_in_page(buf_addr));
+		sg_dma_address(&sgl[i]) = buf_addr;
+		sg_dma_len(&sgl[i]) = period_len;
+		buf_addr += period_len;
+	}
+
+	if (ls1x_dma_setup_hwdescs(dchan, desc, sgl, sg_len)) {
+		ls1x_dma_free_desc(&desc->vdesc);
+		return NULL;
+	}
+
+	kfree(sgl);
+
+	return vchan_tx_prep(&chan->vchan, &desc->vdesc, flags);
+}
+
+static int ls1x_dma_slave_config(struct dma_chan *dchan,
+				 struct dma_slave_config *config)
+{
+	struct ls1x_dma_chan *chan = to_ls1x_dma_chan(dchan);
+
+	chan->src_addr = config->src_addr;
+	chan->src_addr_width = config->src_addr_width;
+	chan->dst_addr = config->dst_addr;
+	chan->dst_addr_width = config->dst_addr_width;
+
+	return 0;
+}
+
+static int ls1x_dma_pause(struct dma_chan *dchan)
+{
+	struct ls1x_dma_chan *chan = to_ls1x_dma_chan(dchan);
+	unsigned long flags;
+	int ret;
+
+	spin_lock_irqsave(&chan->vchan.lock, flags);
+	ret = ls1x_dma_query(chan, &chan->curr_hwdesc_phys);
+	if (!ret)
+		ls1x_dma_stop(chan);
+	spin_unlock_irqrestore(&chan->vchan.lock, flags);
+
+	return ret;
+}
+
+static int ls1x_dma_resume(struct dma_chan *dchan)
+{
+	struct ls1x_dma_chan *chan = to_ls1x_dma_chan(dchan);
+	unsigned long flags;
+	int ret;
+
+	spin_lock_irqsave(&chan->vchan.lock, flags);
+	ret = ls1x_dma_start(chan, &chan->curr_hwdesc_phys);
+	spin_unlock_irqrestore(&chan->vchan.lock, flags);
+
+	return ret;
+}
+
+static int ls1x_dma_terminate_all(struct dma_chan *dchan)
+{
+	struct ls1x_dma_chan *chan = to_ls1x_dma_chan(dchan);
+	unsigned long flags;
+	LIST_HEAD(head);
+
+	spin_lock_irqsave(&chan->vchan.lock, flags);
+	ls1x_dma_stop(chan);
+	vchan_get_all_descriptors(&chan->vchan, &head);
+	spin_unlock_irqrestore(&chan->vchan.lock, flags);
+
+	vchan_dma_desc_free_list(&chan->vchan, &head);
+
+	return 0;
+}
+
+static enum dma_status ls1x_dma_tx_status(struct dma_chan *dchan,
+					  dma_cookie_t cookie,
+					  struct dma_tx_state *state)
+{
+	struct ls1x_dma_chan *chan = to_ls1x_dma_chan(dchan);
+	struct virt_dma_desc *vdesc;
+	enum dma_status status;
+	size_t bytes = 0;
+	unsigned long flags;
+
+	status = dma_cookie_status(dchan, cookie, state);
+	if (status == DMA_COMPLETE)
+		return status;
+
+	spin_lock_irqsave(&chan->vchan.lock, flags);
+	vdesc = vchan_find_desc(&chan->vchan, cookie);
+	if (chan->desc && cookie == chan->desc->vdesc.tx.cookie) {
+		struct ls1x_dma_desc *desc = chan->desc;
+		int i;
+
+		if (ls1x_dma_query(chan, &chan->curr_hwdesc_phys))
+			return status;
+
+		/* locate the current HW descriptor */
+		for (i = 0; i < desc->nr_descs; i++)
+			if (desc->hwdesc[i].next == chan->curr_hwdesc->next)
+				break;
+
+		/* count the residues */
+		for (; i < desc->nr_descs; i++)
+			bytes += desc->hwdesc[i].length * desc->bus_width;
+
+		dma_set_residue(state, bytes);
+	}
+	spin_unlock_irqrestore(&chan->vchan.lock, flags);
+
+	return status;
+}
+
+static void ls1x_dma_issue_pending(struct dma_chan *dchan)
+{
+	struct ls1x_dma_chan *chan = to_ls1x_dma_chan(dchan);
+	struct virt_dma_desc *vdesc;
+	unsigned long flags;
+
+	spin_lock_irqsave(&chan->vchan.lock, flags);
+	if (vchan_issue_pending(&chan->vchan) && !chan->desc) {
+		vdesc = vchan_next_desc(&chan->vchan);
+		if (!vdesc) {
+			chan->desc = NULL;
+			return;
+		}
+		chan->desc = to_ls1x_dma_desc(vdesc);
+		ls1x_dma_start(chan, &chan->desc->hwdesc_phys);
+	}
+	spin_unlock_irqrestore(&chan->vchan.lock, flags);
+}
+
+static irqreturn_t ls1x_dma_irq_handler(int irq, void *data)
+{
+	struct ls1x_dma_chan *chan = data;
+	struct ls1x_dma_desc *desc = chan->desc;
+	struct dma_chan *dchan = &chan->vchan.chan;
+
+	if (!desc) {
+		dev_warn(chan2dev(dchan),
+			 "IRQ %d with no active descriptor on channel %d\n",
+			 irq, dchan->chan_id);
+		return IRQ_NONE;
+	}
+
+	dev_dbg(chan2dev(dchan), "DMA IRQ %d on channel %d\n", irq,
+		dchan->chan_id);
+
+	spin_lock(&chan->vchan.lock);
+
+	if (desc->type == DMA_CYCLIC) {
+		vchan_cyclic_callback(&desc->vdesc);
+	} else {
+		list_del(&desc->vdesc.node);
+		vchan_cookie_complete(&desc->vdesc);
+		chan->desc = NULL;
+	}
+
+	spin_unlock(&chan->vchan.lock);
+	return IRQ_HANDLED;
+}
+
+static int ls1x_dma_chan_probe(struct platform_device *pdev,
+			       struct ls1x_dma *dma, int chan_id)
+{
+	struct device *dev = &pdev->dev;
+	struct ls1x_dma_chan *chan = &dma->chan[chan_id];
+	char pdev_irqname[4];
+	char *irqname;
+	int ret;
+
+	sprintf(pdev_irqname, "ch%u", chan_id);
+	chan->irq = platform_get_irq_byname(pdev, pdev_irqname);
+	if (chan->irq < 0)
+		return -ENODEV;
+
+	irqname = devm_kasprintf(dev, GFP_KERNEL, "%s:%s",
+				 dev_name(dev), pdev_irqname);
+	if (!irqname)
+		return -ENOMEM;
+
+	ret = devm_request_irq(dev, chan->irq, ls1x_dma_irq_handler,
+			       IRQF_SHARED, irqname, chan);
+	if (ret)
+		return dev_err_probe(dev, ret,
+				     "failed to request IRQ %u!\n", chan->irq);
+
+	chan->reg_base = dma->reg_base;
+	chan->vchan.desc_free = ls1x_dma_free_desc;
+	vchan_init(&chan->vchan, &dma->ddev);
+	dev_info(dev, "%s (irq %d) initialized\n", pdev_irqname, chan->irq);
+
+	return 0;
+}
+
+static void ls1x_dma_chan_remove(struct ls1x_dma *dma, int chan_id)
+{
+	struct device *dev = dma->ddev.dev;
+	struct ls1x_dma_chan *chan = &dma->chan[chan_id];
+
+	devm_free_irq(dev, chan->irq, chan);
+	list_del(&chan->vchan.chan.device_node);
+	tasklet_kill(&chan->vchan.task);
+}
+
+static int ls1x_dma_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct dma_device *ddev;
+	struct ls1x_dma *dma;
+	int nr_chans, ret, i;
+
+	nr_chans = platform_irq_count(pdev);
+	if (nr_chans <= 0)
+		return nr_chans;
+	if (nr_chans > LS1X_DMA_MAX_CHANNELS)
+		return dev_err_probe(dev, -EINVAL,
+				     "nr_chans=%d exceeds the maximum\n",
+				     nr_chans);
+
+	dma = devm_kzalloc(dev, struct_size(dma, chan, nr_chans), GFP_KERNEL);
+	if (!dma)
+		return -ENOMEM;
+
+	/* initialize DMA device */
+	dma->reg_base = devm_platform_ioremap_resource(pdev, 0);
+	if (IS_ERR(dma->reg_base))
+		return PTR_ERR(dma->reg_base);
+
+	ddev = &dma->ddev;
+	ddev->dev = dev;
+	ddev->copy_align = DMAENGINE_ALIGN_4_BYTES;
+	ddev->src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) |
+	    BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
+	ddev->dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) |
+	    BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
+	ddev->directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
+	ddev->max_sg_burst = LS1X_DMA_MAX_DESC;
+	ddev->residue_granularity = DMA_RESIDUE_GRANULARITY_SEGMENT;
+	ddev->device_alloc_chan_resources = ls1x_dma_alloc_chan_resources;
+	ddev->device_free_chan_resources = ls1x_dma_free_chan_resources;
+	ddev->device_prep_slave_sg = ls1x_dma_prep_slave_sg;
+	ddev->device_prep_dma_cyclic = ls1x_dma_prep_dma_cyclic;
+	ddev->device_config = ls1x_dma_slave_config;
+	ddev->device_pause = ls1x_dma_pause;
+	ddev->device_resume = ls1x_dma_resume;
+	ddev->device_terminate_all = ls1x_dma_terminate_all;
+	ddev->device_tx_status = ls1x_dma_tx_status;
+	ddev->device_issue_pending = ls1x_dma_issue_pending;
+
+	dma_cap_set(DMA_SLAVE, ddev->cap_mask);
+	INIT_LIST_HEAD(&ddev->channels);
+
+	/* initialize DMA channels */
+	for (i = 0; i < nr_chans; i++) {
+		ret = ls1x_dma_chan_probe(pdev, dma, i);
+		if (ret)
+			return ret;
+	}
+	dma->nr_chans = nr_chans;
+
+	ret = dmaenginem_async_device_register(ddev);
+	if (ret) {
+		dev_err(dev, "failed to register DMA device! %d\n", ret);
+		return ret;
+	}
+
+	ret =
+	    of_dma_controller_register(dev->of_node, of_dma_xlate_by_chan_id,
+				       ddev);
+	if (ret) {
+		dev_err(dev, "failed to register DMA controller! %d\n", ret);
+		return ret;
+	}
+
+	platform_set_drvdata(pdev, dma);
+	dev_info(dev, "Loongson1 DMA driver registered\n");
+
+	return 0;
+}
+
+static void ls1x_dma_remove(struct platform_device *pdev)
+{
+	struct ls1x_dma *dma = platform_get_drvdata(pdev);
+	int i;
+
+	of_dma_controller_free(pdev->dev.of_node);
+
+	for (i = 0; i < dma->nr_chans; i++)
+		ls1x_dma_chan_remove(dma, i);
+}
+
+static const struct of_device_id ls1x_dma_match[] = {
+	{ .compatible = "loongson,ls1b-dma" },
+	{ .compatible = "loongson,ls1c-dma" },
+	{ /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, ls1x_dma_match);
+
+static struct platform_driver ls1x_dma_driver = {
+	.probe = ls1x_dma_probe,
+	.remove_new = ls1x_dma_remove,
+	.driver	= {
+		.name = KBUILD_MODNAME,
+		.of_match_table = ls1x_dma_match,
+	},
+};
+
+module_platform_driver(ls1x_dma_driver);
+
+MODULE_AUTHOR("Keguang Zhang <keguang.zhang@gmail.com>");
+MODULE_DESCRIPTION("Loongson-1 DMA driver");
+MODULE_LICENSE("GPL");

-- 
2.40.1


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Re: [PATCH v6 0/2] Add support for Loongson1 DMA
  2024-03-16 11:33 [PATCH v6 0/2] Add support for Loongson1 DMA Keguang Zhang via B4 Relay
  2024-03-16 11:33 ` [PATCH v6 1/2] dt-bindings: dma: Add Loongson-1 DMA Keguang Zhang via B4 Relay
  2024-03-16 11:33 ` [PATCH v6 2/2] dmaengine: Loongson1: Add Loongson1 dmaengine driver Keguang Zhang via B4 Relay
@ 2024-03-16 14:04 ` Huacai Chen
  2024-03-18  2:07   ` Keguang Zhang
  2 siblings, 1 reply; 18+ messages in thread
From: Huacai Chen @ 2024-03-16 14:04 UTC (permalink / raw)
  To: keguang.zhang
  Cc: Vinod Koul, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	linux-mips, dmaengine, devicetree, linux-kernel

Hi, Keguang,

Sorry for the late reply, there is already a ls2x-apb-dma driver, I'm
not sure but can they share the same code base? If not, can rename
this driver to ls1x-apb-dma for consistency?

Huacai

On Sat, Mar 16, 2024 at 7:34 PM Keguang Zhang via B4 Relay
<devnull+keguang.zhang.gmail.com@kernel.org> wrote:
>
> Add the driver and dt-binding document for Loongson1 DMA.
>
> Changelog
> V5 -> V6:
>    Change the compatible to the fallback
>    Implement .device_prep_dma_cyclic for Loongson1 sound driver,
>    as well as .device_pause and .device_resume.
>    Set the limitation LS1X_DMA_MAX_DESC and put all descriptors
>    into one page to save memory
>    Move dma_pool_zalloc() into ls1x_dma_alloc_desc()
>    Drop dma_slave_config structure
>    Use .remove_new instead of .remove
>    Use KBUILD_MODNAME for the driver name
>    Improve the debug information
>    Some minor fixes
> V4 -> V5:
>    Add the dt-binding document
>    Add DT support
>    Use DT information instead of platform data
>    Use chan_id of struct dma_chan instead of own id
>    Use of_dma_xlate_by_chan_id() instead of ls1x_dma_filter()
>    Update the author information to my official name
> V3 -> V4:
>    Use dma_slave_map to find the proper channel.
>    Explicitly call devm_request_irq() and tasklet_kill().
>    Fix namespace issue.
>    Some minor fixes and cleanups.
> V2 -> V3:
>    Rename ls1x_dma_filter_fn to ls1x_dma_filter.
> V1 -> V2:
>    Change the config from 'DMA_LOONGSON1' to 'LOONGSON1_DMA',
>    and rearrange it in alphabetical order in Kconfig and Makefile.
>    Fix comment style.
>
> Keguang Zhang (2):
>   dt-bindings: dma: Add Loongson-1 DMA
>   dmaengine: Loongson1: Add Loongson1 dmaengine driver
>
>  .../bindings/dma/loongson,ls1x-dma.yaml       |  64 +++
>  drivers/dma/Kconfig                           |   9 +
>  drivers/dma/Makefile                          |   1 +
>  drivers/dma/loongson1-dma.c                   | 492 ++++++++++++++++++
>  4 files changed, 566 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml
>  create mode 100644 drivers/dma/loongson1-dma.c
>
> --
> 2.39.2
>
> base-commit: 719136e5c24768ebdf80b9daa53facebbdd377c3
> ---
> Keguang Zhang (2):
>       dt-bindings: dma: Add Loongson-1 DMA
>       dmaengine: Loongson1: Add Loongson1 dmaengine driver
>
>  .../devicetree/bindings/dma/loongson,ls1x-dma.yaml |  66 ++
>  drivers/dma/Kconfig                                |   9 +
>  drivers/dma/Makefile                               |   1 +
>  drivers/dma/loongson1-dma.c                        | 665 +++++++++++++++++++++
>  4 files changed, 741 insertions(+)
> ---
> base-commit: a1e7655b77e3391b58ac28256789ea45b1685abb
> change-id: 20231120-loongson1-dma-163afe5708b9
>
> Best regards,
> --
> Keguang Zhang <keguang.zhang@gmail.com>
>
>

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v6 1/2] dt-bindings: dma: Add Loongson-1 DMA
  2024-03-16 11:33 ` [PATCH v6 1/2] dt-bindings: dma: Add Loongson-1 DMA Keguang Zhang via B4 Relay
@ 2024-03-17 14:40   ` Conor Dooley
  2024-03-18  6:18     ` Keguang Zhang
  0 siblings, 1 reply; 18+ messages in thread
From: Conor Dooley @ 2024-03-17 14:40 UTC (permalink / raw)
  To: keguang.zhang
  Cc: Vinod Koul, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	linux-mips, dmaengine, devicetree, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 2006 bytes --]

On Sat, Mar 16, 2024 at 07:33:53PM +0800, Keguang Zhang via B4 Relay wrote:
> From: Keguang Zhang <keguang.zhang@gmail.com>
> 
> Add devicetree binding document for Loongson-1 DMA.
> 
> Signed-off-by: Keguang Zhang <keguang.zhang@gmail.com>
> ---
> V5 -> V6:
>    Change the compatible to the fallback
>    Some minor fixes
> V4 -> V5:
>    A newly added patch
> ---
>  .../devicetree/bindings/dma/loongson,ls1x-dma.yaml | 66 ++++++++++++++++++++++
>  1 file changed, 66 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml b/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml
> new file mode 100644
> index 000000000000..06358df725c6
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml
> @@ -0,0 +1,66 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/dma/loongson,ls1x-dma.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Loongson-1 DMA Controller
> +
> +maintainers:
> +  - Keguang Zhang <keguang.zhang@gmail.com>
> +
> +description:
> +  Loongson-1 DMA controller provides 3 independent channels for
> +  peripherals such as NAND and AC97.
> +
> +properties:
> +  compatible:
> +    oneOf:
> +      - const: loongson,ls1b-dma
> +      - items:
> +          - enum:
> +              - loongson,ls1c-dma
> +          - const: loongson,ls1b-dma

Aren't there several more devices in this family? Do they not have DMA
controllers?

> +
> +  reg:
> +    maxItems: 1
> +
> +  interrupts:
> +    description: Each channel has a dedicated interrupt line.
> +    minItems: 1
> +    maxItems: 3

Is this number not fixed for each SoC?

> +  interrupt-names:
> +    minItems: 1
> +    items:
> +      - pattern: ch0
> +      - pattern: ch1
> +      - pattern: ch2

Why have you made these a pattern? There's no regex being used here at
all.

Cheers,
Cono4.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v6 0/2] Add support for Loongson1 DMA
  2024-03-16 14:04 ` [PATCH v6 0/2] Add support for Loongson1 DMA Huacai Chen
@ 2024-03-18  2:07   ` Keguang Zhang
  2024-03-18  7:31     ` Huacai Chen
  0 siblings, 1 reply; 18+ messages in thread
From: Keguang Zhang @ 2024-03-18  2:07 UTC (permalink / raw)
  To: Huacai Chen
  Cc: Vinod Koul, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	linux-mips, dmaengine, devicetree, linux-kernel

Hi Huacai,

> Hi, Keguang,
>
> Sorry for the late reply, there is already a ls2x-apb-dma driver, I'm
> not sure but can they share the same code base? If not, can rename
> this driver to ls1x-apb-dma for consistency?

There are some differences between ls1x DMA and ls2x DMA, such as
registers and DMA descriptors.
I will rename it to ls1x-apb-dma.
Thanks!

>
> Huacai
>
> On Sat, Mar 16, 2024 at 7:34 PM Keguang Zhang via B4 Relay
> <devnull+keguang.zhang.gmail.com@kernel.org> wrote:
> >
> > Add the driver and dt-binding document for Loongson1 DMA.
> >
> > Changelog
> > V5 -> V6:
> >    Change the compatible to the fallback
> >    Implement .device_prep_dma_cyclic for Loongson1 sound driver,
> >    as well as .device_pause and .device_resume.
> >    Set the limitation LS1X_DMA_MAX_DESC and put all descriptors
> >    into one page to save memory
> >    Move dma_pool_zalloc() into ls1x_dma_alloc_desc()
> >    Drop dma_slave_config structure
> >    Use .remove_new instead of .remove
> >    Use KBUILD_MODNAME for the driver name
> >    Improve the debug information
> >    Some minor fixes
> > V4 -> V5:
> >    Add the dt-binding document
> >    Add DT support
> >    Use DT information instead of platform data
> >    Use chan_id of struct dma_chan instead of own id
> >    Use of_dma_xlate_by_chan_id() instead of ls1x_dma_filter()
> >    Update the author information to my official name
> > V3 -> V4:
> >    Use dma_slave_map to find the proper channel.
> >    Explicitly call devm_request_irq() and tasklet_kill().
> >    Fix namespace issue.
> >    Some minor fixes and cleanups.
> > V2 -> V3:
> >    Rename ls1x_dma_filter_fn to ls1x_dma_filter.
> > V1 -> V2:
> >    Change the config from 'DMA_LOONGSON1' to 'LOONGSON1_DMA',
> >    and rearrange it in alphabetical order in Kconfig and Makefile.
> >    Fix comment style.
> >
> > Keguang Zhang (2):
> >   dt-bindings: dma: Add Loongson-1 DMA
> >   dmaengine: Loongson1: Add Loongson1 dmaengine driver
> >
> >  .../bindings/dma/loongson,ls1x-dma.yaml       |  64 +++
> >  drivers/dma/Kconfig                           |   9 +
> >  drivers/dma/Makefile                          |   1 +
> >  drivers/dma/loongson1-dma.c                   | 492 ++++++++++++++++++
> >  4 files changed, 566 insertions(+)
> >  create mode 100644 Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml
> >  create mode 100644 drivers/dma/loongson1-dma.c
> >
> > --
> > 2.39.2
> >
> > base-commit: 719136e5c24768ebdf80b9daa53facebbdd377c3
> > ---
> > Keguang Zhang (2):
> >       dt-bindings: dma: Add Loongson-1 DMA
> >       dmaengine: Loongson1: Add Loongson1 dmaengine driver
> >
> >  .../devicetree/bindings/dma/loongson,ls1x-dma.yaml |  66 ++
> >  drivers/dma/Kconfig                                |   9 +
> >  drivers/dma/Makefile                               |   1 +
> >  drivers/dma/loongson1-dma.c                        | 665 +++++++++++++++++++++
> >  4 files changed, 741 insertions(+)
> > ---
> > base-commit: a1e7655b77e3391b58ac28256789ea45b1685abb
> > change-id: 20231120-loongson1-dma-163afe5708b9
> >
> > Best regards,
> > --
> > Keguang Zhang <keguang.zhang@gmail.com>
> >
> >



-- 
Best regards,

Keguang Zhang

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v6 1/2] dt-bindings: dma: Add Loongson-1 DMA
  2024-03-17 14:40   ` Conor Dooley
@ 2024-03-18  6:18     ` Keguang Zhang
  2024-03-18 11:29       ` Conor Dooley
  2024-03-19  8:28       ` Keguang Zhang
  0 siblings, 2 replies; 18+ messages in thread
From: Keguang Zhang @ 2024-03-18  6:18 UTC (permalink / raw)
  To: Conor Dooley
  Cc: Vinod Koul, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	linux-mips, dmaengine, devicetree, linux-kernel

On Sun, Mar 17, 2024 at 10:40 PM Conor Dooley <conor@kernel.org> wrote:
>
> On Sat, Mar 16, 2024 at 07:33:53PM +0800, Keguang Zhang via B4 Relay wrote:
> > From: Keguang Zhang <keguang.zhang@gmail.com>
> >
> > Add devicetree binding document for Loongson-1 DMA.
> >
> > Signed-off-by: Keguang Zhang <keguang.zhang@gmail.com>
> > ---
> > V5 -> V6:
> >    Change the compatible to the fallback
> >    Some minor fixes
> > V4 -> V5:
> >    A newly added patch
> > ---
> >  .../devicetree/bindings/dma/loongson,ls1x-dma.yaml | 66 ++++++++++++++++++++++
> >  1 file changed, 66 insertions(+)
> >
> > diff --git a/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml b/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml
> > new file mode 100644
> > index 000000000000..06358df725c6
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml
> > @@ -0,0 +1,66 @@
> > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> > +%YAML 1.2
> > +---
> > +$id: http://devicetree.org/schemas/dma/loongson,ls1x-dma.yaml#
> > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > +
> > +title: Loongson-1 DMA Controller
> > +
> > +maintainers:
> > +  - Keguang Zhang <keguang.zhang@gmail.com>
> > +
> > +description:
> > +  Loongson-1 DMA controller provides 3 independent channels for
> > +  peripherals such as NAND and AC97.
> > +
> > +properties:
> > +  compatible:
> > +    oneOf:
> > +      - const: loongson,ls1b-dma
> > +      - items:
> > +          - enum:
> > +              - loongson,ls1c-dma
> > +          - const: loongson,ls1b-dma
>
> Aren't there several more devices in this family? Do they not have DMA
> controllers?
>
You are right. Loongson1 is a SoC family.
However, only 1A/1B/1C have DMA controller.

> > +
> > +  reg:
> > +    maxItems: 1
> > +
> > +  interrupts:
> > +    description: Each channel has a dedicated interrupt line.
> > +    minItems: 1
> > +    maxItems: 3
>
> Is this number not fixed for each SoC?
>
Yes. Actually, it's fixed for the whole family.

> > +  interrupt-names:
> > +    minItems: 1
> > +    items:
> > +      - pattern: ch0
> > +      - pattern: ch1
> > +      - pattern: ch2
>
> Why have you made these a pattern? There's no regex being used here at
> all.
>
Will change items to the following regex.
  interrupt-names:
    minItems: 1
    items:
      - pattern: "^ch[0-2]$"

Thanks!

> Cheers,
> Cono4.



-- 
Best regards,

Keguang Zhang

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v6 0/2] Add support for Loongson1 DMA
  2024-03-18  2:07   ` Keguang Zhang
@ 2024-03-18  7:31     ` Huacai Chen
  2024-03-18 11:28       ` Conor Dooley
  0 siblings, 1 reply; 18+ messages in thread
From: Huacai Chen @ 2024-03-18  7:31 UTC (permalink / raw)
  To: Keguang Zhang
  Cc: Vinod Koul, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	linux-mips, dmaengine, devicetree, linux-kernel

On Mon, Mar 18, 2024 at 10:08 AM Keguang Zhang <keguang.zhang@gmail.com> wrote:
>
> Hi Huacai,
>
> > Hi, Keguang,
> >
> > Sorry for the late reply, there is already a ls2x-apb-dma driver, I'm
> > not sure but can they share the same code base? If not, can rename
> > this driver to ls1x-apb-dma for consistency?
>
> There are some differences between ls1x DMA and ls2x DMA, such as
> registers and DMA descriptors.
> I will rename it to ls1x-apb-dma.
OK, please also rename the yaml file to keep consistency.

Huacai

> Thanks!
>
> >
> > Huacai
> >
> > On Sat, Mar 16, 2024 at 7:34 PM Keguang Zhang via B4 Relay
> > <devnull+keguang.zhang.gmail.com@kernel.org> wrote:
> > >
> > > Add the driver and dt-binding document for Loongson1 DMA.
> > >
> > > Changelog
> > > V5 -> V6:
> > >    Change the compatible to the fallback
> > >    Implement .device_prep_dma_cyclic for Loongson1 sound driver,
> > >    as well as .device_pause and .device_resume.
> > >    Set the limitation LS1X_DMA_MAX_DESC and put all descriptors
> > >    into one page to save memory
> > >    Move dma_pool_zalloc() into ls1x_dma_alloc_desc()
> > >    Drop dma_slave_config structure
> > >    Use .remove_new instead of .remove
> > >    Use KBUILD_MODNAME for the driver name
> > >    Improve the debug information
> > >    Some minor fixes
> > > V4 -> V5:
> > >    Add the dt-binding document
> > >    Add DT support
> > >    Use DT information instead of platform data
> > >    Use chan_id of struct dma_chan instead of own id
> > >    Use of_dma_xlate_by_chan_id() instead of ls1x_dma_filter()
> > >    Update the author information to my official name
> > > V3 -> V4:
> > >    Use dma_slave_map to find the proper channel.
> > >    Explicitly call devm_request_irq() and tasklet_kill().
> > >    Fix namespace issue.
> > >    Some minor fixes and cleanups.
> > > V2 -> V3:
> > >    Rename ls1x_dma_filter_fn to ls1x_dma_filter.
> > > V1 -> V2:
> > >    Change the config from 'DMA_LOONGSON1' to 'LOONGSON1_DMA',
> > >    and rearrange it in alphabetical order in Kconfig and Makefile.
> > >    Fix comment style.
> > >
> > > Keguang Zhang (2):
> > >   dt-bindings: dma: Add Loongson-1 DMA
> > >   dmaengine: Loongson1: Add Loongson1 dmaengine driver
> > >
> > >  .../bindings/dma/loongson,ls1x-dma.yaml       |  64 +++
> > >  drivers/dma/Kconfig                           |   9 +
> > >  drivers/dma/Makefile                          |   1 +
> > >  drivers/dma/loongson1-dma.c                   | 492 ++++++++++++++++++
> > >  4 files changed, 566 insertions(+)
> > >  create mode 100644 Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml
> > >  create mode 100644 drivers/dma/loongson1-dma.c
> > >
> > > --
> > > 2.39.2
> > >
> > > base-commit: 719136e5c24768ebdf80b9daa53facebbdd377c3
> > > ---
> > > Keguang Zhang (2):
> > >       dt-bindings: dma: Add Loongson-1 DMA
> > >       dmaengine: Loongson1: Add Loongson1 dmaengine driver
> > >
> > >  .../devicetree/bindings/dma/loongson,ls1x-dma.yaml |  66 ++
> > >  drivers/dma/Kconfig                                |   9 +
> > >  drivers/dma/Makefile                               |   1 +
> > >  drivers/dma/loongson1-dma.c                        | 665 +++++++++++++++++++++
> > >  4 files changed, 741 insertions(+)
> > > ---
> > > base-commit: a1e7655b77e3391b58ac28256789ea45b1685abb
> > > change-id: 20231120-loongson1-dma-163afe5708b9
> > >
> > > Best regards,
> > > --
> > > Keguang Zhang <keguang.zhang@gmail.com>
> > >
> > >
>
>
>
> --
> Best regards,
>
> Keguang Zhang

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v6 0/2] Add support for Loongson1 DMA
  2024-03-18  7:31     ` Huacai Chen
@ 2024-03-18 11:28       ` Conor Dooley
  2024-03-18 14:26         ` Huacai Chen
  0 siblings, 1 reply; 18+ messages in thread
From: Conor Dooley @ 2024-03-18 11:28 UTC (permalink / raw)
  To: Huacai Chen
  Cc: Keguang Zhang, Vinod Koul, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, linux-mips, dmaengine, devicetree, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 688 bytes --]

On Mon, Mar 18, 2024 at 03:31:59PM +0800, Huacai Chen wrote:
> On Mon, Mar 18, 2024 at 10:08 AM Keguang Zhang <keguang.zhang@gmail.com> wrote:
> >
> > Hi Huacai,
> >
> > > Hi, Keguang,
> > >
> > > Sorry for the late reply, there is already a ls2x-apb-dma driver, I'm
> > > not sure but can they share the same code base? If not, can rename
> > > this driver to ls1x-apb-dma for consistency?
> >
> > There are some differences between ls1x DMA and ls2x DMA, such as
> > registers and DMA descriptors.
> > I will rename it to ls1x-apb-dma.
> OK, please also rename the yaml file to keep consistency.

No, the yaml file needs to match the (one of the) compatible strings.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v6 1/2] dt-bindings: dma: Add Loongson-1 DMA
  2024-03-18  6:18     ` Keguang Zhang
@ 2024-03-18 11:29       ` Conor Dooley
  2024-03-19  2:16         ` Keguang Zhang
  2024-03-19  8:28       ` Keguang Zhang
  1 sibling, 1 reply; 18+ messages in thread
From: Conor Dooley @ 2024-03-18 11:29 UTC (permalink / raw)
  To: Keguang Zhang
  Cc: Vinod Koul, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	linux-mips, dmaengine, devicetree, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 2864 bytes --]

On Mon, Mar 18, 2024 at 02:18:27PM +0800, Keguang Zhang wrote:
> On Sun, Mar 17, 2024 at 10:40 PM Conor Dooley <conor@kernel.org> wrote:
> >
> > On Sat, Mar 16, 2024 at 07:33:53PM +0800, Keguang Zhang via B4 Relay wrote:
> > > From: Keguang Zhang <keguang.zhang@gmail.com>
> > >
> > > Add devicetree binding document for Loongson-1 DMA.
> > >
> > > Signed-off-by: Keguang Zhang <keguang.zhang@gmail.com>
> > > ---
> > > V5 -> V6:
> > >    Change the compatible to the fallback
> > >    Some minor fixes
> > > V4 -> V5:
> > >    A newly added patch
> > > ---
> > >  .../devicetree/bindings/dma/loongson,ls1x-dma.yaml | 66 ++++++++++++++++++++++
> > >  1 file changed, 66 insertions(+)
> > >
> > > diff --git a/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml b/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml
> > > new file mode 100644
> > > index 000000000000..06358df725c6
> > > --- /dev/null
> > > +++ b/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml
> > > @@ -0,0 +1,66 @@
> > > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> > > +%YAML 1.2
> > > +---
> > > +$id: http://devicetree.org/schemas/dma/loongson,ls1x-dma.yaml#
> > > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > > +
> > > +title: Loongson-1 DMA Controller
> > > +
> > > +maintainers:
> > > +  - Keguang Zhang <keguang.zhang@gmail.com>
> > > +
> > > +description:
> > > +  Loongson-1 DMA controller provides 3 independent channels for
> > > +  peripherals such as NAND and AC97.
> > > +
> > > +properties:
> > > +  compatible:
> > > +    oneOf:
> > > +      - const: loongson,ls1b-dma
> > > +      - items:
> > > +          - enum:
> > > +              - loongson,ls1c-dma
> > > +          - const: loongson,ls1b-dma
> >
> > Aren't there several more devices in this family? Do they not have DMA
> > controllers?
> >
> You are right. Loongson1 is a SoC family.
> However, only 1A/1B/1C have DMA controller.

You're missing the 1A then.

> 
> > > +
> > > +  reg:
> > > +    maxItems: 1
> > > +
> > > +  interrupts:
> > > +    description: Each channel has a dedicated interrupt line.
> > > +    minItems: 1
> > > +    maxItems: 3
> >
> > Is this number not fixed for each SoC?
> >
> Yes. Actually, it's fixed for the whole family.

Then why do you have minItems: 1? Are there multiple DMA controllers
on each SoC that only make use of a subset of the possible channels?

> > > +  interrupt-names:
> > > +    minItems: 1
> > > +    items:
> > > +      - pattern: ch0
> > > +      - pattern: ch1
> > > +      - pattern: ch2
> >
> > Why have you made these a pattern? There's no regex being used here at
> > all.
> >
> Will change items to the following regex.
>   interrupt-names:
>     minItems: 1
>     items:
>       - pattern: "^ch[0-2]$"


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v6 0/2] Add support for Loongson1 DMA
  2024-03-18 11:28       ` Conor Dooley
@ 2024-03-18 14:26         ` Huacai Chen
  2024-03-18 15:42           ` Conor Dooley
  0 siblings, 1 reply; 18+ messages in thread
From: Huacai Chen @ 2024-03-18 14:26 UTC (permalink / raw)
  To: Conor Dooley
  Cc: Keguang Zhang, Vinod Koul, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, linux-mips, dmaengine, devicetree, linux-kernel

Hi, Conor,

On Mon, Mar 18, 2024 at 7:28 PM Conor Dooley <conor@kernel.org> wrote:
>
> On Mon, Mar 18, 2024 at 03:31:59PM +0800, Huacai Chen wrote:
> > On Mon, Mar 18, 2024 at 10:08 AM Keguang Zhang <keguang.zhang@gmail.com> wrote:
> > >
> > > Hi Huacai,
> > >
> > > > Hi, Keguang,
> > > >
> > > > Sorry for the late reply, there is already a ls2x-apb-dma driver, I'm
> > > > not sure but can they share the same code base? If not, can rename
> > > > this driver to ls1x-apb-dma for consistency?
> > >
> > > There are some differences between ls1x DMA and ls2x DMA, such as
> > > registers and DMA descriptors.
> > > I will rename it to ls1x-apb-dma.
> > OK, please also rename the yaml file to keep consistency.
>
> No, the yaml file needs to match the (one of the) compatible strings.
OK, then I think we can also rename the compatible strings, if possible.

Huacai

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v6 0/2] Add support for Loongson1 DMA
  2024-03-18 14:26         ` Huacai Chen
@ 2024-03-18 15:42           ` Conor Dooley
  2024-03-19  2:32             ` Keguang Zhang
  0 siblings, 1 reply; 18+ messages in thread
From: Conor Dooley @ 2024-03-18 15:42 UTC (permalink / raw)
  To: Huacai Chen
  Cc: Keguang Zhang, Vinod Koul, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, linux-mips, dmaengine, devicetree, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1174 bytes --]

On Mon, Mar 18, 2024 at 10:26:51PM +0800, Huacai Chen wrote:
> Hi, Conor,
> 
> On Mon, Mar 18, 2024 at 7:28 PM Conor Dooley <conor@kernel.org> wrote:
> >
> > On Mon, Mar 18, 2024 at 03:31:59PM +0800, Huacai Chen wrote:
> > > On Mon, Mar 18, 2024 at 10:08 AM Keguang Zhang <keguang.zhang@gmail.com> wrote:
> > > >
> > > > Hi Huacai,
> > > >
> > > > > Hi, Keguang,
> > > > >
> > > > > Sorry for the late reply, there is already a ls2x-apb-dma driver, I'm
> > > > > not sure but can they share the same code base? If not, can rename
> > > > > this driver to ls1x-apb-dma for consistency?
> > > >
> > > > There are some differences between ls1x DMA and ls2x DMA, such as
> > > > registers and DMA descriptors.
> > > > I will rename it to ls1x-apb-dma.
> > > OK, please also rename the yaml file to keep consistency.
> >
> > No, the yaml file needs to match the (one of the) compatible strings.
> OK, then I think we can also rename the compatible strings, if possible.

If there are no other types of dma controller on this device, I do not
see why would we add "apb" into the compatible as there is nothing to
differentiate this controller from.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v6 1/2] dt-bindings: dma: Add Loongson-1 DMA
  2024-03-18 11:29       ` Conor Dooley
@ 2024-03-19  2:16         ` Keguang Zhang
  0 siblings, 0 replies; 18+ messages in thread
From: Keguang Zhang @ 2024-03-19  2:16 UTC (permalink / raw)
  To: Conor Dooley
  Cc: Vinod Koul, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	linux-mips, dmaengine, devicetree, linux-kernel

On Mon, Mar 18, 2024 at 7:29 PM Conor Dooley <conor@kernel.org> wrote:
>
> On Mon, Mar 18, 2024 at 02:18:27PM +0800, Keguang Zhang wrote:
> > On Sun, Mar 17, 2024 at 10:40 PM Conor Dooley <conor@kernel.org> wrote:
> > >
> > > On Sat, Mar 16, 2024 at 07:33:53PM +0800, Keguang Zhang via B4 Relay wrote:
> > > > From: Keguang Zhang <keguang.zhang@gmail.com>
> > > >
> > > > Add devicetree binding document for Loongson-1 DMA.
> > > >
> > > > Signed-off-by: Keguang Zhang <keguang.zhang@gmail.com>
> > > > ---
> > > > V5 -> V6:
> > > >    Change the compatible to the fallback
> > > >    Some minor fixes
> > > > V4 -> V5:
> > > >    A newly added patch
> > > > ---
> > > >  .../devicetree/bindings/dma/loongson,ls1x-dma.yaml | 66 ++++++++++++++++++++++
> > > >  1 file changed, 66 insertions(+)
> > > >
> > > > diff --git a/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml b/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml
> > > > new file mode 100644
> > > > index 000000000000..06358df725c6
> > > > --- /dev/null
> > > > +++ b/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml
> > > > @@ -0,0 +1,66 @@
> > > > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> > > > +%YAML 1.2
> > > > +---
> > > > +$id: http://devicetree.org/schemas/dma/loongson,ls1x-dma.yaml#
> > > > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > > > +
> > > > +title: Loongson-1 DMA Controller
> > > > +
> > > > +maintainers:
> > > > +  - Keguang Zhang <keguang.zhang@gmail.com>
> > > > +
> > > > +description:
> > > > +  Loongson-1 DMA controller provides 3 independent channels for
> > > > +  peripherals such as NAND and AC97.
> > > > +
> > > > +properties:
> > > > +  compatible:
> > > > +    oneOf:
> > > > +      - const: loongson,ls1b-dma
> > > > +      - items:
> > > > +          - enum:
> > > > +              - loongson,ls1c-dma
> > > > +          - const: loongson,ls1b-dma
> > >
> > > Aren't there several more devices in this family? Do they not have DMA
> > > controllers?
> > >
> > You are right. Loongson1 is a SoC family.
> > However, only 1A/1B/1C have DMA controller.
>
> You're missing the 1A then.
>
Will add 1A.

> >
> > > > +
> > > > +  reg:
> > > > +    maxItems: 1
> > > > +
> > > > +  interrupts:
> > > > +    description: Each channel has a dedicated interrupt line.
> > > > +    minItems: 1
> > > > +    maxItems: 3
> > >
> > > Is this number not fixed for each SoC?
> > >
> > Yes. Actually, it's fixed for the whole family.
>
> Then why do you have minItems: 1? Are there multiple DMA controllers
> on each SoC that only make use of a subset of the possible channels?
>
All channels are available on each SoC.
Sorry, I will remove the minItems.

Thanks for your review!

> > > > +  interrupt-names:
> > > > +    minItems: 1
> > > > +    items:
> > > > +      - pattern: ch0
> > > > +      - pattern: ch1
> > > > +      - pattern: ch2
> > >
> > > Why have you made these a pattern? There's no regex being used here at
> > > all.
> > >
> > Will change items to the following regex.
> >   interrupt-names:
> >     minItems: 1
> >     items:
> >       - pattern: "^ch[0-2]$"
>


-- 
Best regards,

Keguang Zhang

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v6 0/2] Add support for Loongson1 DMA
  2024-03-18 15:42           ` Conor Dooley
@ 2024-03-19  2:32             ` Keguang Zhang
  2024-03-19  2:40               ` Huacai Chen
  0 siblings, 1 reply; 18+ messages in thread
From: Keguang Zhang @ 2024-03-19  2:32 UTC (permalink / raw)
  To: Conor Dooley
  Cc: Huacai Chen, Vinod Koul, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, linux-mips, dmaengine, devicetree, linux-kernel

On Mon, Mar 18, 2024 at 11:42 PM Conor Dooley <conor@kernel.org> wrote:
>
> On Mon, Mar 18, 2024 at 10:26:51PM +0800, Huacai Chen wrote:
> > Hi, Conor,
> >
> > On Mon, Mar 18, 2024 at 7:28 PM Conor Dooley <conor@kernel.org> wrote:
> > >
> > > On Mon, Mar 18, 2024 at 03:31:59PM +0800, Huacai Chen wrote:
> > > > On Mon, Mar 18, 2024 at 10:08 AM Keguang Zhang <keguang.zhang@gmail.com> wrote:
> > > > >
> > > > > Hi Huacai,
> > > > >
> > > > > > Hi, Keguang,
> > > > > >
> > > > > > Sorry for the late reply, there is already a ls2x-apb-dma driver, I'm
> > > > > > not sure but can they share the same code base? If not, can rename
> > > > > > this driver to ls1x-apb-dma for consistency?
> > > > >
> > > > > There are some differences between ls1x DMA and ls2x DMA, such as
> > > > > registers and DMA descriptors.
> > > > > I will rename it to ls1x-apb-dma.
> > > > OK, please also rename the yaml file to keep consistency.
> > >
> > > No, the yaml file needs to match the (one of the) compatible strings.
> > OK, then I think we can also rename the compatible strings, if possible.
>
> If there are no other types of dma controller on this device, I do not
> see why would we add "apb" into the compatible as there is nothing to
> differentiate this controller from.

That's true. 1A/1B/1C only have one APB DMA.
Should I keep the compatible "ls1b-dma" and "ls1c-dma"?

-- 
Best regards,

Keguang Zhang

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v6 0/2] Add support for Loongson1 DMA
  2024-03-19  2:32             ` Keguang Zhang
@ 2024-03-19  2:40               ` Huacai Chen
  2024-03-19 17:40                 ` Conor Dooley
  0 siblings, 1 reply; 18+ messages in thread
From: Huacai Chen @ 2024-03-19  2:40 UTC (permalink / raw)
  To: Keguang Zhang
  Cc: Conor Dooley, Vinod Koul, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, linux-mips, dmaengine, devicetree, linux-kernel

On Tue, Mar 19, 2024 at 10:32 AM Keguang Zhang <keguang.zhang@gmail.com> wrote:
>
> On Mon, Mar 18, 2024 at 11:42 PM Conor Dooley <conor@kernel.org> wrote:
> >
> > On Mon, Mar 18, 2024 at 10:26:51PM +0800, Huacai Chen wrote:
> > > Hi, Conor,
> > >
> > > On Mon, Mar 18, 2024 at 7:28 PM Conor Dooley <conor@kernel.org> wrote:
> > > >
> > > > On Mon, Mar 18, 2024 at 03:31:59PM +0800, Huacai Chen wrote:
> > > > > On Mon, Mar 18, 2024 at 10:08 AM Keguang Zhang <keguang.zhang@gmail.com> wrote:
> > > > > >
> > > > > > Hi Huacai,
> > > > > >
> > > > > > > Hi, Keguang,
> > > > > > >
> > > > > > > Sorry for the late reply, there is already a ls2x-apb-dma driver, I'm
> > > > > > > not sure but can they share the same code base? If not, can rename
> > > > > > > this driver to ls1x-apb-dma for consistency?
> > > > > >
> > > > > > There are some differences between ls1x DMA and ls2x DMA, such as
> > > > > > registers and DMA descriptors.
> > > > > > I will rename it to ls1x-apb-dma.
> > > > > OK, please also rename the yaml file to keep consistency.
> > > >
> > > > No, the yaml file needs to match the (one of the) compatible strings.
> > > OK, then I think we can also rename the compatible strings, if possible.
> >
> > If there are no other types of dma controller on this device, I do not
> > see why would we add "apb" into the compatible as there is nothing to
> > differentiate this controller from.
>
> That's true. 1A/1B/1C only have one APB DMA.
> Should I keep the compatible "ls1b-dma" and "ls1c-dma"?
The name "apbdma" comes from the user manual, "exchange data between
memory and apb devices", at present there are two drivers using this
naming: tegra20-apb-dma.c and ls2x-apb-dma.c.

Huacai

>
> --
> Best regards,
>
> Keguang Zhang

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v6 1/2] dt-bindings: dma: Add Loongson-1 DMA
  2024-03-18  6:18     ` Keguang Zhang
  2024-03-18 11:29       ` Conor Dooley
@ 2024-03-19  8:28       ` Keguang Zhang
  1 sibling, 0 replies; 18+ messages in thread
From: Keguang Zhang @ 2024-03-19  8:28 UTC (permalink / raw)
  To: Conor Dooley
  Cc: Vinod Koul, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	linux-mips, dmaengine, devicetree, linux-kernel

On Mon, Mar 18, 2024 at 2:18 PM Keguang Zhang <keguang.zhang@gmail.com> wrote:
>
> On Sun, Mar 17, 2024 at 10:40 PM Conor Dooley <conor@kernel.org> wrote:
> >
> > On Sat, Mar 16, 2024 at 07:33:53PM +0800, Keguang Zhang via B4 Relay wrote:
> > > From: Keguang Zhang <keguang.zhang@gmail.com>
> > >
> > > Add devicetree binding document for Loongson-1 DMA.
> > >
> > > Signed-off-by: Keguang Zhang <keguang.zhang@gmail.com>
> > > ---
> > > V5 -> V6:
> > >    Change the compatible to the fallback
> > >    Some minor fixes
> > > V4 -> V5:
> > >    A newly added patch
> > > ---
> > >  .../devicetree/bindings/dma/loongson,ls1x-dma.yaml | 66 ++++++++++++++++++++++
> > >  1 file changed, 66 insertions(+)
> > >
> > > diff --git a/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml b/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml
> > > new file mode 100644
> > > index 000000000000..06358df725c6
> > > --- /dev/null
> > > +++ b/Documentation/devicetree/bindings/dma/loongson,ls1x-dma.yaml
> > > @@ -0,0 +1,66 @@
> > > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> > > +%YAML 1.2
> > > +---
> > > +$id: http://devicetree.org/schemas/dma/loongson,ls1x-dma.yaml#
> > > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > > +
> > > +title: Loongson-1 DMA Controller
> > > +
> > > +maintainers:
> > > +  - Keguang Zhang <keguang.zhang@gmail.com>
> > > +
> > > +description:
> > > +  Loongson-1 DMA controller provides 3 independent channels for
> > > +  peripherals such as NAND and AC97.
> > > +
> > > +properties:
> > > +  compatible:
> > > +    oneOf:
> > > +      - const: loongson,ls1b-dma
> > > +      - items:
> > > +          - enum:
> > > +              - loongson,ls1c-dma
> > > +          - const: loongson,ls1b-dma
> >
> > Aren't there several more devices in this family? Do they not have DMA
> > controllers?
> >
> You are right. Loongson1 is a SoC family.
> However, only 1A/1B/1C have DMA controller.
>
> > > +
> > > +  reg:
> > > +    maxItems: 1
> > > +
> > > +  interrupts:
> > > +    description: Each channel has a dedicated interrupt line.
> > > +    minItems: 1
> > > +    maxItems: 3
> >
> > Is this number not fixed for each SoC?
> >
> Yes. Actually, it's fixed for the whole family.
>
> > > +  interrupt-names:
> > > +    minItems: 1
> > > +    items:
> > > +      - pattern: ch0
> > > +      - pattern: ch1
> > > +      - pattern: ch2
> >
> > Why have you made these a pattern? There's no regex being used here at
> > all.
> >
> Will change items to the following regex.
>   interrupt-names:
>     minItems: 1
>     items:
>       - pattern: "^ch[0-2]$"
>
Sorry. This pattern fails in dt_binding_check.
Will use const instead of pattern.
  interrupt-names:
   items:
     - const: ch0
     - const: ch1
     - const: ch2


> Thanks!
>
> > Cheers,
> > Cono4.
>
>
>
> --
> Best regards,
>
> Keguang Zhang



--
Best regards,

Keguang Zhang

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v6 0/2] Add support for Loongson1 DMA
  2024-03-19  2:40               ` Huacai Chen
@ 2024-03-19 17:40                 ` Conor Dooley
  2024-03-20  2:27                   ` Keguang Zhang
  0 siblings, 1 reply; 18+ messages in thread
From: Conor Dooley @ 2024-03-19 17:40 UTC (permalink / raw)
  To: Huacai Chen
  Cc: Keguang Zhang, Vinod Koul, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, linux-mips, dmaengine, devicetree, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1940 bytes --]

On Tue, Mar 19, 2024 at 10:40:54AM +0800, Huacai Chen wrote:
> On Tue, Mar 19, 2024 at 10:32 AM Keguang Zhang <keguang.zhang@gmail.com> wrote:
> >
> > On Mon, Mar 18, 2024 at 11:42 PM Conor Dooley <conor@kernel.org> wrote:
> > >
> > > On Mon, Mar 18, 2024 at 10:26:51PM +0800, Huacai Chen wrote:
> > > > Hi, Conor,
> > > >
> > > > On Mon, Mar 18, 2024 at 7:28 PM Conor Dooley <conor@kernel.org> wrote:
> > > > >
> > > > > On Mon, Mar 18, 2024 at 03:31:59PM +0800, Huacai Chen wrote:
> > > > > > On Mon, Mar 18, 2024 at 10:08 AM Keguang Zhang <keguang.zhang@gmail.com> wrote:
> > > > > > >
> > > > > > > Hi Huacai,
> > > > > > >
> > > > > > > > Hi, Keguang,
> > > > > > > >
> > > > > > > > Sorry for the late reply, there is already a ls2x-apb-dma driver, I'm
> > > > > > > > not sure but can they share the same code base? If not, can rename
> > > > > > > > this driver to ls1x-apb-dma for consistency?
> > > > > > >
> > > > > > > There are some differences between ls1x DMA and ls2x DMA, such as
> > > > > > > registers and DMA descriptors.
> > > > > > > I will rename it to ls1x-apb-dma.
> > > > > > OK, please also rename the yaml file to keep consistency.
> > > > >
> > > > > No, the yaml file needs to match the (one of the) compatible strings.
> > > > OK, then I think we can also rename the compatible strings, if possible.
> > >
> > > If there are no other types of dma controller on this device, I do not
> > > see why would we add "apb" into the compatible as there is nothing to
> > > differentiate this controller from.
> >
> > That's true. 1A/1B/1C only have one APB DMA.
> > Should I keep the compatible "ls1b-dma" and "ls1c-dma"?
> The name "apbdma" comes from the user manual, "exchange data between
> memory and apb devices", at present there are two drivers using this
> naming: tegra20-apb-dma.c and ls2x-apb-dma.c.

I think it's unnessesary but I won't stand in your way.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v6 0/2] Add support for Loongson1 DMA
  2024-03-19 17:40                 ` Conor Dooley
@ 2024-03-20  2:27                   ` Keguang Zhang
  0 siblings, 0 replies; 18+ messages in thread
From: Keguang Zhang @ 2024-03-20  2:27 UTC (permalink / raw)
  To: Conor Dooley
  Cc: Huacai Chen, Vinod Koul, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, linux-mips, dmaengine, devicetree, linux-kernel

On Wed, Mar 20, 2024 at 1:41 AM Conor Dooley <conor@kernel.org> wrote:
>
> On Tue, Mar 19, 2024 at 10:40:54AM +0800, Huacai Chen wrote:
> > On Tue, Mar 19, 2024 at 10:32 AM Keguang Zhang <keguang.zhang@gmail.com> wrote:
> > >
> > > On Mon, Mar 18, 2024 at 11:42 PM Conor Dooley <conor@kernel.org> wrote:
> > > >
> > > > On Mon, Mar 18, 2024 at 10:26:51PM +0800, Huacai Chen wrote:
> > > > > Hi, Conor,
> > > > >
> > > > > On Mon, Mar 18, 2024 at 7:28 PM Conor Dooley <conor@kernel.org> wrote:
> > > > > >
> > > > > > On Mon, Mar 18, 2024 at 03:31:59PM +0800, Huacai Chen wrote:
> > > > > > > On Mon, Mar 18, 2024 at 10:08 AM Keguang Zhang <keguang.zhang@gmail.com> wrote:
> > > > > > > >
> > > > > > > > Hi Huacai,
> > > > > > > >
> > > > > > > > > Hi, Keguang,
> > > > > > > > >
> > > > > > > > > Sorry for the late reply, there is already a ls2x-apb-dma driver, I'm
> > > > > > > > > not sure but can they share the same code base? If not, can rename
> > > > > > > > > this driver to ls1x-apb-dma for consistency?
> > > > > > > >
> > > > > > > > There are some differences between ls1x DMA and ls2x DMA, such as
> > > > > > > > registers and DMA descriptors.
> > > > > > > > I will rename it to ls1x-apb-dma.
> > > > > > > OK, please also rename the yaml file to keep consistency.
> > > > > >
> > > > > > No, the yaml file needs to match the (one of the) compatible strings.
> > > > > OK, then I think we can also rename the compatible strings, if possible.
> > > >
> > > > If there are no other types of dma controller on this device, I do not
> > > > see why would we add "apb" into the compatible as there is nothing to
> > > > differentiate this controller from.
> > >
> > > That's true. 1A/1B/1C only have one APB DMA.
> > > Should I keep the compatible "ls1b-dma" and "ls1c-dma"?
> > The name "apbdma" comes from the user manual, "exchange data between
> > memory and apb devices", at present there are two drivers using this
> > naming: tegra20-apb-dma.c and ls2x-apb-dma.c.
>
> I think it's unnessesary but I won't stand in your way.

Then I will follow Huacai's suggestion.
Thanks for your review, Conor and Huacai.

-- 
Best regards,

Keguang Zhang

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2024-03-20  2:27 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-16 11:33 [PATCH v6 0/2] Add support for Loongson1 DMA Keguang Zhang via B4 Relay
2024-03-16 11:33 ` [PATCH v6 1/2] dt-bindings: dma: Add Loongson-1 DMA Keguang Zhang via B4 Relay
2024-03-17 14:40   ` Conor Dooley
2024-03-18  6:18     ` Keguang Zhang
2024-03-18 11:29       ` Conor Dooley
2024-03-19  2:16         ` Keguang Zhang
2024-03-19  8:28       ` Keguang Zhang
2024-03-16 11:33 ` [PATCH v6 2/2] dmaengine: Loongson1: Add Loongson1 dmaengine driver Keguang Zhang via B4 Relay
2024-03-16 14:04 ` [PATCH v6 0/2] Add support for Loongson1 DMA Huacai Chen
2024-03-18  2:07   ` Keguang Zhang
2024-03-18  7:31     ` Huacai Chen
2024-03-18 11:28       ` Conor Dooley
2024-03-18 14:26         ` Huacai Chen
2024-03-18 15:42           ` Conor Dooley
2024-03-19  2:32             ` Keguang Zhang
2024-03-19  2:40               ` Huacai Chen
2024-03-19 17:40                 ` Conor Dooley
2024-03-20  2:27                   ` Keguang Zhang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).