Skip to contentSkip to conversation

Add Intel LGM soc DMA support

PATCH Superseded Amireddy Mallikarjuna reddy 2 participants 5 messages Jun 23, 2020 – Jun 24, 2020

Subsystems (2)

v3 of 11 Superseded Latest is v11 →

lore
Share & tools
lore
#0 lore raw

v3 cover Add Intel LGM soc DMA support

Add DMA controller driver for Lightning Mountain(LGM) family of SoCs.

The main function of the DMA controller is the transfer of data from/to any DPlus compliant peripheral to/from the memory. A memory to memory copy capability can also be configured.
This ldma driver is used for configure the device and channnels for data and control paths.

These controllers provide DMA capabilities for a variety of on-chip devices such as SSC, HSNAND and GSWIP.

-------------
Future Plans:
-------------
LGM SOC also supports Hardware Memory Copy engine.
The role of the HW Memory copy engine is to offload memory copy operations from the CPU.

Amireddy Mallikarjuna reddy (2):
dt-bindings: dma: Add bindings for intel LGM SOC Add Intel LGM soc DMA support.

 .../devicetree/bindings/dma/intel,ldma.yaml        |  428 +++++
 drivers/dma/Kconfig                                |    2 +
 drivers/dma/Makefile                               |    1 +
 drivers/dma/lgm/Kconfig                            |    9 +
 drivers/dma/lgm/Makefile                           |    2 +
 drivers/dma/lgm/lgm-dma.c                          | 1956 ++++++++++++++++++++
 include/linux/dma/lgm_dma.h                        |   27 +
 7 files changed, 2425 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/dma/intel,ldma.yaml
 create mode 100644 drivers/dma/lgm/Kconfig
 create mode 100644 drivers/dma/lgm/Makefile
 create mode 100644 drivers/dma/lgm/lgm-dma.c
 create mode 100644 include/linux/dma/lgm_dma.h
Signature · 1 line
2.11.0
#1 lore raw

PATCH v3 1/2 dt-bindings: dma: Add bindings for intel LGM SOC

Add DT bindings YAML schema for DMA controller driver of Lightning Mountain(LGM) SoC.

---
v1:
- Initial version.

v2:
- Fix bot errors.

v3:
- No change.

---
 .../devicetree/bindings/dma/intel,ldma.yaml        | 428 +++++++++++++++++++++
 1 file changed, 428 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/dma/intel,ldma.yaml
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +428 -0
new file mode 100644
index 000000000000..d474c3e47126
@@ -0,0 +1,428 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/dma/intel,ldma.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Lightning Mountain centralized low speed DMA and high speed DMA controllers.
+
+maintainers:
+  - [email protected]
+  - [email protected]
+
+properties:
+ $nodename:
+   pattern: "^dma(@.*)?$"
+
+ "#dma-cells":
+   const: 1
+
+ compatible:
+  anyOf:
+   - const: intel,lgm-cdma
+   - const: intel,lgm-dma2tx
+   - const: intel,lgm-dma1rx
+   - const: intel,lgm-dma1tx
+   - const: intel,lgm-dma0tx
+   - const: intel,lgm-dma3
+   - const: intel,lgm-toe_dma30
+   - const: intel,lgm-toe_dma31
+
+ reg:
+  maxItems: 1
+
+ clocks:
+  maxItems: 1
+
+ resets:
+  maxItems: 1
+
+ interrupts:
+  maxItems: 1
+
+ intel,dma-poll-cnt:
+   $ref: /schemas/types.yaml#definitions/uint32
+   description:
+     DMA descriptor polling counter. It may need fine tune according
+     to the system application scenario.
+
+ intel,dma-byte-en:
+   type: boolean
+   description:
+     DMA byte enable is only valid for DMA write(RX).
+     Byte enable(1) means DMA write will be based on the number of dwords
+     instead of the whole burst.
+
+ intel,dma-drb:
+    type: boolean
+    description:
+      DMA descriptor read back to make sure data and desc synchronization.
+
+ intel,dma-burst:
+    $ref: /schemas/types.yaml#definitions/uint32
+    description:
+       Specifiy the DMA burst size(in dwords), the valid value will be 8, 16, 32.
+       Default is 16 for data path dma, 32 is for memcopy DMA.
+
+ intel,dma-polling-cnt:
+    $ref: /schemas/types.yaml#definitions/uint32
+    description:
+       DMA descriptor polling counter. It may need fine tune according to
+       the system application scenario.
+
+ intel,dma-desc-in-sram:
+    type: boolean
+    description:
+       DMA descritpors in SRAM or not. Some old controllers descriptors
+       can be in DRAM or SRAM. The new ones are all in SRAM.
+
+ intel,dma-orrc:
+    $ref: /schemas/types.yaml#definitions/uint32
+    description:
+       DMA outstanding read counter. The maximum value is 16, and it may
+       need fine tune according to the system application scenarios.
+
+ intel,dma-txendi:
+    $ref: /schemas/types.yaml#definitions/uint32
+    description:
+       DMA TX endianness conversion due to SoC endianness difference.
+
+ intel,dma-rxendi:
+    $ref: /schemas/types.yaml#definitions/uint32
+    description:
+       DMA RX endianness conversion due to SoC endianness difference.
+
+ intel,dma-dburst-wr:
+    type: boolean
+    description:
+       Enable RX dynamic burst write. It only applies to RX DMA and memcopy DMA.
+
+
+ dma-ports:
+    type: object
+    description:
+       This sub-node must contain a sub-node for each DMA port.
+    properties:
+      '#address-cells':
+        const: 1
+      '#size-cells':
+        const: 0
+
+    patternProperties:
+      "^dma-ports@[0-9]+$":
+          type: object
+
+          properties:
+            reg:
+              items:
+                - enum: [0, 1, 2, 3, 4, 5]
+              description:
+                 Which port this node refers to.
+
+            intel,port-name:
+              $ref: /schemas/types.yaml#definitions/string-array
+              description:
+                 Port name of each DMA port.
+
+            intel,port-chans:
+              $ref: /schemas/types.yaml#/definitions/uint32-array
+              description:
+                 The channels included on this port. Format is channel start
+                 number and how many channels on this port.
+
+            intel,port-burst:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Specify the DMA port burst size, the valid value will be
+                 2, 4, 8. Default is 2 for data path dma.
+
+            intel,port-txwgt:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Specify the port transmit weight for QoS purpose. The valid
+                 value is 1~7. Default value is 1.
+
+            intel,port-endian:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Specify the DMA port endiannes conversion due to SoC endianness difference.
+
+          required:
+            - reg
+            - intel,port-name
+            - intel,port-chans
+
+
+ dma-channels:
+    type: object
+    description:
+       This sub-node must contain a sub-node for each DMA channel.
+    properties:
+      '#address-cells':
+        const: 1
+      '#size-cells':
+        const: 0
+
+    patternProperties:
+      "^dma-channels@[0-9]+$":
+          type: object
+
+          properties:
+            reg:
+              items:
+                - enum: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
+              description:
+                 Which channel this node refers to.
+
+            intel,chan-desc_num:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel maximum descriptor number. The max value is 255.
+
+            intel,chan-pkt_sz:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Channel buffer packet size. It must be power of 2.
+                 The maximum size is 4096.
+
+            intel,chan-desc-rx-nonpost:
+              type: boolean
+              description:
+                 Write non-posted type for DMA RX last data beat of every descriptor.
+
+            intel,chan-data-endian:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel data endianness configuration according to SoC requirement.
+
+            intel,chan-desc-endian:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel descriptor endianness configuration according to SoC requirement.
+
+            intel,chan-data-endian-en:
+              type: boolean
+              description:
+                 Per channel data endianness enabled.
+
+            intel,chan-desc-endian-en:
+              type: boolean
+              description:
+                 Per channel descriptor endianness enabled.
+
+            intel,chan-byte-offset:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel byte offset(0~128).
+
+            intel,chan-hdr-mode:
+              $ref: /schemas/types.yaml#/definitions/uint32-array
+              description:
+                 The first parameter is header mode size, the second
+                 parameter is checksum enable or disable. If enabled,
+                 header mode size is ignored. If disabled, header mode
+                 size must be provided.
+
+            intel,chan-non-arb-cnt:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel non arbitration counter while polling
+
+            intel,chan-arb-cnt:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel arbitration counter while polling.
+                 arb_cnt must be greater than non_arb_cnt
+
+            intel,chan-pkt-drop:
+              type: boolean
+              description:
+                 Channel packet drop enabled or disabled.
+
+            intel,chan-hw-desc:
+              $ref: /schemas/types.yaml#/definitions/uint32-array
+              description:
+                 Per channel dma hardware descriptor configuration.
+                 The first parameter is descriptor physical address and the
+                 second parameter hardware descriptor number.
+
+          required:
+            - reg
+
+required:
+ - compatible
+ - reg
+ - '#dma-cells'
+
+examples:
+ - |
+   dma0: dma@e0e00000 {
+     compatible = "intel,lgm-cdma";
+     reg = <0xe0e00000 0x1000>;
+     #dma-cells = <1>;
+     interrupt-parent = <&ioapic1>;
+     interrupts = <82 1>;
+     resets = <&rcu0 0x30 0>;
+     reset-names = "ctrl";
+     clocks = <&cgu0 80>;
+     intel,dma-poll-cnt = <4>;
+     intel,dma-byte-en;
+     intel,dma-drb;
+     dma-ports {
+       #address-cells = <1>;
+       #size-cells = <0>;
+
+       dma-ports@0 {
+           reg = <0>;
+           intel,port-name = "SPI0";
+           intel,port-chans = <0 2>;
+           intel,port-burst = <2>;
+           intel,port-txwgt = <1>;
+       };
+       dma-ports@1 {
+           reg = <1>;
+           intel,port-name = "SPI1";
+           intel,port-chans = <2 2>;
+           intel,port-burst = <2>;
+           intel,port-txwgt = <1>;
+       };
+       dma-ports@2 {
+           reg = <2>;
+           intel,port-name = "SPI2";
+           intel,port-chans = <4 2>;
+           intel,port-burst = <2>;
+           intel,port-txwgt = <1>;
+       };
+       dma-ports@3 {
+           reg = <3>;
+           intel,port-name = "SPI3";
+           intel,port-chans = <6 2>;
+           intel,port-burst = <2>;
+           intel,port-endian = <0>;
+           intel,port-txwgt = <1>;
+       };
+       dma-ports@4 {
+           reg = <4>;
+           intel,port-name = "HSNAND";
+           intel,port-chans = <8 2>;
+           intel,port-burst = <8>;
+           intel,port-txwgt = <1>;
+       };
+       dma-ports@5 {
+           reg = <5>;
+           intel,port-name = "PCM";
+           intel,port-chans = <10 6>;
+           intel,port-burst = <8>;
+           intel,port-txwgt = <1>;
+       };
+     };
+     dma-channels {
+       #address-cells = <1>;
+       #size-cells = <0>;
+
+       dma-channels@0 {
+           reg = <0>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@1 {
+           reg = <1>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@2 {
+           reg = <2>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@3 {
+           reg = <3>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@4 {
+           reg = <4>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@5 {
+           reg = <5>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@6 {
+           reg = <6>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@7 {
+           reg = <7>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@8 {
+           reg = <8>;
+       };
+       dma-channels@9 {
+           reg = <9>;
+       };
+       dma-channels@10 {
+           reg = <10>;
+       };
+       dma-channels@11 {
+           reg = <11>;
+       };
+       dma-channels@12 {
+           reg = <12>;
+       };
+       dma-channels@13 {
+           reg = <13>;
+       };
+       dma-channels@14 {
+           reg = <14>;
+       };
+       dma-channels@15 {
+           reg = <15>;
+       };
+     };
+   };
+ - |
+   dma3: dma@ec800000 {
+     compatible = "intel,lgm-dma3";
+     reg = <0xec800000 0x1000>;
+     clocks = <&cgu0 71>;
+     resets = <&rcu0 0x10 9>;
+     #dma-cells = <1>;
+     intel,dma-burst = <32>;
+     intel,dma-polling-cnt = <16>;
+     intel,dma-desc-in-sram;
+     intel,dma-orrc = <16>;
+     intel,dma-byte-en;
+     intel,dma-txendi = <0>;
+     intel,dma-rxendi = <0>;
+     intel,dma-dburst-wr;
+     dma-channels {
+         #address-cells = <1>;
+         #size-cells = <0>;
+
+         dma-channels@12 {
+             reg = <12>;
+             intel,chan-pkt_sz = <4096>;
+             intel,chan-desc-rx-nonpost;
+             intel,chan-data-endian = <0>;
+             intel,chan-desc-endian = <0>;
+             intel,chan-data-endian-en;
+             intel,chan-desc-endian-en;
+             intel,chan-byte-offset = <0>;
+             intel,chan-hdr-mode = <128 0>;
+             intel,chan-non-arb-cnt = <0>;
+             intel,chan-arb-cnt = <0>;
+             intel,chan-hw-desc = <0x20000000 8>;
+         };
+         dma-channels@13 {
+             reg = <13>;
+             intel,chan-pkt-drop;
+             intel,chan-pkt_sz = <4096>;
+             intel,chan-data-endian = <0>;
+             intel,chan-desc-endian = <0>;
+             intel,chan-data-endian-en;
+             intel,chan-desc-endian-en;
+             intel,chan-byte-offset = <0>;
+             intel,chan-hdr-mode = <128 0>;
+             intel,chan-non-arb-cnt = <0>;
+             intel,chan-arb-cnt = <0>;
+         };
+     };
+   };
Signature · 1 line
2.11.0
#2 lore raw

RE: [PATCH v3 1/2] dt-bindings: dma: Add bindings for intel LGM SOC

Hi,

I have some questions about the binding.
Sorry I missed to ask during internal review, as I was busy with other tasks at that time.

See my questions below.

Quoted 49 lines

-----Original Message-----
From: [email protected] <devicetree- [email protected]> On Behalf Of Amireddy Mallikarjuna reddy
Sent: Dienstag, 23. Juni 2020 11:20
To: [email protected]; [email protected]; [email protected]; [email protected]
Cc: [email protected]; Shevchenko, Andriy <[email protected]>; [email protected]; Kim, Cheol Yong <[email protected]>; Wu, Qiming <[email protected]>; [email protected]; Amireddy Mallikarjuna reddy <[email protected]>
Subject: [PATCH v3 1/2] dt-bindings: dma: Add bindings for intel LGM SOC

Add DT bindings YAML schema for DMA controller driver of Lightning Mountain(LGM) SoC.

Signed-off-by: Amireddy Mallikarjuna reddy
<[email protected]>
---
v1:
- Initial version.

v2:
- Fix bot errors.

v3:
- No change.

---
 .../devicetree/bindings/dma/intel,ldma.yaml        | 428
+++++++++++++++++++++
 1 file changed, 428 insertions(+)
 create mode 100644

Documentation/devicetree/bindings/dma/intel,ldma.yaml

Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +7 -0
new file mode 100644
index 000000000000..d474c3e47126
@@ -0,0 +1,428 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/dma/intel,ldma.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Lightning Mountain centralized low speed DMA and high speed DMA

controllers.

Documentation/devicetree/bindings/dma/intel,ldma.yaml line 15

Quoted 8 lines
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +8 -0
+
+maintainers:
+  - [email protected]
+  - [email protected]
+
+properties:
+ $nodename:
+   pattern: "^dma(@.*)?$"

Why is this not "^dma-controller(@.*)?$" as in the common binding?

Quoted 4 lines
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +4 -0
+
+ "#dma-cells":
+   const: 1
+

Documentation/devicetree/bindings/dma/intel,ldma.yaml line 29

Quoted 10 lines
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +10 -0
+ compatible:
+  anyOf:
+   - const: intel,lgm-cdma
+   - const: intel,lgm-dma2tx
+   - const: intel,lgm-dma1rx
+   - const: intel,lgm-dma1tx
+   - const: intel,lgm-dma0tx
+   - const: intel,lgm-dma3
+   - const: intel,lgm-toe_dma30
+   - const: intel,lgm-toe_dma31

Why do you need so many different compatible strings?
I assume the hw blocks are mostly the same, some of them limited to rx or tx. Why is it not possible to describe that as an attribute?

Also, is there a difference in the toe_dma instances (which should not use "_" here!)?
Or is it only the way they are connected to other hw blocks? In code they refer the same "hdma_ops" struct.

If this is only about a name to be printed in the driver, maybe a "label" or "name" attribute will be accepted?

Quoted 58 lines
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +24 -0
+
+ reg:
+  maxItems: 1
+
+ clocks:
+  maxItems: 1
+
+ resets:
+  maxItems: 1
+
+ interrupts:
+  maxItems: 1
+
+ intel,dma-poll-cnt:
+   $ref: /schemas/types.yaml#definitions/uint32
+   description:
+     DMA descriptor polling counter. It may need fine tune according
+     to the system application scenario.
+
+ intel,dma-byte-en:
+   type: boolean
+   description:
+     DMA byte enable is only valid for DMA write(RX).
+     Byte enable(1) means DMA write will be based on the number of

dwords

Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +6 -0
+     instead of the whole burst.
+
+ intel,dma-drb:
+    type: boolean
+    description:
+      DMA descriptor read back to make sure data and desc

synchronization.

Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +5 -0
+
+ intel,dma-burst:
+    $ref: /schemas/types.yaml#definitions/uint32
+    description:
+       Specifiy the DMA burst size(in dwords), the valid value will be

8, 16, 32.

Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +6 -0
+       Default is 16 for data path dma, 32 is for memcopy DMA.
+
+ intel,dma-polling-cnt:
+    $ref: /schemas/types.yaml#definitions/uint32
+    description:
+       DMA descriptor polling counter. It may need fine tune according

to

Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +12 -0
+       the system application scenario.
+
+ intel,dma-desc-in-sram:
+    type: boolean
+    description:
+       DMA descritpors in SRAM or not. Some old controllers descriptors
+       can be in DRAM or SRAM. The new ones are all in SRAM.
+
+ intel,dma-orrc:
+    $ref: /schemas/types.yaml#definitions/uint32
+    description:
+       DMA outstanding read counter. The maximum value is 16, and it

may

Documentation/devicetree/bindings/dma/intel,ldma.yaml line 88

Quoted 6 lines
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +6 -0
+       need fine tune according to the system application scenarios.
+
+ intel,dma-txendi:
+    $ref: /schemas/types.yaml#definitions/uint32
+    description:
+       DMA TX endianness conversion due to SoC endianness difference.

What does this mean? The SoC endianness is know to the driver at compile time. Is it the difference of the device connected to the dma?
As I know the dma is used also for PCIe connected devices, how can you define this in DT?

Same for other attributes below. If they depend on the connected device, which can be external via PCIe, how can you define static configuration values in DT for it?

Quoted 24 lines
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +10 -0
+
+ intel,dma-rxendi:
+    $ref: /schemas/types.yaml#definitions/uint32
+    description:
+       DMA RX endianness conversion due to SoC endianness difference.
+
+ intel,dma-dburst-wr:
+    type: boolean
+    description:
+       Enable RX dynamic burst write. It only applies to RX DMA and

memcopy DMA.

Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +13 -0
+
+
+ dma-ports:
+    type: object
+    description:
+       This sub-node must contain a sub-node for each DMA port.
+    properties:
+      '#address-cells':
+        const: 1
+      '#size-cells':
+        const: 0
+
+    patternProperties:

Documentation/devicetree/bindings/dma/intel,ldma.yaml line 121

Quoted 10 lines
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +10 -0
+      "^dma-ports@[0-9]+$":
+          type: object
+
+          properties:
+            reg:
+              items:
+                - enum: [0, 1, 2, 3, 4, 5]
+              description:
+                 Which port this node refers to.
+

Some of the attributes below have "port-" in the name. As they are in the node for "dma-ports", this is redundant.

Quoted 309 lines
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +307 -1
+            intel,port-name:
+              $ref: /schemas/types.yaml#definitions/string-array
+              description:
+                 Port name of each DMA port.
+
+            intel,port-chans:
+              $ref: /schemas/types.yaml#/definitions/uint32-array
+              description:
+                 The channels included on this port. Format is channel start
+                 number and how many channels on this port.
+
+            intel,port-burst:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Specify the DMA port burst size, the valid value will be
+                 2, 4, 8. Default is 2 for data path dma.
+
+            intel,port-txwgt:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Specify the port transmit weight for QoS purpose. The valid
+                 value is 1~7. Default value is 1.
+
+            intel,port-endian:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Specify the DMA port endiannes conversion due to SoC endianness difference.
+
+          required:
+            - reg
+            - intel,port-name
+            - intel,port-chans
+
+
+ dma-channels:
+    type: object
+    description:
+       This sub-node must contain a sub-node for each DMA channel.
+    properties:
+      '#address-cells':
+        const: 1
+      '#size-cells':
+        const: 0
+
+    patternProperties:
+      "^dma-channels@[0-9]+$":
+          type: object
+
+          properties:
+            reg:
+              items:
+                - enum: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
+              description:
+                 Which channel this node refers to.
+
+            intel,chan-desc_num:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel maximum descriptor number. The max value is 255.
+
+            intel,chan-pkt_sz:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Channel buffer packet size. It must be power of 2.
+                 The maximum size is 4096.
+
+            intel,chan-desc-rx-nonpost:
+              type: boolean
+              description:
+                 Write non-posted type for DMA RX last data beat of every descriptor.
+
+            intel,chan-data-endian:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel data endianness configuration according to SoC requirement.
+
+            intel,chan-desc-endian:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel descriptor endianness configuration according to SoC requirement.
+
+            intel,chan-data-endian-en:
+              type: boolean
+              description:
+                 Per channel data endianness enabled.
+
+            intel,chan-desc-endian-en:
+              type: boolean
+              description:
+                 Per channel descriptor endianness enabled.
+
+            intel,chan-byte-offset:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel byte offset(0~128).
+
+            intel,chan-hdr-mode:
+              $ref: /schemas/types.yaml#/definitions/uint32-array
+              description:
+                 The first parameter is header mode size, the second
+                 parameter is checksum enable or disable. If enabled,
+                 header mode size is ignored. If disabled, header mode
+                 size must be provided.
+
+            intel,chan-non-arb-cnt:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel non arbitration counter while polling
+
+            intel,chan-arb-cnt:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel arbitration counter while polling.
+                 arb_cnt must be greater than non_arb_cnt
+
+            intel,chan-pkt-drop:
+              type: boolean
+              description:
+                 Channel packet drop enabled or disabled.
+
+            intel,chan-hw-desc:
+              $ref: /schemas/types.yaml#/definitions/uint32-array
+              description:
+                 Per channel dma hardware descriptor configuration.
+                 The first parameter is descriptor physical address and the
+                 second parameter hardware descriptor number.
+
+          required:
+            - reg
+
+required:
+ - compatible
+ - reg
+ - '#dma-cells'
+
+examples:
+ - |
+   dma0: dma@e0e00000 {
+     compatible = "intel,lgm-cdma";
+     reg = <0xe0e00000 0x1000>;
+     #dma-cells = <1>;
+     interrupt-parent = <&ioapic1>;
+     interrupts = <82 1>;
+     resets = <&rcu0 0x30 0>;
+     reset-names = "ctrl";
+     clocks = <&cgu0 80>;
+     intel,dma-poll-cnt = <4>;
+     intel,dma-byte-en;
+     intel,dma-drb;
+     dma-ports {
+       #address-cells = <1>;
+       #size-cells = <0>;
+
+       dma-ports@0 {
+           reg = <0>;
+           intel,port-name = "SPI0";
+           intel,port-chans = <0 2>;
+           intel,port-burst = <2>;
+           intel,port-txwgt = <1>;
+       };
+       dma-ports@1 {
+           reg = <1>;
+           intel,port-name = "SPI1";
+           intel,port-chans = <2 2>;
+           intel,port-burst = <2>;
+           intel,port-txwgt = <1>;
+       };
+       dma-ports@2 {
+           reg = <2>;
+           intel,port-name = "SPI2";
+           intel,port-chans = <4 2>;
+           intel,port-burst = <2>;
+           intel,port-txwgt = <1>;
+       };
+       dma-ports@3 {
+           reg = <3>;
+           intel,port-name = "SPI3";
+           intel,port-chans = <6 2>;
+           intel,port-burst = <2>;
+           intel,port-endian = <0>;
+           intel,port-txwgt = <1>;
+       };
+       dma-ports@4 {
+           reg = <4>;
+           intel,port-name = "HSNAND";
+           intel,port-chans = <8 2>;
+           intel,port-burst = <8>;
+           intel,port-txwgt = <1>;
+       };
+       dma-ports@5 {
+           reg = <5>;
+           intel,port-name = "PCM";
+           intel,port-chans = <10 6>;
+           intel,port-burst = <8>;
+           intel,port-txwgt = <1>;
+       };
+     };
+     dma-channels {
+       #address-cells = <1>;
+       #size-cells = <0>;
+
+       dma-channels@0 {
+           reg = <0>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@1 {
+           reg = <1>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@2 {
+           reg = <2>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@3 {
+           reg = <3>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@4 {
+           reg = <4>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@5 {
+           reg = <5>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@6 {
+           reg = <6>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@7 {
+           reg = <7>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@8 {
+           reg = <8>;
+       };
+       dma-channels@9 {
+           reg = <9>;
+       };
+       dma-channels@10 {
+           reg = <10>;
+       };
+       dma-channels@11 {
+           reg = <11>;
+       };
+       dma-channels@12 {
+           reg = <12>;
+       };
+       dma-channels@13 {
+           reg = <13>;
+       };
+       dma-channels@14 {
+           reg = <14>;
+       };
+       dma-channels@15 {
+           reg = <15>;
+       };
+     };
+   };
+ - |
+   dma3: dma@ec800000 {
+     compatible = "intel,lgm-dma3";
+     reg = <0xec800000 0x1000>;
+     clocks = <&cgu0 71>;
+     resets = <&rcu0 0x10 9>;
+     #dma-cells = <1>;
+     intel,dma-burst = <32>;
+     intel,dma-polling-cnt = <16>;
+     intel,dma-desc-in-sram;
+     intel,dma-orrc = <16>;
+     intel,dma-byte-en;
+     intel,dma-txendi = <0>;
+     intel,dma-rxendi = <0>;
+     intel,dma-dburst-wr;
+     dma-channels {
+         #address-cells = <1>;
+         #size-cells = <0>;
+
+         dma-channels@12 {
+             reg = <12>;
+             intel,chan-pkt_sz = <4096>;
+             intel,chan-desc-rx-nonpost;
+             intel,chan-data-endian = <0>;
+             intel,chan-desc-endian = <0>;
+             intel,chan-data-endian-en;
+             intel,chan-desc-endian-en;
+             intel,chan-byte-offset = <0>;
+             intel,chan-hdr-mode = <128 0>;
+             intel,chan-non-arb-cnt = <0>;
+             intel,chan-arb-cnt = <0>;
+             intel,chan-hw-desc = <0x20000000 8>;
+         };
+         dma-channels@13 {
+             reg = <13>;
+             intel,chan-pkt-drop;
+             intel,chan-pkt_sz = <4096>;
+             intel,chan-data-endian = <0>;
+             intel,chan-desc-endian = <0>;
+             intel,chan-data-endian-en;
+             intel,chan-desc-endian-en;
+             intel,chan-byte-offset = <0>;
+             intel,chan-hdr-mode = <128 0>;
+             intel,chan-non-arb-cnt = <0>;
+             intel,chan-arb-cnt = <0>;
+         };
+     };
+   };
--

2.11.0

#3 lore raw

Re: [PATCH v3 1/2] dt-bindings: dma: Add bindings for intel LGM SOC

Thanks Thomas for the review. My comments inline.

Quoted 57 lines · Thomas

Hi,

I have some questions about the binding.
Sorry I missed to ask during internal review, as I was busy with other tasks at that time.

See my questions below.

Quoted 50 lines

-----Original Message-----
From: [email protected] <devicetree- [email protected]> On Behalf Of Amireddy Mallikarjuna reddy
Sent: Dienstag, 23. Juni 2020 11:20
To: [email protected]; [email protected]; [email protected]; [email protected]
Cc: [email protected]; Shevchenko, Andriy <[email protected]>; [email protected]; Kim, Cheol Yong <[email protected]>; Wu, Qiming <[email protected]>; [email protected]; Amireddy Mallikarjuna reddy <[email protected]>
Subject: [PATCH v3 1/2] dt-bindings: dma: Add bindings for intel LGM SOC

Add DT bindings YAML schema for DMA controller driver of Lightning Mountain(LGM) SoC.

Signed-off-by: Amireddy Mallikarjuna reddy
<[email protected]>
---
v1:
- Initial version.

v2:
- Fix bot errors.

v3:
- No change.

---
  .../devicetree/bindings/dma/intel,ldma.yaml        | 428
+++++++++++++++++++++
  1 file changed, 428 insertions(+)

create mode 100644
Documentation/devicetree/bindings/dma/intel,ldma.yaml

Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +7 -0
new file mode 100644
index 000000000000..d474c3e47126
@@ -0,0 +1,428 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/dma/intel,ldma.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Lightning Mountain centralized low speed DMA and high speed DMA

controllers.
+

Quoted 8 lines

Documentation/devicetree/bindings/dma/intel,ldma.yaml line 15

Quoted 7 lines
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +7 -0
+maintainers:
+  - [email protected]
+  - [email protected]
+
+properties:
+ $nodename:
+   pattern: "^dma(@.*)?$"

Why is this not "^dma-controller(@.*)?$" as in the common binding?

Agreed. I will update it.

Quoted 19 lines
Quoted 5 lines
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +4 -0
+
+ "#dma-cells":
+   const: 1
+

Documentation/devicetree/bindings/dma/intel,ldma.yaml line 29

Quoted 10 lines
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +10 -0
+ compatible:
+  anyOf:
+   - const: intel,lgm-cdma
+   - const: intel,lgm-dma2tx
+   - const: intel,lgm-dma1rx
+   - const: intel,lgm-dma1tx
+   - const: intel,lgm-dma0tx
+   - const: intel,lgm-dma3
+   - const: intel,lgm-toe_dma30
+   - const: intel,lgm-toe_dma31

Why do you need so many different compatible strings?
I assume the hw blocks are mostly the same, some of them limited to rx or tx. Why is it not possible to describe that as an attribute?

Quoted 4 lines

Also, is there a difference in the toe_dma instances (which should not use "_" here!)?
Or is it only the way they are connected to other hw blocks? In code they refer the same "hdma_ops" struct.

If this is only about a name to be printed in the driver, maybe a "label" or "name" attribute will be accepted?

we used different compatible strings only for driver specific data of each dma instances. If name and dma-type(tx or rx) can accepts as attribute, we can move these to device tree. So that the compatible strings can be limited to two. intel,lgm-cdma & intel,lgm-hdma or else please suggest us the better proposal.

I will fix "_" in the compatible string in next version.

Quoted 69 lines
Quoted 59 lines
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +24 -0
+
+ reg:
+  maxItems: 1
+
+ clocks:
+  maxItems: 1
+
+ resets:
+  maxItems: 1
+
+ interrupts:
+  maxItems: 1
+
+ intel,dma-poll-cnt:
+   $ref: /schemas/types.yaml#definitions/uint32
+   description:
+     DMA descriptor polling counter. It may need fine tune according
+     to the system application scenario.
+
+ intel,dma-byte-en:
+   type: boolean
+   description:
+     DMA byte enable is only valid for DMA write(RX).
+     Byte enable(1) means DMA write will be based on the number of

dwords

Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +6 -0
+     instead of the whole burst.
+
+ intel,dma-drb:
+    type: boolean
+    description:
+      DMA descriptor read back to make sure data and desc

synchronization.

Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +5 -0
+
+ intel,dma-burst:
+    $ref: /schemas/types.yaml#definitions/uint32
+    description:
+       Specifiy the DMA burst size(in dwords), the valid value will be

8, 16, 32.

Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +6 -0
+       Default is 16 for data path dma, 32 is for memcopy DMA.
+
+ intel,dma-polling-cnt:
+    $ref: /schemas/types.yaml#definitions/uint32
+    description:
+       DMA descriptor polling counter. It may need fine tune according

to

Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +12 -0
+       the system application scenario.
+
+ intel,dma-desc-in-sram:
+    type: boolean
+    description:
+       DMA descritpors in SRAM or not. Some old controllers descriptors
+       can be in DRAM or SRAM. The new ones are all in SRAM.
+
+ intel,dma-orrc:
+    $ref: /schemas/types.yaml#definitions/uint32
+    description:
+       DMA outstanding read counter. The maximum value is 16, and it

may

Documentation/devicetree/bindings/dma/intel,ldma.yaml line 88

Quoted 6 lines
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +6 -0
+       need fine tune according to the system application scenarios.
+
+ intel,dma-txendi:
+    $ref: /schemas/types.yaml#definitions/uint32
+    description:
+       DMA TX endianness conversion due to SoC endianness difference.

What does this mean? The SoC endianness is know to the driver at compile time. Is it the difference of the device connected to the dma?
As I know the dma is used also for PCIe connected devices, how can you define this in DT?

Quoted 2 lines

Same for other attributes below. If they depend on the connected device, which can be external via PCIe, how can you define static configuration values in DT for it?

The same driver supports big-endian SoC(MIPS) and little endian SoC(X86), that is why we have this option. LGM doesn't support MIPS So that i can remove this.

We will not handle PCIe device case, which should be handled in PCIe device driver or datapath driver.

Quoted 29 lines
Quoted 29 lines
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +10 -0
+
+ intel,dma-rxendi:
+    $ref: /schemas/types.yaml#definitions/uint32
+    description:
+       DMA RX endianness conversion due to SoC endianness difference.
+
+ intel,dma-dburst-wr:
+    type: boolean
+    description:
+       Enable RX dynamic burst write. It only applies to RX DMA and

memcopy DMA.

Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +17 -0
+
+
+ dma-ports:
+    type: object
+    description:
+       This sub-node must contain a sub-node for each DMA port.
+    properties:
+      '#address-cells':
+        const: 1
+      '#size-cells':
+        const: 0
+
+    patternProperties:
+      "^dma-ports@[0-9]+$":
+          type: object
+
+          properties:
Quoted 8 lines

Documentation/devicetree/bindings/dma/intel,ldma.yaml line 121

Quoted 6 lines
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +6 -0
+            reg:
+              items:
+                - enum: [0, 1, 2, 3, 4, 5]
+              description:
+                 Which port this node refers to.
+

Some of the attributes below have "port-" in the name. As they are in the node for "dma-ports", this is redundant.

 OK, i will fix it in the next version.

Quoted 310 lines
Quoted 310 lines
Documentation/devicetree/bindings/dma/intel,ldma.yaml new file +307 -1
+            intel,port-name:
+              $ref: /schemas/types.yaml#definitions/string-array
+              description:
+                 Port name of each DMA port.
+
+            intel,port-chans:
+              $ref: /schemas/types.yaml#/definitions/uint32-array
+              description:
+                 The channels included on this port. Format is channel start
+                 number and how many channels on this port.
+
+            intel,port-burst:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Specify the DMA port burst size, the valid value will be
+                 2, 4, 8. Default is 2 for data path dma.
+
+            intel,port-txwgt:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Specify the port transmit weight for QoS purpose. The valid
+                 value is 1~7. Default value is 1.
+
+            intel,port-endian:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Specify the DMA port endiannes conversion due to SoC endianness difference.
+
+          required:
+            - reg
+            - intel,port-name
+            - intel,port-chans
+
+
+ dma-channels:
+    type: object
+    description:
+       This sub-node must contain a sub-node for each DMA channel.
+    properties:
+      '#address-cells':
+        const: 1
+      '#size-cells':
+        const: 0
+
+    patternProperties:
+      "^dma-channels@[0-9]+$":
+          type: object
+
+          properties:
+            reg:
+              items:
+                - enum: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
+              description:
+                 Which channel this node refers to.
+
+            intel,chan-desc_num:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel maximum descriptor number. The max value is 255.
+
+            intel,chan-pkt_sz:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Channel buffer packet size. It must be power of 2.
+                 The maximum size is 4096.
+
+            intel,chan-desc-rx-nonpost:
+              type: boolean
+              description:
+                 Write non-posted type for DMA RX last data beat of every descriptor.
+
+            intel,chan-data-endian:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel data endianness configuration according to SoC requirement.
+
+            intel,chan-desc-endian:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel descriptor endianness configuration according to SoC requirement.
+
+            intel,chan-data-endian-en:
+              type: boolean
+              description:
+                 Per channel data endianness enabled.
+
+            intel,chan-desc-endian-en:
+              type: boolean
+              description:
+                 Per channel descriptor endianness enabled.
+
+            intel,chan-byte-offset:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel byte offset(0~128).
+
+            intel,chan-hdr-mode:
+              $ref: /schemas/types.yaml#/definitions/uint32-array
+              description:
+                 The first parameter is header mode size, the second
+                 parameter is checksum enable or disable. If enabled,
+                 header mode size is ignored. If disabled, header mode
+                 size must be provided.
+
+            intel,chan-non-arb-cnt:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel non arbitration counter while polling
+
+            intel,chan-arb-cnt:
+              $ref: /schemas/types.yaml#/definitions/uint32
+              description:
+                 Per channel arbitration counter while polling.
+                 arb_cnt must be greater than non_arb_cnt
+
+            intel,chan-pkt-drop:
+              type: boolean
+              description:
+                 Channel packet drop enabled or disabled.
+
+            intel,chan-hw-desc:
+              $ref: /schemas/types.yaml#/definitions/uint32-array
+              description:
+                 Per channel dma hardware descriptor configuration.
+                 The first parameter is descriptor physical address and the
+                 second parameter hardware descriptor number.
+
+          required:
+            - reg
+
+required:
+ - compatible
+ - reg
+ - '#dma-cells'
+
+examples:
+ - |
+   dma0: dma@e0e00000 {
+     compatible = "intel,lgm-cdma";
+     reg = <0xe0e00000 0x1000>;
+     #dma-cells = <1>;
+     interrupt-parent = <&ioapic1>;
+     interrupts = <82 1>;
+     resets = <&rcu0 0x30 0>;
+     reset-names = "ctrl";
+     clocks = <&cgu0 80>;
+     intel,dma-poll-cnt = <4>;
+     intel,dma-byte-en;
+     intel,dma-drb;
+     dma-ports {
+       #address-cells = <1>;
+       #size-cells = <0>;
+
+       dma-ports@0 {
+           reg = <0>;
+           intel,port-name = "SPI0";
+           intel,port-chans = <0 2>;
+           intel,port-burst = <2>;
+           intel,port-txwgt = <1>;
+       };
+       dma-ports@1 {
+           reg = <1>;
+           intel,port-name = "SPI1";
+           intel,port-chans = <2 2>;
+           intel,port-burst = <2>;
+           intel,port-txwgt = <1>;
+       };
+       dma-ports@2 {
+           reg = <2>;
+           intel,port-name = "SPI2";
+           intel,port-chans = <4 2>;
+           intel,port-burst = <2>;
+           intel,port-txwgt = <1>;
+       };
+       dma-ports@3 {
+           reg = <3>;
+           intel,port-name = "SPI3";
+           intel,port-chans = <6 2>;
+           intel,port-burst = <2>;
+           intel,port-endian = <0>;
+           intel,port-txwgt = <1>;
+       };
+       dma-ports@4 {
+           reg = <4>;
+           intel,port-name = "HSNAND";
+           intel,port-chans = <8 2>;
+           intel,port-burst = <8>;
+           intel,port-txwgt = <1>;
+       };
+       dma-ports@5 {
+           reg = <5>;
+           intel,port-name = "PCM";
+           intel,port-chans = <10 6>;
+           intel,port-burst = <8>;
+           intel,port-txwgt = <1>;
+       };
+     };
+     dma-channels {
+       #address-cells = <1>;
+       #size-cells = <0>;
+
+       dma-channels@0 {
+           reg = <0>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@1 {
+           reg = <1>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@2 {
+           reg = <2>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@3 {
+           reg = <3>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@4 {
+           reg = <4>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@5 {
+           reg = <5>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@6 {
+           reg = <6>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@7 {
+           reg = <7>;
+           intel,chan-desc_num = <1>;
+       };
+       dma-channels@8 {
+           reg = <8>;
+       };
+       dma-channels@9 {
+           reg = <9>;
+       };
+       dma-channels@10 {
+           reg = <10>;
+       };
+       dma-channels@11 {
+           reg = <11>;
+       };
+       dma-channels@12 {
+           reg = <12>;
+       };
+       dma-channels@13 {
+           reg = <13>;
+       };
+       dma-channels@14 {
+           reg = <14>;
+       };
+       dma-channels@15 {
+           reg = <15>;
+       };
+     };
+   };
+ - |
+   dma3: dma@ec800000 {
+     compatible = "intel,lgm-dma3";
+     reg = <0xec800000 0x1000>;
+     clocks = <&cgu0 71>;
+     resets = <&rcu0 0x10 9>;
+     #dma-cells = <1>;
+     intel,dma-burst = <32>;
+     intel,dma-polling-cnt = <16>;
+     intel,dma-desc-in-sram;
+     intel,dma-orrc = <16>;
+     intel,dma-byte-en;
+     intel,dma-txendi = <0>;
+     intel,dma-rxendi = <0>;
+     intel,dma-dburst-wr;
+     dma-channels {
+         #address-cells = <1>;
+         #size-cells = <0>;
+
+         dma-channels@12 {
+             reg = <12>;
+             intel,chan-pkt_sz = <4096>;
+             intel,chan-desc-rx-nonpost;
+             intel,chan-data-endian = <0>;
+             intel,chan-desc-endian = <0>;
+             intel,chan-data-endian-en;
+             intel,chan-desc-endian-en;
+             intel,chan-byte-offset = <0>;
+             intel,chan-hdr-mode = <128 0>;
+             intel,chan-non-arb-cnt = <0>;
+             intel,chan-arb-cnt = <0>;
+             intel,chan-hw-desc = <0x20000000 8>;
+         };
+         dma-channels@13 {
+             reg = <13>;
+             intel,chan-pkt-drop;
+             intel,chan-pkt_sz = <4096>;
+             intel,chan-data-endian = <0>;
+             intel,chan-desc-endian = <0>;
+             intel,chan-data-endian-en;
+             intel,chan-desc-endian-en;
+             intel,chan-byte-offset = <0>;
+             intel,chan-hdr-mode = <128 0>;
+             intel,chan-non-arb-cnt = <0>;
+             intel,chan-arb-cnt = <0>;
+         };
+     };
+   };
--

2.11.0

#4 lore raw

PATCH v3 2/2 Add Intel LGM soc DMA support.

In reply to Amireddy Mallikarjuna reddy

Add DMA controller driver for Lightning Mountain(LGM) family of SoCs.

The main function of the DMA controller is the transfer of data from/to any DPlus compliant peripheral to/from the memory. A memory to memory copy capability can also be configured.

This ldma driver is used for configure the device and channnels for data and control paths.

---
v1:
- Initial version.

v2:
- Fix device tree bot issues, correspondign driver changes done.
- Fix kerntel test robot warnings.
--------------------------------------------------------

Quoted 1 line
Quoted 1 line

drivers/dma/lgm/lgm-dma.c:729:5: warning: no previous prototype for function 'intel_dma_chan_desc_cfg' [-Wmissing-prototypes]

int intel_dma_chan_desc_cfg(struct dma_chan *chan, dma_addr_t desc_base,
^
drivers/dma/lgm/lgm-dma.c:729:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int intel_dma_chan_desc_cfg(struct dma_chan *chan, dma_addr_t desc_base,
^
static
1 warning generated.

vim +/intel_dma_chan_desc_cfg +729 drivers/dma/lgm/lgm-dma.c

    728
Quoted 1 line

729 int intel_dma_chan_desc_cfg(struct dma_chan *chan, dma_addr_t desc_base,

    730                             int desc_num)
    731 {
    732         return ldma_chan_desc_cfg(to_ldma_chan(chan), desc_base, desc_num);
    733 }
    734 EXPORT_SYMBOL_GPL(intel_dma_chan_desc_cfg);
    735

---------------------------------------------------------------

v3:
- Fix smatch warning.
----------------------------------------------------------------
smatch warnings:
drivers/dma/lgm/lgm-dma.c:1306 ldma_cfg_init() error: uninitialized symbol 'ret'.

----------------------------------------------------------------

---
 drivers/dma/Kconfig         |    2 +
 drivers/dma/Makefile        |    1 +
 drivers/dma/lgm/Kconfig     |    9 +
 drivers/dma/lgm/Makefile    |    2 +
 drivers/dma/lgm/lgm-dma.c   | 1956 +++++++++++++++++++++++++++++++++++++++++++
 include/linux/dma/lgm_dma.h |   27 +
 6 files changed, 1997 insertions(+)
 create mode 100644 drivers/dma/lgm/Kconfig
 create mode 100644 drivers/dma/lgm/Makefile
 create mode 100644 drivers/dma/lgm/lgm-dma.c
 create mode 100644 include/linux/dma/lgm_dma.h
drivers/dma/Kconfig +2 -0
index de41d7928bff..caeaf12fd524 100644
@@ -737,6 +737,8 @@ source "drivers/dma/ti/Kconfig"
 
 source "drivers/dma/fsl-dpaa2-qdma/Kconfig"
 
+source "drivers/dma/lgm/Kconfig"
+
 # clients
 comment "DMA Clients"
 	depends on DMA_ENGINE
drivers/dma/Makefile +1 -0
index e60f81331d4c..0b899b076f4e 100644
@@ -83,6 +83,7 @@ obj-$(CONFIG_XGENE_DMA) += xgene-dma.o
 obj-$(CONFIG_ZX_DMA) += zx_dma.o
 obj-$(CONFIG_ST_FDMA) += st_fdma.o
 obj-$(CONFIG_FSL_DPAA2_QDMA) += fsl-dpaa2-qdma/
+obj-$(CONFIG_INTEL_LDMA) += lgm/
 
 obj-y += mediatek/
 obj-y += qcom/
drivers/dma/lgm/Kconfig new file +9 -0
new file mode 100644
index 000000000000..bdb5b0d91afb
@@ -0,0 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+config INTEL_LDMA
+	bool "Lightning Mountain centralized low speed DMA and high speed DMA controllers"
+	select DMA_ENGINE
+	select DMA_VIRTUAL_CHANNELS
+	help
+	  Enable support for intel Lightning Mountain SOC DMA controllers.
+	  These controllers provide DMA capabilities for a variety of on-chip
+	  devices such as SSC, HSNAND and GSWIP.
drivers/dma/lgm/Makefile new file +2 -0
new file mode 100644
index 000000000000..f318a8eff464
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0
+obj-$(CONFIG_INTEL_LDMA)	+= lgm-dma.o
drivers/dma/lgm/lgm-dma.c new file +1956 -0

1,956 lines not on this page · raw message

include/linux/dma/lgm_dma.h new file +27 -0
new file mode 100644
index 000000000000..3a2ee6ad0710
@@ -0,0 +1,27 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2016 ~ 2019 Intel Corporation.
+ */
+#ifndef LGM_DMA_H
+#define LGM_DMA_H
+
+#include <linux/types.h>
+#include <linux/dmaengine.h>
+
+/*!
+ * \fn int intel_dma_chan_desc_cfg(struct dma_chan *chan, dma_addr_t desc_base,
+ *                                 int desc_num)
+ * \brief Configure low level channel descriptors
+ * \param[in] chan   pointer to DMA channel that the client is using
+ * \param[in] desc_base   descriptor base physical address
+ * \param[in] desc_num   number of descriptors
+ * \return   0 on success
+ * \return   kernel bug reported on failure
+ *
+ * This function configure the low level channel descriptors. It will be
+ * used by CBM whose descriptor is not DDR, actually some registers.
+ */
+int intel_dma_chan_desc_cfg(struct dma_chan *chan, dma_addr_t desc_base,
+			    int desc_num);
+
+#endif /* LGM_DMA_H */
Signature · 1 line
2.11.0