Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'dmaengine-5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine

Pull dmaengine updates from Vinod Koul:
"The last dmaengine updates for this year :)

This contains couple of new drivers, new device support and updates to
bunch of drivers.

New drivers/devices:
- Qualcomm ADM driver
- Qualcomm GPI driver
- Allwinner A100 DMA support
- Microchip Sama7g5 support
- Mediatek MT8516 apdma

Updates:
- more updates to idxd driver and support for IAX config
- runtime PM support for dw driver
- TI drivers"

* tag 'dmaengine-5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine: (75 commits)
soc: ti: k3-ringacc: Use correct error casting in k3_ringacc_dmarings_init
dmaengine: ti: k3-udma-glue: Add support for K3 PKTDMA
dmaengine: ti: k3-udma: Initial support for K3 PKTDMA
dmaengine: ti: k3-udma: Add support for BCDMA channel TPL handling
dmaengine: ti: k3-udma: Initial support for K3 BCDMA
soc: ti: k3-ringacc: add AM64 DMA rings support.
dmaengine: ti: Add support for k3 event routers
dmaengine: ti: k3-psil: Add initial map for AM64
dmaengine: ti: k3-psil: Extend psil_endpoint_config for K3 PKTDMA
dt-bindings: dma: ti: Add document for K3 PKTDMA
dt-bindings: dma: ti: Add document for K3 BCDMA
dmaengine: dmatest: Use dmaengine_get_dma_device
dmaengine: doc: client: Update for dmaengine_get_dma_device() usage
dmaengine: Add support for per channel coherency handling
dmaengine: of-dma: Add support for optional router configuration callback
dmaengine: ti: k3-udma-glue: Configure the dma_dev for rings
dmaengine: ti: k3-udma-glue: Get the ringacc from udma_dev
dmaengine: ti: k3-udma-glue: Add function to get device pointer for DMA API
dmaengine: ti: k3-udma: Add support for second resource range from sysfw
dmaengine: ti: k3-udma: Wait for peer teardown completion if supported
...

+7709 -560
+21
Documentation/ABI/stable/sysfs-driver-dma-idxd
··· 77 77 Description: The operation capability bit mask specify the operation types 78 78 supported by the this device. 79 79 80 + What: /sys/bus/dsa/devices/dsa<m>/pasid_enabled 81 + Date: Oct 27, 2020 82 + KernelVersion: 5.11.0 83 + Contact: dmaengine@vger.kernel.org 84 + Description: To indicate if PASID (process address space identifier) is 85 + enabled or not for this device. 86 + 80 87 What: /sys/bus/dsa/devices/dsa<m>/state 81 88 Date: Oct 25, 2019 82 89 KernelVersion: 5.6.0 ··· 128 121 KernelVersion: 5.10.0 129 122 Contact: dmaengine@vger.kernel.org 130 123 Description: The last executed device administrative command's status/error. 124 + 125 + What: /sys/bus/dsa/devices/wq<m>.<n>/block_on_fault 126 + Date: Oct 27, 2020 127 + KernelVersion: 5.11.0 128 + Contact: dmaengine@vger.kernel.org 129 + Description: To indicate block on fault is allowed or not for the work queue 130 + to support on demand paging. 131 131 132 132 What: /sys/bus/dsa/devices/wq<m>.<n>/group_id 133 133 Date: Oct 25, 2019 ··· 203 189 Contact: dmaengine@vger.kernel.org 204 190 Description: The max batch size for this workqueue. Cannot exceed device 205 191 max batch size. Configurable parameter. 192 + 193 + What: /sys/bus/dsa/devices/wq<m>.<n>/ats_disable 194 + Date: Nov 13, 2020 195 + KernelVersion: 5.11.0 196 + Contact: dmaengine@vger.kernel.org 197 + Description: Indicate whether ATS disable is turned on for the workqueue. 198 + 0 indicates ATS is on, and 1 indicates ATS is off for the workqueue. 206 199 207 200 What: /sys/bus/dsa/devices/engine<m>.<n>/group_id 208 201 Date: Oct 25, 2019
+4 -1
Documentation/devicetree/bindings/dma/allwinner,sun50i-a64-dma.yaml
··· 21 21 compatible: 22 22 oneOf: 23 23 - const: allwinner,sun50i-a64-dma 24 + - const: allwinner,sun50i-a100-dma 24 25 - const: allwinner,sun50i-h6-dma 25 26 - items: 26 27 - const: allwinner,sun8i-r40-dma ··· 57 56 if: 58 57 properties: 59 58 compatible: 60 - const: allwinner,sun50i-h6-dma 59 + enum: 60 + - allwinner,sun50i-a100-dma 61 + - allwinner,sun50i-h6-dma 61 62 62 63 then: 63 64 properties:
+2 -1
Documentation/devicetree/bindings/dma/atmel-xdma.txt
··· 2 2 3 3 * XDMA Controller 4 4 Required properties: 5 - - compatible: Should be "atmel,sama5d4-dma" or "microchip,sam9x60-dma". 5 + - compatible: Should be "atmel,sama5d4-dma", "microchip,sam9x60-dma" or 6 + "microchip,sama7g5-dma". 6 7 - reg: Should contain DMA registers location and length. 7 8 - interrupts: Should contain DMA interrupt. 8 9 - #dma-cells: Must be <1>, used to represent the number of integer cells in
+1
Documentation/devicetree/bindings/dma/mtk-uart-apdma.txt
··· 4 4 - compatible should contain: 5 5 * "mediatek,mt2712-uart-dma" for MT2712 compatible APDMA 6 6 * "mediatek,mt6577-uart-dma" for MT6577 and all of the above 7 + * "mediatek,mt8516-uart-dma", "mediatek,mt6577" for MT8516 SoC 7 8 8 9 - reg: The base address of the APDMA register bank. 9 10
+88
Documentation/devicetree/bindings/dma/qcom,gpi.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/dma/qcom,gpi.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Technologies Inc GPI DMA controller 8 + 9 + maintainers: 10 + - Vinod Koul <vkoul@kernel.org> 11 + 12 + description: | 13 + QCOM GPI DMA controller provides DMA capabilities for 14 + peripheral buses such as I2C, UART, and SPI. 15 + 16 + allOf: 17 + - $ref: "dma-controller.yaml#" 18 + 19 + properties: 20 + compatible: 21 + enum: 22 + - qcom,sdm845-gpi-dma 23 + 24 + reg: 25 + maxItems: 1 26 + 27 + interrupts: 28 + description: 29 + Interrupt lines for each GPI instance 30 + maxItems: 13 31 + 32 + "#dma-cells": 33 + const: 3 34 + description: > 35 + DMA clients must use the format described in dma.txt, giving a phandle 36 + to the DMA controller plus the following 3 integer cells: 37 + - channel: if set to 0xffffffff, any available channel will be allocated 38 + for the client. Otherwise, the exact channel specified will be used. 39 + - seid: serial id of the client as defined in the SoC documentation. 40 + - client: type of the client as defined in dt-bindings/dma/qcom-gpi.h 41 + 42 + iommus: 43 + maxItems: 1 44 + 45 + dma-channels: 46 + maximum: 31 47 + 48 + dma-channel-mask: 49 + maxItems: 1 50 + 51 + required: 52 + - compatible 53 + - reg 54 + - interrupts 55 + - "#dma-cells" 56 + - iommus 57 + - dma-channels 58 + - dma-channel-mask 59 + 60 + additionalProperties: false 61 + 62 + examples: 63 + - | 64 + #include <dt-bindings/interrupt-controller/arm-gic.h> 65 + #include <dt-bindings/dma/qcom-gpi.h> 66 + gpi_dma0: dma-controller@800000 { 67 + compatible = "qcom,gpi-dma"; 68 + #dma-cells = <3>; 69 + reg = <0x00800000 0x60000>; 70 + iommus = <&apps_smmu 0x0016 0x0>; 71 + dma-channels = <13>; 72 + dma-channel-mask = <0xfa>; 73 + interrupts = <GIC_SPI 244 IRQ_TYPE_LEVEL_HIGH>, 74 + <GIC_SPI 245 IRQ_TYPE_LEVEL_HIGH>, 75 + <GIC_SPI 246 IRQ_TYPE_LEVEL_HIGH>, 76 + <GIC_SPI 247 IRQ_TYPE_LEVEL_HIGH>, 77 + <GIC_SPI 248 IRQ_TYPE_LEVEL_HIGH>, 78 + <GIC_SPI 249 IRQ_TYPE_LEVEL_HIGH>, 79 + <GIC_SPI 250 IRQ_TYPE_LEVEL_HIGH>, 80 + <GIC_SPI 251 IRQ_TYPE_LEVEL_HIGH>, 81 + <GIC_SPI 252 IRQ_TYPE_LEVEL_HIGH>, 82 + <GIC_SPI 253 IRQ_TYPE_LEVEL_HIGH>, 83 + <GIC_SPI 254 IRQ_TYPE_LEVEL_HIGH>, 84 + <GIC_SPI 255 IRQ_TYPE_LEVEL_HIGH>, 85 + <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>; 86 + }; 87 + 88 + ...
+164
Documentation/devicetree/bindings/dma/ti/k3-bcdma.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/dma/ti/k3-bcdma.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Texas Instruments K3 DMSS BCDMA Device Tree Bindings 8 + 9 + maintainers: 10 + - Peter Ujfalusi <peter.ujfalusi@ti.com> 11 + 12 + description: | 13 + The Block Copy DMA (BCDMA) is intended to perform similar functions as the TR 14 + mode channels of K3 UDMA-P. 15 + BCDMA includes block copy channels and Split channels. 16 + 17 + Block copy channels mainly used for memory to memory transfers, but with 18 + optional triggers a block copy channel can service peripherals by accessing 19 + directly to memory mapped registers or area. 20 + 21 + Split channels can be used to service PSI-L based peripherals. 22 + The peripherals can be PSI-L native or legacy, non PSI-L native peripherals 23 + with PDMAs. PDMA is tasked to act as a bridge between the PSI-L fabric and the 24 + legacy peripheral. 25 + 26 + PDMAs can be configured via BCDMA split channel's peer registers to match with 27 + the configuration of the legacy peripheral. 28 + 29 + allOf: 30 + - $ref: /schemas/dma/dma-controller.yaml# 31 + 32 + properties: 33 + compatible: 34 + const: ti,am64-dmss-bcdma 35 + 36 + "#dma-cells": 37 + const: 3 38 + description: | 39 + cell 1: type of the BCDMA channel to be used to service the peripheral: 40 + 0 - split channel 41 + 1 - block copy channel using global trigger 1 42 + 2 - block copy channel using global trigger 2 43 + 3 - block copy channel using local trigger 44 + 45 + cell 2: parameter for the channel: 46 + if cell 1 is 0 (split channel): 47 + PSI-L thread ID of the remote (to BCDMA) end. 48 + Valid ranges for thread ID depends on the data movement direction: 49 + for source thread IDs (rx): 0 - 0x7fff 50 + for destination thread IDs (tx): 0x8000 - 0xffff 51 + 52 + Please refer to the device documentation for the PSI-L thread map and 53 + also the PSI-L peripheral chapter for the correct thread ID. 54 + if cell 1 is 1 or 2 (block copy channel using global trigger): 55 + Unused, ignored 56 + 57 + The trigger must be configured for the channel externally to BCDMA, 58 + channels using global triggers should not be requested directly, but 59 + via DMA event router. 60 + if cell 1 is 3 (block copy channel using local trigger): 61 + bchan number of the locally triggered channel 62 + 63 + cell 3: ASEL value for the channel 64 + 65 + reg: 66 + maxItems: 5 67 + 68 + reg-names: 69 + items: 70 + - const: gcfg 71 + - const: bchanrt 72 + - const: rchanrt 73 + - const: tchanrt 74 + - const: ringrt 75 + 76 + msi-parent: true 77 + 78 + ti,asel: 79 + $ref: /schemas/types.yaml#/definitions/uint32 80 + description: ASEL value for non slave channels 81 + 82 + ti,sci-rm-range-bchan: 83 + $ref: /schemas/types.yaml#/definitions/uint32-array 84 + description: | 85 + Array of BCDMA block-copy channel resource subtypes for resource 86 + allocation for this host 87 + minItems: 1 88 + # Should be enough 89 + maxItems: 255 90 + items: 91 + maximum: 0x3f 92 + 93 + ti,sci-rm-range-tchan: 94 + $ref: /schemas/types.yaml#/definitions/uint32-array 95 + description: | 96 + Array of BCDMA split tx channel resource subtypes for resource allocation 97 + for this host 98 + minItems: 1 99 + # Should be enough 100 + maxItems: 255 101 + items: 102 + maximum: 0x3f 103 + 104 + ti,sci-rm-range-rchan: 105 + $ref: /schemas/types.yaml#/definitions/uint32-array 106 + description: | 107 + Array of BCDMA split rx channel resource subtypes for resource allocation 108 + for this host 109 + minItems: 1 110 + # Should be enough 111 + maxItems: 255 112 + items: 113 + maximum: 0x3f 114 + 115 + required: 116 + - compatible 117 + - "#dma-cells" 118 + - reg 119 + - reg-names 120 + - msi-parent 121 + - ti,sci 122 + - ti,sci-dev-id 123 + - ti,sci-rm-range-bchan 124 + - ti,sci-rm-range-tchan 125 + - ti,sci-rm-range-rchan 126 + 127 + unevaluatedProperties: false 128 + 129 + examples: 130 + - |+ 131 + cbass_main { 132 + #address-cells = <2>; 133 + #size-cells = <2>; 134 + 135 + main_dmss { 136 + compatible = "simple-mfd"; 137 + #address-cells = <2>; 138 + #size-cells = <2>; 139 + dma-ranges; 140 + ranges; 141 + 142 + ti,sci-dev-id = <25>; 143 + 144 + main_bcdma: dma-controller@485c0100 { 145 + compatible = "ti,am64-dmss-bcdma"; 146 + 147 + reg = <0x0 0x485c0100 0x0 0x100>, 148 + <0x0 0x4c000000 0x0 0x20000>, 149 + <0x0 0x4a820000 0x0 0x20000>, 150 + <0x0 0x4aa40000 0x0 0x20000>, 151 + <0x0 0x4bc00000 0x0 0x100000>; 152 + reg-names = "gcfg", "bchanrt", "rchanrt", "tchanrt", "ringrt"; 153 + msi-parent = <&inta_main_dmss>; 154 + #dma-cells = <3>; 155 + 156 + ti,sci = <&dmsc>; 157 + ti,sci-dev-id = <26>; 158 + 159 + ti,sci-rm-range-bchan = <0x20>; /* BLOCK_COPY_CHAN */ 160 + ti,sci-rm-range-rchan = <0x21>; /* SPLIT_TR_RX_CHAN */ 161 + ti,sci-rm-range-tchan = <0x22>; /* SPLIT_TR_TX_CHAN */ 162 + }; 163 + }; 164 + };
+172
Documentation/devicetree/bindings/dma/ti/k3-pktdma.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/dma/ti/k3-pktdma.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Texas Instruments K3 DMSS PKTDMA Device Tree Bindings 8 + 9 + maintainers: 10 + - Peter Ujfalusi <peter.ujfalusi@ti.com> 11 + 12 + description: | 13 + The Packet DMA (PKTDMA) is intended to perform similar functions as the packet 14 + mode channels of K3 UDMA-P. 15 + PKTDMA only includes Split channels to service PSI-L based peripherals. 16 + 17 + The peripherals can be PSI-L native or legacy, non PSI-L native peripherals 18 + with PDMAs. PDMA is tasked to act as a bridge between the PSI-L fabric and the 19 + legacy peripheral. 20 + 21 + PDMAs can be configured via PKTDMA split channel's peer registers to match 22 + with the configuration of the legacy peripheral. 23 + 24 + allOf: 25 + - $ref: /schemas/dma/dma-controller.yaml# 26 + 27 + properties: 28 + compatible: 29 + const: ti,am64-dmss-pktdma 30 + 31 + "#dma-cells": 32 + const: 2 33 + description: | 34 + The first cell is the PSI-L thread ID of the remote (to PKTDMA) end. 35 + Valid ranges for thread ID depends on the data movement direction: 36 + for source thread IDs (rx): 0 - 0x7fff 37 + for destination thread IDs (tx): 0x8000 - 0xffff 38 + 39 + Please refer to the device documentation for the PSI-L thread map and also 40 + the PSI-L peripheral chapter for the correct thread ID. 41 + 42 + The second cell is the ASEL value for the channel 43 + 44 + reg: 45 + maxItems: 4 46 + 47 + reg-names: 48 + items: 49 + - const: gcfg 50 + - const: rchanrt 51 + - const: tchanrt 52 + - const: ringrt 53 + 54 + msi-parent: true 55 + 56 + ti,sci-rm-range-tchan: 57 + $ref: /schemas/types.yaml#/definitions/uint32-array 58 + description: | 59 + Array of PKTDMA split tx channel resource subtypes for resource allocation 60 + for this host 61 + minItems: 1 62 + # Should be enough 63 + maxItems: 255 64 + items: 65 + maximum: 0x3f 66 + 67 + ti,sci-rm-range-tflow: 68 + $ref: /schemas/types.yaml#/definitions/uint32-array 69 + description: | 70 + Array of PKTDMA split tx flow resource subtypes for resource allocation 71 + for this host 72 + minItems: 1 73 + # Should be enough 74 + maxItems: 255 75 + items: 76 + maximum: 0x3f 77 + 78 + ti,sci-rm-range-rchan: 79 + $ref: /schemas/types.yaml#/definitions/uint32-array 80 + description: | 81 + Array of PKTDMA split rx channel resource subtypes for resource allocation 82 + for this host 83 + minItems: 1 84 + # Should be enough 85 + maxItems: 255 86 + items: 87 + maximum: 0x3f 88 + 89 + ti,sci-rm-range-rflow: 90 + $ref: /schemas/types.yaml#/definitions/uint32-array 91 + description: | 92 + Array of PKTDMA split rx flow resource subtypes for resource allocation 93 + for this host 94 + minItems: 1 95 + # Should be enough 96 + maxItems: 255 97 + items: 98 + maximum: 0x3f 99 + 100 + required: 101 + - compatible 102 + - "#dma-cells" 103 + - reg 104 + - reg-names 105 + - msi-parent 106 + - ti,sci 107 + - ti,sci-dev-id 108 + - ti,sci-rm-range-tchan 109 + - ti,sci-rm-range-tflow 110 + - ti,sci-rm-range-rchan 111 + - ti,sci-rm-range-rflow 112 + 113 + unevaluatedProperties: false 114 + 115 + examples: 116 + - |+ 117 + cbass_main { 118 + #address-cells = <2>; 119 + #size-cells = <2>; 120 + 121 + main_dmss { 122 + compatible = "simple-mfd"; 123 + #address-cells = <2>; 124 + #size-cells = <2>; 125 + dma-ranges; 126 + ranges; 127 + 128 + ti,sci-dev-id = <25>; 129 + 130 + main_pktdma: dma-controller@485c0000 { 131 + compatible = "ti,am64-dmss-pktdma"; 132 + 133 + reg = <0x0 0x485c0000 0x0 0x100>, 134 + <0x0 0x4a800000 0x0 0x20000>, 135 + <0x0 0x4aa00000 0x0 0x40000>, 136 + <0x0 0x4b800000 0x0 0x400000>; 137 + reg-names = "gcfg", "rchanrt", "tchanrt", "ringrt"; 138 + msi-parent = <&inta_main_dmss>; 139 + #dma-cells = <2>; 140 + 141 + ti,sci = <&dmsc>; 142 + ti,sci-dev-id = <30>; 143 + 144 + ti,sci-rm-range-tchan = <0x23>, /* UNMAPPED_TX_CHAN */ 145 + <0x24>, /* CPSW_TX_CHAN */ 146 + <0x25>, /* SAUL_TX_0_CHAN */ 147 + <0x26>, /* SAUL_TX_1_CHAN */ 148 + <0x27>, /* ICSSG_0_TX_CHAN */ 149 + <0x28>; /* ICSSG_1_TX_CHAN */ 150 + ti,sci-rm-range-tflow = <0x10>, /* RING_UNMAPPED_TX_CHAN */ 151 + <0x11>, /* RING_CPSW_TX_CHAN */ 152 + <0x12>, /* RING_SAUL_TX_0_CHAN */ 153 + <0x13>, /* RING_SAUL_TX_1_CHAN */ 154 + <0x14>, /* RING_ICSSG_0_TX_CHAN */ 155 + <0x15>; /* RING_ICSSG_1_TX_CHAN */ 156 + ti,sci-rm-range-rchan = <0x29>, /* UNMAPPED_RX_CHAN */ 157 + <0x2b>, /* CPSW_RX_CHAN */ 158 + <0x2d>, /* SAUL_RX_0_CHAN */ 159 + <0x2f>, /* SAUL_RX_1_CHAN */ 160 + <0x31>, /* SAUL_RX_2_CHAN */ 161 + <0x33>, /* SAUL_RX_3_CHAN */ 162 + <0x35>, /* ICSSG_0_RX_CHAN */ 163 + <0x37>; /* ICSSG_1_RX_CHAN */ 164 + ti,sci-rm-range-rflow = <0x2a>, /* FLOW_UNMAPPED_RX_CHAN */ 165 + <0x2c>, /* FLOW_CPSW_RX_CHAN */ 166 + <0x2e>, /* FLOW_SAUL_RX_0/1_CHAN */ 167 + <0x32>, /* FLOW_SAUL_RX_2/3_CHAN */ 168 + <0x36>, /* FLOW_ICSSG_0_RX_CHAN */ 169 + <0x38>; /* FLOW_ICSSG_1_RX_CHAN */ 170 + }; 171 + }; 172 + };
+3 -1
Documentation/driver-api/dmaengine/client.rst
··· 120 120 121 121 .. code-block:: c 122 122 123 - nr_sg = dma_map_sg(chan->device->dev, sgl, sg_len); 123 + struct device *dma_dev = dmaengine_get_dma_device(chan); 124 + 125 + nr_sg = dma_map_sg(dma_dev, sgl, sg_len); 124 126 if (nr_sg == 0) 125 127 /* error */ 126 128
+10
drivers/dma/Kconfig
··· 296 296 297 297 If unsure, say N. 298 298 299 + # Config symbol that collects all the dependencies that's necessary to 300 + # support shared virtual memory for the devices supported by idxd. 301 + config INTEL_IDXD_SVM 302 + bool "Accelerator Shared Virtual Memory Support" 303 + depends on INTEL_IDXD 304 + depends on INTEL_IOMMU_SVM 305 + depends on PCI_PRI 306 + depends on PCI_PASID 307 + depends on PCI_IOV 308 + 299 309 config INTEL_IOATDMA 300 310 tristate "Intel I/OAT DMA support" 301 311 depends on PCI && X86_64
+134 -29
drivers/dma/at_xdmac.c
··· 30 30 #define AT_XDMAC_FIFO_SZ(i) (((i) >> 5) & 0x7FF) /* Number of Bytes */ 31 31 #define AT_XDMAC_NB_REQ(i) ((((i) >> 16) & 0x3F) + 1) /* Number of Peripheral Requests Minus One */ 32 32 #define AT_XDMAC_GCFG 0x04 /* Global Configuration Register */ 33 + #define AT_XDMAC_WRHP(i) (((i) & 0xF) << 4) 34 + #define AT_XDMAC_WRMP(i) (((i) & 0xF) << 8) 35 + #define AT_XDMAC_WRLP(i) (((i) & 0xF) << 12) 36 + #define AT_XDMAC_RDHP(i) (((i) & 0xF) << 16) 37 + #define AT_XDMAC_RDMP(i) (((i) & 0xF) << 20) 38 + #define AT_XDMAC_RDLP(i) (((i) & 0xF) << 24) 39 + #define AT_XDMAC_RDSG(i) (((i) & 0xF) << 28) 40 + #define AT_XDMAC_GCFG_M2M (AT_XDMAC_RDLP(0xF) | AT_XDMAC_WRLP(0xF)) 41 + #define AT_XDMAC_GCFG_P2M (AT_XDMAC_RDSG(0x1) | AT_XDMAC_RDHP(0x3) | \ 42 + AT_XDMAC_WRHP(0x5)) 33 43 #define AT_XDMAC_GWAC 0x08 /* Global Weighted Arbiter Configuration Register */ 44 + #define AT_XDMAC_PW0(i) (((i) & 0xF) << 0) 45 + #define AT_XDMAC_PW1(i) (((i) & 0xF) << 4) 46 + #define AT_XDMAC_PW2(i) (((i) & 0xF) << 8) 47 + #define AT_XDMAC_PW3(i) (((i) & 0xF) << 12) 48 + #define AT_XDMAC_GWAC_M2M 0 49 + #define AT_XDMAC_GWAC_P2M (AT_XDMAC_PW0(0xF) | AT_XDMAC_PW2(0xF)) 50 + 34 51 #define AT_XDMAC_GIE 0x0C /* Global Interrupt Enable Register */ 35 52 #define AT_XDMAC_GID 0x10 /* Global Interrupt Disable Register */ 36 53 #define AT_XDMAC_GIM 0x14 /* Global Interrupt Mask Register */ ··· 55 38 #define AT_XDMAC_GE 0x1C /* Global Channel Enable Register */ 56 39 #define AT_XDMAC_GD 0x20 /* Global Channel Disable Register */ 57 40 #define AT_XDMAC_GS 0x24 /* Global Channel Status Register */ 58 - #define AT_XDMAC_GRS 0x28 /* Global Channel Read Suspend Register */ 59 - #define AT_XDMAC_GWS 0x2C /* Global Write Suspend Register */ 60 - #define AT_XDMAC_GRWS 0x30 /* Global Channel Read Write Suspend Register */ 61 - #define AT_XDMAC_GRWR 0x34 /* Global Channel Read Write Resume Register */ 62 - #define AT_XDMAC_GSWR 0x38 /* Global Channel Software Request Register */ 63 - #define AT_XDMAC_GSWS 0x3C /* Global channel Software Request Status Register */ 64 - #define AT_XDMAC_GSWF 0x40 /* Global Channel Software Flush Request Register */ 65 41 #define AT_XDMAC_VERSION 0xFFC /* XDMAC Version Register */ 66 42 67 43 /* Channel relative registers offsets */ ··· 160 150 #define AT_XDMAC_CSUS 0x30 /* Channel Source Microblock Stride */ 161 151 #define AT_XDMAC_CDUS 0x34 /* Channel Destination Microblock Stride */ 162 152 163 - #define AT_XDMAC_CHAN_REG_BASE 0x50 /* Channel registers base address */ 164 - 165 153 /* Microblock control members */ 166 154 #define AT_XDMAC_MBR_UBC_UBLEN_MAX 0xFFFFFFUL /* Maximum Microblock Length */ 167 155 #define AT_XDMAC_MBR_UBC_NDE (0x1 << 24) /* Next Descriptor Enable */ ··· 185 177 enum atc_status { 186 178 AT_XDMAC_CHAN_IS_CYCLIC = 0, 187 179 AT_XDMAC_CHAN_IS_PAUSED, 180 + }; 181 + 182 + struct at_xdmac_layout { 183 + /* Global Channel Read Suspend Register */ 184 + u8 grs; 185 + /* Global Write Suspend Register */ 186 + u8 gws; 187 + /* Global Channel Read Write Suspend Register */ 188 + u8 grws; 189 + /* Global Channel Read Write Resume Register */ 190 + u8 grwr; 191 + /* Global Channel Software Request Register */ 192 + u8 gswr; 193 + /* Global channel Software Request Status Register */ 194 + u8 gsws; 195 + /* Global Channel Software Flush Request Register */ 196 + u8 gswf; 197 + /* Channel reg base */ 198 + u8 chan_cc_reg_base; 199 + /* Source/Destination Interface must be specified or not */ 200 + bool sdif; 201 + /* AXI queue priority configuration supported */ 202 + bool axi_config; 188 203 }; 189 204 190 205 /* ----- Channels ----- */ ··· 243 212 struct clk *clk; 244 213 u32 save_gim; 245 214 struct dma_pool *at_xdmac_desc_pool; 215 + const struct at_xdmac_layout *layout; 246 216 struct at_xdmac_chan chan[]; 247 217 }; 248 218 ··· 276 244 struct list_head xfer_node; 277 245 } __aligned(sizeof(u64)); 278 246 247 + static const struct at_xdmac_layout at_xdmac_sama5d4_layout = { 248 + .grs = 0x28, 249 + .gws = 0x2C, 250 + .grws = 0x30, 251 + .grwr = 0x34, 252 + .gswr = 0x38, 253 + .gsws = 0x3C, 254 + .gswf = 0x40, 255 + .chan_cc_reg_base = 0x50, 256 + .sdif = true, 257 + .axi_config = false, 258 + }; 259 + 260 + static const struct at_xdmac_layout at_xdmac_sama7g5_layout = { 261 + .grs = 0x30, 262 + .gws = 0x38, 263 + .grws = 0x40, 264 + .grwr = 0x44, 265 + .gswr = 0x48, 266 + .gsws = 0x4C, 267 + .gswf = 0x50, 268 + .chan_cc_reg_base = 0x60, 269 + .sdif = false, 270 + .axi_config = true, 271 + }; 272 + 279 273 static inline void __iomem *at_xdmac_chan_reg_base(struct at_xdmac *atxdmac, unsigned int chan_nb) 280 274 { 281 - return atxdmac->regs + (AT_XDMAC_CHAN_REG_BASE + chan_nb * 0x40); 275 + return atxdmac->regs + (atxdmac->layout->chan_cc_reg_base + chan_nb * 0x40); 282 276 } 283 277 284 278 #define at_xdmac_read(atxdmac, reg) readl_relaxed((atxdmac)->regs + (reg)) ··· 403 345 first->active_xfer = true; 404 346 405 347 /* Tell xdmac where to get the first descriptor. */ 406 - reg = AT_XDMAC_CNDA_NDA(first->tx_dma_desc.phys) 407 - | AT_XDMAC_CNDA_NDAIF(atchan->memif); 348 + reg = AT_XDMAC_CNDA_NDA(first->tx_dma_desc.phys); 349 + if (atxdmac->layout->sdif) 350 + reg |= AT_XDMAC_CNDA_NDAIF(atchan->memif); 351 + 408 352 at_xdmac_chan_write(atchan, AT_XDMAC_CNDA, reg); 409 353 410 354 /* ··· 601 541 enum dma_transfer_direction direction) 602 542 { 603 543 struct at_xdmac_chan *atchan = to_at_xdmac_chan(chan); 544 + struct at_xdmac *atxdmac = to_at_xdmac(atchan->chan.device); 604 545 int csize, dwidth; 605 546 606 547 if (direction == DMA_DEV_TO_MEM) { ··· 609 548 AT91_XDMAC_DT_PERID(atchan->perid) 610 549 | AT_XDMAC_CC_DAM_INCREMENTED_AM 611 550 | AT_XDMAC_CC_SAM_FIXED_AM 612 - | AT_XDMAC_CC_DIF(atchan->memif) 613 - | AT_XDMAC_CC_SIF(atchan->perif) 614 551 | AT_XDMAC_CC_SWREQ_HWR_CONNECTED 615 552 | AT_XDMAC_CC_DSYNC_PER2MEM 616 553 | AT_XDMAC_CC_MBSIZE_SIXTEEN 617 554 | AT_XDMAC_CC_TYPE_PER_TRAN; 555 + if (atxdmac->layout->sdif) 556 + atchan->cfg |= AT_XDMAC_CC_DIF(atchan->memif) | 557 + AT_XDMAC_CC_SIF(atchan->perif); 558 + 618 559 csize = ffs(atchan->sconfig.src_maxburst) - 1; 619 560 if (csize < 0) { 620 561 dev_err(chan2dev(chan), "invalid src maxburst value\n"); ··· 634 571 AT91_XDMAC_DT_PERID(atchan->perid) 635 572 | AT_XDMAC_CC_DAM_FIXED_AM 636 573 | AT_XDMAC_CC_SAM_INCREMENTED_AM 637 - | AT_XDMAC_CC_DIF(atchan->perif) 638 - | AT_XDMAC_CC_SIF(atchan->memif) 639 574 | AT_XDMAC_CC_SWREQ_HWR_CONNECTED 640 575 | AT_XDMAC_CC_DSYNC_MEM2PER 641 576 | AT_XDMAC_CC_MBSIZE_SIXTEEN 642 577 | AT_XDMAC_CC_TYPE_PER_TRAN; 578 + if (atxdmac->layout->sdif) 579 + atchan->cfg |= AT_XDMAC_CC_DIF(atchan->perif) | 580 + AT_XDMAC_CC_SIF(atchan->memif); 581 + 643 582 csize = ffs(atchan->sconfig.dst_maxburst) - 1; 644 583 if (csize < 0) { 645 584 dev_err(chan2dev(chan), "invalid src maxburst value\n"); ··· 931 866 * ERRATA: Even if useless for memory transfers, the PERID has to not 932 867 * match the one of another channel. If not, it could lead to spurious 933 868 * flag status. 869 + * For SAMA7G5x case, the SIF and DIF fields are no longer used. 870 + * Thus, no need to have the SIF/DIF interfaces here. 871 + * For SAMA5D4x and SAMA5D2x the SIF and DIF are already configured as 872 + * zero. 934 873 */ 935 - u32 chan_cc = AT_XDMAC_CC_PERID(0x3f) 936 - | AT_XDMAC_CC_DIF(0) 937 - | AT_XDMAC_CC_SIF(0) 874 + u32 chan_cc = AT_XDMAC_CC_PERID(0x7f) 938 875 | AT_XDMAC_CC_MBSIZE_SIXTEEN 939 876 | AT_XDMAC_CC_TYPE_MEM_TRAN; 940 877 ··· 1115 1048 * ERRATA: Even if useless for memory transfers, the PERID has to not 1116 1049 * match the one of another channel. If not, it could lead to spurious 1117 1050 * flag status. 1051 + * For SAMA7G5x case, the SIF and DIF fields are no longer used. 1052 + * Thus, no need to have the SIF/DIF interfaces here. 1053 + * For SAMA5D4x and SAMA5D2x the SIF and DIF are already configured as 1054 + * zero. 1118 1055 */ 1119 - u32 chan_cc = AT_XDMAC_CC_PERID(0x3f) 1056 + u32 chan_cc = AT_XDMAC_CC_PERID(0x7f) 1120 1057 | AT_XDMAC_CC_DAM_INCREMENTED_AM 1121 1058 | AT_XDMAC_CC_SAM_INCREMENTED_AM 1122 - | AT_XDMAC_CC_DIF(0) 1123 - | AT_XDMAC_CC_SIF(0) 1124 1059 | AT_XDMAC_CC_MBSIZE_SIXTEEN 1125 1060 | AT_XDMAC_CC_TYPE_MEM_TRAN; 1126 1061 unsigned long irqflags; ··· 1223 1154 * ERRATA: Even if useless for memory transfers, the PERID has to not 1224 1155 * match the one of another channel. If not, it could lead to spurious 1225 1156 * flag status. 1157 + * For SAMA7G5x case, the SIF and DIF fields are no longer used. 1158 + * Thus, no need to have the SIF/DIF interfaces here. 1159 + * For SAMA5D4x and SAMA5D2x the SIF and DIF are already configured as 1160 + * zero. 1226 1161 */ 1227 - u32 chan_cc = AT_XDMAC_CC_PERID(0x3f) 1162 + u32 chan_cc = AT_XDMAC_CC_PERID(0x7f) 1228 1163 | AT_XDMAC_CC_DAM_UBS_AM 1229 1164 | AT_XDMAC_CC_SAM_INCREMENTED_AM 1230 - | AT_XDMAC_CC_DIF(0) 1231 - | AT_XDMAC_CC_SIF(0) 1232 1165 | AT_XDMAC_CC_MBSIZE_SIXTEEN 1233 1166 | AT_XDMAC_CC_MEMSET_HW_MODE 1234 1167 | AT_XDMAC_CC_TYPE_MEM_TRAN; ··· 1509 1438 mask = AT_XDMAC_CC_TYPE | AT_XDMAC_CC_DSYNC; 1510 1439 value = AT_XDMAC_CC_TYPE_PER_TRAN | AT_XDMAC_CC_DSYNC_PER2MEM; 1511 1440 if ((desc->lld.mbr_cfg & mask) == value) { 1512 - at_xdmac_write(atxdmac, AT_XDMAC_GSWF, atchan->mask); 1441 + at_xdmac_write(atxdmac, atxdmac->layout->gswf, atchan->mask); 1513 1442 while (!(at_xdmac_chan_read(atchan, AT_XDMAC_CIS) & AT_XDMAC_CIS_FIS)) 1514 1443 cpu_relax(); 1515 1444 } ··· 1567 1496 * FIFO flush ensures that data are really written. 1568 1497 */ 1569 1498 if ((desc->lld.mbr_cfg & mask) == value) { 1570 - at_xdmac_write(atxdmac, AT_XDMAC_GSWF, atchan->mask); 1499 + at_xdmac_write(atxdmac, atxdmac->layout->gswf, atchan->mask); 1571 1500 while (!(at_xdmac_chan_read(atchan, AT_XDMAC_CIS) & AT_XDMAC_CIS_FIS)) 1572 1501 cpu_relax(); 1573 1502 } ··· 1832 1761 return 0; 1833 1762 1834 1763 spin_lock_irqsave(&atchan->lock, flags); 1835 - at_xdmac_write(atxdmac, AT_XDMAC_GRWS, atchan->mask); 1764 + at_xdmac_write(atxdmac, atxdmac->layout->grws, atchan->mask); 1836 1765 while (at_xdmac_chan_read(atchan, AT_XDMAC_CC) 1837 1766 & (AT_XDMAC_CC_WRIP | AT_XDMAC_CC_RDIP)) 1838 1767 cpu_relax(); ··· 1855 1784 return 0; 1856 1785 } 1857 1786 1858 - at_xdmac_write(atxdmac, AT_XDMAC_GRWR, atchan->mask); 1787 + at_xdmac_write(atxdmac, atxdmac->layout->grwr, atchan->mask); 1859 1788 clear_bit(AT_XDMAC_CHAN_IS_PAUSED, &atchan->status); 1860 1789 spin_unlock_irqrestore(&atchan->lock, flags); 1861 1790 ··· 2018 1947 } 2019 1948 #endif /* CONFIG_PM_SLEEP */ 2020 1949 1950 + static void at_xdmac_axi_config(struct platform_device *pdev) 1951 + { 1952 + struct at_xdmac *atxdmac = (struct at_xdmac *)platform_get_drvdata(pdev); 1953 + bool dev_m2m = false; 1954 + u32 dma_requests; 1955 + 1956 + if (!atxdmac->layout->axi_config) 1957 + return; /* Not supported */ 1958 + 1959 + if (!of_property_read_u32(pdev->dev.of_node, "dma-requests", 1960 + &dma_requests)) { 1961 + dev_info(&pdev->dev, "controller in mem2mem mode.\n"); 1962 + dev_m2m = true; 1963 + } 1964 + 1965 + if (dev_m2m) { 1966 + at_xdmac_write(atxdmac, AT_XDMAC_GCFG, AT_XDMAC_GCFG_M2M); 1967 + at_xdmac_write(atxdmac, AT_XDMAC_GWAC, AT_XDMAC_GWAC_M2M); 1968 + } else { 1969 + at_xdmac_write(atxdmac, AT_XDMAC_GCFG, AT_XDMAC_GCFG_P2M); 1970 + at_xdmac_write(atxdmac, AT_XDMAC_GWAC, AT_XDMAC_GWAC_P2M); 1971 + } 1972 + } 1973 + 2021 1974 static int at_xdmac_probe(struct platform_device *pdev) 2022 1975 { 2023 1976 struct at_xdmac *atxdmac; ··· 2080 1985 2081 1986 atxdmac->regs = base; 2082 1987 atxdmac->irq = irq; 1988 + 1989 + atxdmac->layout = of_device_get_match_data(&pdev->dev); 1990 + if (!atxdmac->layout) 1991 + return -ENODEV; 2083 1992 2084 1993 atxdmac->clk = devm_clk_get(&pdev->dev, "dma_clk"); 2085 1994 if (IS_ERR(atxdmac->clk)) { ··· 2186 2087 dev_info(&pdev->dev, "%d channels, mapped at 0x%p\n", 2187 2088 nr_channels, atxdmac->regs); 2188 2089 2090 + at_xdmac_axi_config(pdev); 2091 + 2189 2092 return 0; 2190 2093 2191 2094 err_dma_unregister: ··· 2229 2128 static const struct of_device_id atmel_xdmac_dt_ids[] = { 2230 2129 { 2231 2130 .compatible = "atmel,sama5d4-dma", 2131 + .data = &at_xdmac_sama5d4_layout, 2132 + }, { 2133 + .compatible = "microchip,sama7g5-dma", 2134 + .data = &at_xdmac_sama7g5_layout, 2232 2135 }, { 2233 2136 /* sentinel */ 2234 2137 }
+1 -1
drivers/dma/dma-jz4780.c
··· 1044 1044 .remove = jz4780_dma_remove, 1045 1045 .driver = { 1046 1046 .name = "jz4780-dma", 1047 - .of_match_table = of_match_ptr(jz4780_dma_dt_match), 1047 + .of_match_table = jz4780_dma_dt_match, 1048 1048 }, 1049 1049 }; 1050 1050
+8 -5
drivers/dma/dmatest.c
··· 573 573 struct dmatest_params *params; 574 574 struct dma_chan *chan; 575 575 struct dma_device *dev; 576 + struct device *dma_dev; 576 577 unsigned int error_count; 577 578 unsigned int failed_tests = 0; 578 579 unsigned int total_tests = 0; ··· 607 606 params = &info->params; 608 607 chan = thread->chan; 609 608 dev = chan->device; 609 + dma_dev = dmaengine_get_dma_device(chan); 610 + 610 611 src = &thread->src; 611 612 dst = &thread->dst; 612 613 if (thread->type == DMA_MEMCPY) { ··· 733 730 filltime = ktime_add(filltime, diff); 734 731 } 735 732 736 - um = dmaengine_get_unmap_data(dev->dev, src->cnt + dst->cnt, 733 + um = dmaengine_get_unmap_data(dma_dev, src->cnt + dst->cnt, 737 734 GFP_KERNEL); 738 735 if (!um) { 739 736 failed_tests++; ··· 748 745 struct page *pg = virt_to_page(buf); 749 746 unsigned long pg_off = offset_in_page(buf); 750 747 751 - um->addr[i] = dma_map_page(dev->dev, pg, pg_off, 748 + um->addr[i] = dma_map_page(dma_dev, pg, pg_off, 752 749 um->len, DMA_TO_DEVICE); 753 750 srcs[i] = um->addr[i] + src->off; 754 - ret = dma_mapping_error(dev->dev, um->addr[i]); 751 + ret = dma_mapping_error(dma_dev, um->addr[i]); 755 752 if (ret) { 756 753 result("src mapping error", total_tests, 757 754 src->off, dst->off, len, ret); ··· 766 763 struct page *pg = virt_to_page(buf); 767 764 unsigned long pg_off = offset_in_page(buf); 768 765 769 - dsts[i] = dma_map_page(dev->dev, pg, pg_off, um->len, 766 + dsts[i] = dma_map_page(dma_dev, pg, pg_off, um->len, 770 767 DMA_BIDIRECTIONAL); 771 - ret = dma_mapping_error(dev->dev, dsts[i]); 768 + ret = dma_mapping_error(dma_dev, dsts[i]); 772 769 if (ret) { 773 770 result("dst mapping error", total_tests, 774 771 src->off, dst->off, len, ret);
+1 -1
drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c
··· 992 992 .remove = dw_remove, 993 993 .driver = { 994 994 .name = KBUILD_MODNAME, 995 - .of_match_table = of_match_ptr(dw_dma_of_id_table), 995 + .of_match_table = dw_dma_of_id_table, 996 996 .pm = &dw_axi_dma_pm_ops, 997 997 }, 998 998 };
+6
drivers/dma/dw/core.c
··· 982 982 983 983 dev_vdbg(chan2dev(chan), "%s\n", __func__); 984 984 985 + pm_runtime_get_sync(dw->dma.dev); 986 + 985 987 /* ASSERT: channel is idle */ 986 988 if (dma_readl(dw, CH_EN) & dwc->mask) { 989 + pm_runtime_put_sync_suspend(dw->dma.dev); 987 990 dev_dbg(chan2dev(chan), "DMA channel not idle?\n"); 988 991 return -EIO; 989 992 } ··· 1003 1000 * We need controller-specific data to set up slave transfers. 1004 1001 */ 1005 1002 if (chan->private && !dw_dma_filter(chan, chan->private)) { 1003 + pm_runtime_put_sync_suspend(dw->dma.dev); 1006 1004 dev_warn(chan2dev(chan), "Wrong controller-specific data\n"); 1007 1005 return -EINVAL; 1008 1006 } ··· 1046 1042 dw->in_use &= ~dwc->mask; 1047 1043 if (!dw->in_use) 1048 1044 do_dw_dma_off(dw); 1045 + 1046 + pm_runtime_put_sync_suspend(dw->dma.dev); 1049 1047 1050 1048 dev_vdbg(chan2dev(chan), "%s: done\n", __func__); 1051 1049 }
+2 -3
drivers/dma/hisi_dma.c
··· 431 431 struct hisi_dma_dev *hdma_dev = chan->hdma_dev; 432 432 struct hisi_dma_desc *desc; 433 433 struct hisi_dma_cqe *cqe; 434 - unsigned long flags; 435 434 436 - spin_lock_irqsave(&chan->vc.lock, flags); 435 + spin_lock(&chan->vc.lock); 437 436 438 437 desc = chan->desc; 439 438 cqe = chan->cq + chan->cq_head; ··· 451 452 chan->desc = NULL; 452 453 } 453 454 454 - spin_unlock_irqrestore(&chan->vc.lock, flags); 455 + spin_unlock(&chan->vc.lock); 455 456 456 457 return IRQ_HANDLED; 457 458 }
+2 -6
drivers/dma/idma64.c
··· 667 667 return idma64_remove(chip); 668 668 } 669 669 670 - #ifdef CONFIG_PM_SLEEP 671 - 672 - static int idma64_pm_suspend(struct device *dev) 670 + static int __maybe_unused idma64_pm_suspend(struct device *dev) 673 671 { 674 672 struct idma64_chip *chip = dev_get_drvdata(dev); 675 673 ··· 675 677 return 0; 676 678 } 677 679 678 - static int idma64_pm_resume(struct device *dev) 680 + static int __maybe_unused idma64_pm_resume(struct device *dev) 679 681 { 680 682 struct idma64_chip *chip = dev_get_drvdata(dev); 681 683 682 684 idma64_on(chip->idma64); 683 685 return 0; 684 686 } 685 - 686 - #endif /* CONFIG_PM_SLEEP */ 687 687 688 688 static const struct dev_pm_ops idma64_dev_pm_ops = { 689 689 SET_SYSTEM_SLEEP_PM_OPS(idma64_pm_suspend, idma64_pm_resume)
+49 -1
drivers/dma/idxd/cdev.c
··· 11 11 #include <linux/cdev.h> 12 12 #include <linux/fs.h> 13 13 #include <linux/poll.h> 14 + #include <linux/iommu.h> 14 15 #include <uapi/linux/idxd.h> 15 16 #include "registers.h" 16 17 #include "idxd.h" ··· 28 27 */ 29 28 static struct idxd_cdev_context ictx[IDXD_TYPE_MAX] = { 30 29 { .name = "dsa" }, 30 + { .name = "iax" } 31 31 }; 32 32 33 33 struct idxd_user_context { 34 34 struct idxd_wq *wq; 35 35 struct task_struct *task; 36 + unsigned int pasid; 36 37 unsigned int flags; 38 + struct iommu_sva *sva; 37 39 }; 38 40 39 41 enum idxd_cdev_cleanup { ··· 79 75 struct idxd_wq *wq; 80 76 struct device *dev; 81 77 int rc = 0; 78 + struct iommu_sva *sva; 79 + unsigned int pasid; 82 80 83 81 wq = inode_wq(inode); 84 82 idxd = wq->idxd; ··· 101 95 102 96 ctx->wq = wq; 103 97 filp->private_data = ctx; 98 + 99 + if (device_pasid_enabled(idxd)) { 100 + sva = iommu_sva_bind_device(dev, current->mm, NULL); 101 + if (IS_ERR(sva)) { 102 + rc = PTR_ERR(sva); 103 + dev_err(dev, "pasid allocation failed: %d\n", rc); 104 + goto failed; 105 + } 106 + 107 + pasid = iommu_sva_get_pasid(sva); 108 + if (pasid == IOMMU_PASID_INVALID) { 109 + iommu_sva_unbind_device(sva); 110 + goto failed; 111 + } 112 + 113 + ctx->sva = sva; 114 + ctx->pasid = pasid; 115 + 116 + if (wq_dedicated(wq)) { 117 + rc = idxd_wq_set_pasid(wq, pasid); 118 + if (rc < 0) { 119 + iommu_sva_unbind_device(sva); 120 + dev_err(dev, "wq set pasid failed: %d\n", rc); 121 + goto failed; 122 + } 123 + } 124 + } 125 + 104 126 idxd_wq_get(wq); 105 127 mutex_unlock(&wq->wq_lock); 106 128 return 0; ··· 145 111 struct idxd_wq *wq = ctx->wq; 146 112 struct idxd_device *idxd = wq->idxd; 147 113 struct device *dev = &idxd->pdev->dev; 114 + int rc; 148 115 149 116 dev_dbg(dev, "%s called\n", __func__); 150 117 filep->private_data = NULL; 151 118 152 119 /* Wait for in-flight operations to complete. */ 153 - idxd_wq_drain(wq); 120 + if (wq_shared(wq)) { 121 + idxd_device_drain_pasid(idxd, ctx->pasid); 122 + } else { 123 + if (device_pasid_enabled(idxd)) { 124 + /* The wq disable in the disable pasid function will drain the wq */ 125 + rc = idxd_wq_disable_pasid(wq); 126 + if (rc < 0) 127 + dev_err(dev, "wq disable pasid failed.\n"); 128 + } else { 129 + idxd_wq_drain(wq); 130 + } 131 + } 154 132 133 + if (ctx->sva) 134 + iommu_sva_unbind_device(ctx->sva); 155 135 kfree(ctx); 156 136 mutex_lock(&wq->wq_lock); 157 137 idxd_wq_put(wq);
+120 -23
drivers/dma/idxd/device.c
··· 131 131 struct idxd_device *idxd = wq->idxd; 132 132 struct device *dev = &idxd->pdev->dev; 133 133 int rc, num_descs, i; 134 + int align; 135 + u64 tmp; 134 136 135 137 if (wq->type != IDXD_WQT_KERNEL) 136 138 return 0; ··· 144 142 if (rc < 0) 145 143 return rc; 146 144 147 - wq->compls_size = num_descs * sizeof(struct dsa_completion_record); 148 - wq->compls = dma_alloc_coherent(dev, wq->compls_size, 149 - &wq->compls_addr, GFP_KERNEL); 150 - if (!wq->compls) { 145 + if (idxd->type == IDXD_TYPE_DSA) 146 + align = 32; 147 + else if (idxd->type == IDXD_TYPE_IAX) 148 + align = 64; 149 + else 150 + return -ENODEV; 151 + 152 + wq->compls_size = num_descs * idxd->compl_size + align; 153 + wq->compls_raw = dma_alloc_coherent(dev, wq->compls_size, 154 + &wq->compls_addr_raw, GFP_KERNEL); 155 + if (!wq->compls_raw) { 151 156 rc = -ENOMEM; 152 157 goto fail_alloc_compls; 153 158 } 159 + 160 + /* Adjust alignment */ 161 + wq->compls_addr = (wq->compls_addr_raw + (align - 1)) & ~(align - 1); 162 + tmp = (u64)wq->compls_raw; 163 + tmp = (tmp + (align - 1)) & ~(align - 1); 164 + wq->compls = (struct dsa_completion_record *)tmp; 154 165 155 166 rc = alloc_descs(wq, num_descs); 156 167 if (rc < 0) ··· 178 163 struct idxd_desc *desc = wq->descs[i]; 179 164 180 165 desc->hw = wq->hw_descs[i]; 181 - desc->completion = &wq->compls[i]; 182 - desc->compl_dma = wq->compls_addr + 183 - sizeof(struct dsa_completion_record) * i; 166 + if (idxd->type == IDXD_TYPE_DSA) 167 + desc->completion = &wq->compls[i]; 168 + else if (idxd->type == IDXD_TYPE_IAX) 169 + desc->iax_completion = &wq->iax_compls[i]; 170 + desc->compl_dma = wq->compls_addr + idxd->compl_size * i; 184 171 desc->id = i; 185 172 desc->wq = wq; 186 173 desc->cpu = -1; ··· 195 178 fail_sbitmap_init: 196 179 free_descs(wq); 197 180 fail_alloc_descs: 198 - dma_free_coherent(dev, wq->compls_size, wq->compls, wq->compls_addr); 181 + dma_free_coherent(dev, wq->compls_size, wq->compls_raw, 182 + wq->compls_addr_raw); 199 183 fail_alloc_compls: 200 184 free_hw_descs(wq); 201 185 return rc; ··· 211 193 212 194 free_hw_descs(wq); 213 195 free_descs(wq); 214 - dma_free_coherent(dev, wq->compls_size, wq->compls, wq->compls_addr); 196 + dma_free_coherent(dev, wq->compls_size, wq->compls_raw, 197 + wq->compls_addr_raw); 215 198 sbitmap_queue_free(&wq->sbq); 216 199 } 217 200 ··· 292 273 start = pci_resource_start(pdev, IDXD_WQ_BAR); 293 274 start += idxd_get_wq_portal_full_offset(wq->id, IDXD_PORTAL_LIMITED); 294 275 295 - wq->dportal = devm_ioremap(dev, start, IDXD_PORTAL_SIZE); 296 - if (!wq->dportal) 276 + wq->portal = devm_ioremap(dev, start, IDXD_PORTAL_SIZE); 277 + if (!wq->portal) 297 278 return -ENOMEM; 298 - dev_dbg(dev, "wq %d portal mapped at %p\n", wq->id, wq->dportal); 299 279 300 280 return 0; 301 281 } ··· 303 285 { 304 286 struct device *dev = &wq->idxd->pdev->dev; 305 287 306 - devm_iounmap(dev, wq->dportal); 288 + devm_iounmap(dev, wq->portal); 289 + } 290 + 291 + int idxd_wq_set_pasid(struct idxd_wq *wq, int pasid) 292 + { 293 + struct idxd_device *idxd = wq->idxd; 294 + int rc; 295 + union wqcfg wqcfg; 296 + unsigned int offset; 297 + unsigned long flags; 298 + 299 + rc = idxd_wq_disable(wq); 300 + if (rc < 0) 301 + return rc; 302 + 303 + offset = WQCFG_OFFSET(idxd, wq->id, WQCFG_PASID_IDX); 304 + spin_lock_irqsave(&idxd->dev_lock, flags); 305 + wqcfg.bits[WQCFG_PASID_IDX] = ioread32(idxd->reg_base + offset); 306 + wqcfg.pasid_en = 1; 307 + wqcfg.pasid = pasid; 308 + iowrite32(wqcfg.bits[WQCFG_PASID_IDX], idxd->reg_base + offset); 309 + spin_unlock_irqrestore(&idxd->dev_lock, flags); 310 + 311 + rc = idxd_wq_enable(wq); 312 + if (rc < 0) 313 + return rc; 314 + 315 + return 0; 316 + } 317 + 318 + int idxd_wq_disable_pasid(struct idxd_wq *wq) 319 + { 320 + struct idxd_device *idxd = wq->idxd; 321 + int rc; 322 + union wqcfg wqcfg; 323 + unsigned int offset; 324 + unsigned long flags; 325 + 326 + rc = idxd_wq_disable(wq); 327 + if (rc < 0) 328 + return rc; 329 + 330 + offset = WQCFG_OFFSET(idxd, wq->id, WQCFG_PASID_IDX); 331 + spin_lock_irqsave(&idxd->dev_lock, flags); 332 + wqcfg.bits[WQCFG_PASID_IDX] = ioread32(idxd->reg_base + offset); 333 + wqcfg.pasid_en = 0; 334 + wqcfg.pasid = 0; 335 + iowrite32(wqcfg.bits[WQCFG_PASID_IDX], idxd->reg_base + offset); 336 + spin_unlock_irqrestore(&idxd->dev_lock, flags); 337 + 338 + rc = idxd_wq_enable(wq); 339 + if (rc < 0) 340 + return rc; 341 + 342 + return 0; 307 343 } 308 344 309 345 void idxd_wq_disable_cleanup(struct idxd_wq *wq) ··· 373 301 wq->group = NULL; 374 302 wq->threshold = 0; 375 303 wq->priority = 0; 304 + wq->ats_dis = 0; 376 305 clear_bit(WQ_FLAG_DEDICATED, &wq->flags); 377 306 memset(wq->name, 0, WQ_NAME_SIZE); 378 307 ··· 541 468 spin_unlock_irqrestore(&idxd->dev_lock, flags); 542 469 } 543 470 471 + void idxd_device_drain_pasid(struct idxd_device *idxd, int pasid) 472 + { 473 + struct device *dev = &idxd->pdev->dev; 474 + u32 operand; 475 + 476 + operand = pasid; 477 + dev_dbg(dev, "cmd: %u operand: %#x\n", IDXD_CMD_DRAIN_PASID, operand); 478 + idxd_cmd_exec(idxd, IDXD_CMD_DRAIN_PASID, operand, NULL); 479 + dev_dbg(dev, "pasid %d drained\n", pasid); 480 + } 481 + 544 482 /* Device configuration bits */ 545 483 static void idxd_group_config_write(struct idxd_group *group) 546 484 { ··· 563 479 dev_dbg(dev, "Writing group %d cfg registers\n", group->id); 564 480 565 481 /* setup GRPWQCFG */ 566 - for (i = 0; i < 4; i++) { 567 - grpcfg_offset = idxd->grpcfg_offset + 568 - group->id * 64 + i * sizeof(u64); 569 - iowrite64(group->grpcfg.wqs[i], 570 - idxd->reg_base + grpcfg_offset); 482 + for (i = 0; i < GRPWQCFG_STRIDES; i++) { 483 + grpcfg_offset = GRPWQCFG_OFFSET(idxd, group->id, i); 484 + iowrite64(group->grpcfg.wqs[i], idxd->reg_base + grpcfg_offset); 571 485 dev_dbg(dev, "GRPCFG wq[%d:%d: %#x]: %#llx\n", 572 486 group->id, i, grpcfg_offset, 573 487 ioread64(idxd->reg_base + grpcfg_offset)); 574 488 } 575 489 576 490 /* setup GRPENGCFG */ 577 - grpcfg_offset = idxd->grpcfg_offset + group->id * 64 + 32; 491 + grpcfg_offset = GRPENGCFG_OFFSET(idxd, group->id); 578 492 iowrite64(group->grpcfg.engines, idxd->reg_base + grpcfg_offset); 579 493 dev_dbg(dev, "GRPCFG engs[%d: %#x]: %#llx\n", group->id, 580 494 grpcfg_offset, ioread64(idxd->reg_base + grpcfg_offset)); 581 495 582 496 /* setup GRPFLAGS */ 583 - grpcfg_offset = idxd->grpcfg_offset + group->id * 64 + 40; 497 + grpcfg_offset = GRPFLGCFG_OFFSET(idxd, group->id); 584 498 iowrite32(group->grpcfg.flags.bits, idxd->reg_base + grpcfg_offset); 585 499 dev_dbg(dev, "GRPFLAGS flags[%d: %#x]: %#x\n", 586 500 group->id, grpcfg_offset, ··· 636 554 637 555 /* byte 8-11 */ 638 556 wq->wqcfg->priv = !!(wq->type == IDXD_WQT_KERNEL); 639 - wq->wqcfg->mode = 1; 557 + if (wq_dedicated(wq)) 558 + wq->wqcfg->mode = 1; 559 + 560 + if (device_pasid_enabled(idxd)) { 561 + wq->wqcfg->pasid_en = 1; 562 + if (wq->type == IDXD_WQT_KERNEL && wq_dedicated(wq)) 563 + wq->wqcfg->pasid = idxd->pasid; 564 + } 565 + 640 566 wq->wqcfg->priority = wq->priority; 567 + 568 + if (idxd->hw.gen_cap.block_on_fault && 569 + test_bit(WQ_FLAG_BLOCK_ON_FAULT, &wq->flags)) 570 + wq->wqcfg->bof = 1; 571 + 572 + if (idxd->hw.wq_cap.wq_ats_support) 573 + wq->wqcfg->wq_ats_disable = wq->ats_dis; 641 574 642 575 /* bytes 12-15 */ 643 576 wq->wqcfg->max_xfer_shift = ilog2(wq->max_xfer_bytes); ··· 761 664 if (!wq->size) 762 665 continue; 763 666 764 - if (!wq_dedicated(wq)) { 765 - dev_warn(dev, "No shared workqueue support.\n"); 667 + if (wq_shared(wq) && !device_swq_supported(idxd)) { 668 + dev_warn(dev, "No shared wq support but configured.\n"); 766 669 return -EINVAL; 767 670 } 768 671
-9
drivers/dma/idxd/dma.c
··· 61 61 u64 addr_f1, u64 addr_f2, u64 len, 62 62 u64 compl, u32 flags) 63 63 { 64 - struct idxd_device *idxd = wq->idxd; 65 - 66 64 hw->flags = flags; 67 65 hw->opcode = opcode; 68 66 hw->src_addr = addr_f1; ··· 68 70 hw->xfer_size = len; 69 71 hw->priv = !!(wq->type == IDXD_WQT_KERNEL); 70 72 hw->completion_addr = compl; 71 - 72 - /* 73 - * Descriptor completion vectors are 1-8 for MSIX. We will round 74 - * robin through the 8 vectors. 75 - */ 76 - wq->vec_ptr = (wq->vec_ptr % idxd->num_wq_irqs) + 1; 77 - hw->int_handle = wq->vec_ptr; 78 73 } 79 74 80 75 static struct dma_async_tx_descriptor *
+53 -5
drivers/dma/idxd/idxd.h
··· 20 20 enum idxd_type { 21 21 IDXD_TYPE_UNKNOWN = -1, 22 22 IDXD_TYPE_DSA = 0, 23 - IDXD_TYPE_MAX 23 + IDXD_TYPE_IAX, 24 + IDXD_TYPE_MAX, 24 25 }; 25 26 26 27 #define IDXD_NAME_SIZE 128 ··· 35 34 int id; 36 35 struct llist_head pending_llist; 37 36 struct list_head work_list; 37 + /* 38 + * Lock to protect access between irq thread process descriptor 39 + * and irq thread processing error descriptor. 40 + */ 41 + spinlock_t list_lock; 38 42 }; 39 43 40 44 struct idxd_group { ··· 65 59 66 60 enum idxd_wq_flag { 67 61 WQ_FLAG_DEDICATED = 0, 62 + WQ_FLAG_BLOCK_ON_FAULT, 68 63 }; 69 64 70 65 enum idxd_wq_type { ··· 93 86 enum idxd_complete_type { 94 87 IDXD_COMPLETE_NORMAL = 0, 95 88 IDXD_COMPLETE_ABORT, 89 + IDXD_COMPLETE_DEV_FAIL, 96 90 }; 97 91 98 92 struct idxd_wq { 99 - void __iomem *dportal; 93 + void __iomem *portal; 100 94 struct device conf_dev; 101 95 struct idxd_cdev idxd_cdev; 102 96 struct idxd_device *idxd; ··· 115 107 u32 vec_ptr; /* interrupt steering */ 116 108 struct dsa_hw_desc **hw_descs; 117 109 int num_descs; 118 - struct dsa_completion_record *compls; 110 + union { 111 + struct dsa_completion_record *compls; 112 + struct iax_completion_record *iax_compls; 113 + }; 114 + void *compls_raw; 119 115 dma_addr_t compls_addr; 116 + dma_addr_t compls_addr_raw; 120 117 int compls_size; 121 118 struct idxd_desc **descs; 122 119 struct sbitmap_queue sbq; ··· 129 116 char name[WQ_NAME_SIZE + 1]; 130 117 u64 max_xfer_bytes; 131 118 u32 max_batch_size; 119 + bool ats_dis; 132 120 }; 133 121 134 122 struct idxd_engine { ··· 159 145 enum idxd_device_flag { 160 146 IDXD_FLAG_CONFIGURABLE = 0, 161 147 IDXD_FLAG_CMD_RUNNING, 148 + IDXD_FLAG_PASID_ENABLED, 162 149 }; 163 150 164 151 struct idxd_device { ··· 182 167 struct idxd_wq *wqs; 183 168 struct idxd_engine *engines; 184 169 170 + struct iommu_sva *sva; 171 + unsigned int pasid; 172 + 185 173 int num_groups; 186 174 187 175 u32 msix_perm_offset; ··· 202 184 int token_limit; 203 185 int nr_tokens; /* non-reserved tokens */ 204 186 unsigned int wqcfg_size; 187 + int compl_size; 205 188 206 189 union sw_err_reg sw_err; 207 190 wait_queue_head_t cmd_waitq; ··· 217 198 218 199 /* IDXD software descriptor */ 219 200 struct idxd_desc { 220 - struct dsa_hw_desc *hw; 201 + union { 202 + struct dsa_hw_desc *hw; 203 + struct iax_hw_desc *iax_hw; 204 + }; 221 205 dma_addr_t desc_dma; 222 - struct dsa_completion_record *completion; 206 + union { 207 + struct dsa_completion_record *completion; 208 + struct iax_completion_record *iax_completion; 209 + }; 223 210 dma_addr_t compl_dma; 224 211 struct dma_async_tx_descriptor txd; 225 212 struct llist_node llnode; ··· 239 214 #define confdev_to_wq(dev) container_of(dev, struct idxd_wq, conf_dev) 240 215 241 216 extern struct bus_type dsa_bus_type; 217 + extern struct bus_type iax_bus_type; 218 + 219 + extern bool support_enqcmd; 242 220 243 221 static inline bool wq_dedicated(struct idxd_wq *wq) 244 222 { 245 223 return test_bit(WQ_FLAG_DEDICATED, &wq->flags); 224 + } 225 + 226 + static inline bool wq_shared(struct idxd_wq *wq) 227 + { 228 + return !test_bit(WQ_FLAG_DEDICATED, &wq->flags); 229 + } 230 + 231 + static inline bool device_pasid_enabled(struct idxd_device *idxd) 232 + { 233 + return test_bit(IDXD_FLAG_PASID_ENABLED, &idxd->flags); 234 + } 235 + 236 + static inline bool device_swq_supported(struct idxd_device *idxd) 237 + { 238 + return (support_enqcmd && device_pasid_enabled(idxd)); 246 239 } 247 240 248 241 enum idxd_portal_prot { ··· 285 242 286 243 if (pdev->device == PCI_DEVICE_ID_INTEL_DSA_SPR0) 287 244 idxd->type = IDXD_TYPE_DSA; 245 + else if (pdev->device == PCI_DEVICE_ID_INTEL_IAX_SPR0) 246 + idxd->type = IDXD_TYPE_IAX; 288 247 else 289 248 idxd->type = IDXD_TYPE_UNKNOWN; 290 249 } ··· 333 288 void idxd_device_cleanup(struct idxd_device *idxd); 334 289 int idxd_device_config(struct idxd_device *idxd); 335 290 void idxd_device_wqs_clear_state(struct idxd_device *idxd); 291 + void idxd_device_drain_pasid(struct idxd_device *idxd, int pasid); 336 292 337 293 /* work queue control */ 338 294 int idxd_wq_alloc_resources(struct idxd_wq *wq); ··· 344 298 int idxd_wq_map_portal(struct idxd_wq *wq); 345 299 void idxd_wq_unmap_portal(struct idxd_wq *wq); 346 300 void idxd_wq_disable_cleanup(struct idxd_wq *wq); 301 + int idxd_wq_set_pasid(struct idxd_wq *wq, int pasid); 302 + int idxd_wq_disable_pasid(struct idxd_wq *wq); 347 303 348 304 /* submission */ 349 305 int idxd_submit_desc(struct idxd_wq *wq, struct idxd_desc *desc);
+93 -30
drivers/dma/idxd/init.c
··· 14 14 #include <linux/io-64-nonatomic-lo-hi.h> 15 15 #include <linux/device.h> 16 16 #include <linux/idr.h> 17 + #include <linux/intel-svm.h> 18 + #include <linux/iommu.h> 17 19 #include <uapi/linux/idxd.h> 18 20 #include <linux/dmaengine.h> 19 21 #include "../dmaengine.h" ··· 28 26 29 27 #define DRV_NAME "idxd" 30 28 29 + bool support_enqcmd; 30 + 31 31 static struct idr idxd_idrs[IDXD_TYPE_MAX]; 32 32 static struct mutex idxd_idr_lock; 33 33 34 34 static struct pci_device_id idxd_pci_tbl[] = { 35 35 /* DSA ver 1.0 platforms */ 36 36 { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_DSA_SPR0) }, 37 + 38 + /* IAX ver 1.0 platforms */ 39 + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IAX_SPR0) }, 37 40 { 0, } 38 41 }; 39 42 MODULE_DEVICE_TABLE(pci, idxd_pci_tbl); 40 43 41 44 static char *idxd_name[] = { 42 45 "dsa", 46 + "iax" 43 47 }; 44 48 45 49 const char *idxd_get_dev_name(struct idxd_device *idxd) ··· 61 53 struct idxd_irq_entry *irq_entry; 62 54 int i, msixcnt; 63 55 int rc = 0; 56 + union msix_perm mperm; 64 57 65 58 msixcnt = pci_msix_vec_count(pdev); 66 59 if (msixcnt < 0) { ··· 101 92 for (i = 0; i < msixcnt; i++) { 102 93 idxd->irq_entries[i].id = i; 103 94 idxd->irq_entries[i].idxd = idxd; 95 + spin_lock_init(&idxd->irq_entries[i].list_lock); 104 96 } 105 97 106 98 msix = &idxd->msix_entries[0]; ··· 140 130 } 141 131 142 132 idxd_unmask_error_interrupts(idxd); 133 + 134 + /* Setup MSIX permission table */ 135 + mperm.bits = 0; 136 + mperm.pasid = idxd->pasid; 137 + mperm.pasid_en = device_pasid_enabled(idxd); 138 + for (i = 1; i < msixcnt; i++) 139 + iowrite32(mperm.bits, idxd->reg_base + idxd->msix_perm_offset + i * 8); 143 140 144 141 return 0; 145 142 ··· 218 201 struct device *dev = &idxd->pdev->dev; 219 202 220 203 offsets.bits[0] = ioread64(idxd->reg_base + IDXD_TABLE_OFFSET); 221 - offsets.bits[1] = ioread64(idxd->reg_base + IDXD_TABLE_OFFSET 222 - + sizeof(u64)); 223 - idxd->grpcfg_offset = offsets.grpcfg * 0x100; 204 + offsets.bits[1] = ioread64(idxd->reg_base + IDXD_TABLE_OFFSET + sizeof(u64)); 205 + idxd->grpcfg_offset = offsets.grpcfg * IDXD_TABLE_MULT; 224 206 dev_dbg(dev, "IDXD Group Config Offset: %#x\n", idxd->grpcfg_offset); 225 - idxd->wqcfg_offset = offsets.wqcfg * 0x100; 226 - dev_dbg(dev, "IDXD Work Queue Config Offset: %#x\n", 227 - idxd->wqcfg_offset); 228 - idxd->msix_perm_offset = offsets.msix_perm * 0x100; 229 - dev_dbg(dev, "IDXD MSIX Permission Offset: %#x\n", 230 - idxd->msix_perm_offset); 231 - idxd->perfmon_offset = offsets.perfmon * 0x100; 207 + idxd->wqcfg_offset = offsets.wqcfg * IDXD_TABLE_MULT; 208 + dev_dbg(dev, "IDXD Work Queue Config Offset: %#x\n", idxd->wqcfg_offset); 209 + idxd->msix_perm_offset = offsets.msix_perm * IDXD_TABLE_MULT; 210 + dev_dbg(dev, "IDXD MSIX Permission Offset: %#x\n", idxd->msix_perm_offset); 211 + idxd->perfmon_offset = offsets.perfmon * IDXD_TABLE_MULT; 232 212 dev_dbg(dev, "IDXD Perfmon Offset: %#x\n", idxd->perfmon_offset); 233 213 } 234 214 ··· 279 265 } 280 266 } 281 267 282 - static struct idxd_device *idxd_alloc(struct pci_dev *pdev, 283 - void __iomem * const *iomap) 268 + static struct idxd_device *idxd_alloc(struct pci_dev *pdev) 284 269 { 285 270 struct device *dev = &pdev->dev; 286 271 struct idxd_device *idxd; ··· 289 276 return NULL; 290 277 291 278 idxd->pdev = pdev; 292 - idxd->reg_base = iomap[IDXD_MMIO_BAR]; 293 279 spin_lock_init(&idxd->dev_lock); 294 280 295 281 return idxd; 282 + } 283 + 284 + static int idxd_enable_system_pasid(struct idxd_device *idxd) 285 + { 286 + int flags; 287 + unsigned int pasid; 288 + struct iommu_sva *sva; 289 + 290 + flags = SVM_FLAG_SUPERVISOR_MODE; 291 + 292 + sva = iommu_sva_bind_device(&idxd->pdev->dev, NULL, &flags); 293 + if (IS_ERR(sva)) { 294 + dev_warn(&idxd->pdev->dev, 295 + "iommu sva bind failed: %ld\n", PTR_ERR(sva)); 296 + return PTR_ERR(sva); 297 + } 298 + 299 + pasid = iommu_sva_get_pasid(sva); 300 + if (pasid == IOMMU_PASID_INVALID) { 301 + iommu_sva_unbind_device(sva); 302 + return -ENODEV; 303 + } 304 + 305 + idxd->sva = sva; 306 + idxd->pasid = pasid; 307 + dev_dbg(&idxd->pdev->dev, "system pasid: %u\n", pasid); 308 + return 0; 309 + } 310 + 311 + static void idxd_disable_system_pasid(struct idxd_device *idxd) 312 + { 313 + 314 + iommu_sva_unbind_device(idxd->sva); 315 + idxd->sva = NULL; 296 316 } 297 317 298 318 static int idxd_probe(struct idxd_device *idxd) ··· 337 291 dev_dbg(dev, "%s entered and resetting device\n", __func__); 338 292 idxd_device_init_reset(idxd); 339 293 dev_dbg(dev, "IDXD reset complete\n"); 294 + 295 + if (IS_ENABLED(CONFIG_INTEL_IDXD_SVM)) { 296 + rc = idxd_enable_system_pasid(idxd); 297 + if (rc < 0) 298 + dev_warn(dev, "Failed to enable PASID. No SVA support: %d\n", rc); 299 + else 300 + set_bit(IDXD_FLAG_PASID_ENABLED, &idxd->flags); 301 + } 340 302 341 303 idxd_read_caps(idxd); 342 304 idxd_read_table_offsets(idxd); ··· 376 322 idxd_mask_error_interrupts(idxd); 377 323 idxd_mask_msix_vectors(idxd); 378 324 err_setup: 325 + if (device_pasid_enabled(idxd)) 326 + idxd_disable_system_pasid(idxd); 379 327 return rc; 328 + } 329 + 330 + static void idxd_type_init(struct idxd_device *idxd) 331 + { 332 + if (idxd->type == IDXD_TYPE_DSA) 333 + idxd->compl_size = sizeof(struct dsa_completion_record); 334 + else if (idxd->type == IDXD_TYPE_IAX) 335 + idxd->compl_size = sizeof(struct iax_completion_record); 380 336 } 381 337 382 338 static int idxd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) 383 339 { 384 - void __iomem * const *iomap; 385 340 struct device *dev = &pdev->dev; 386 341 struct idxd_device *idxd; 387 342 int rc; 388 - unsigned int mask; 389 343 390 344 rc = pcim_enable_device(pdev); 391 345 if (rc) 392 346 return rc; 393 347 394 - dev_dbg(dev, "Mapping BARs\n"); 395 - mask = (1 << IDXD_MMIO_BAR); 396 - rc = pcim_iomap_regions(pdev, mask, DRV_NAME); 397 - if (rc) 398 - return rc; 348 + dev_dbg(dev, "Alloc IDXD context\n"); 349 + idxd = idxd_alloc(pdev); 350 + if (!idxd) 351 + return -ENOMEM; 399 352 400 - iomap = pcim_iomap_table(pdev); 401 - if (!iomap) 353 + dev_dbg(dev, "Mapping BARs\n"); 354 + idxd->reg_base = pcim_iomap(pdev, IDXD_MMIO_BAR, 0); 355 + if (!idxd->reg_base) 402 356 return -ENOMEM; 403 357 404 358 dev_dbg(dev, "Set DMA masks\n"); ··· 422 360 if (rc) 423 361 return rc; 424 362 425 - dev_dbg(dev, "Alloc IDXD context\n"); 426 - idxd = idxd_alloc(pdev, iomap); 427 - if (!idxd) 428 - return -ENOMEM; 429 - 430 363 idxd_set_type(idxd); 364 + 365 + idxd_type_init(idxd); 431 366 432 367 dev_dbg(dev, "Set PCI master\n"); 433 368 pci_set_master(pdev); ··· 511 452 dev_dbg(&pdev->dev, "%s called\n", __func__); 512 453 idxd_cleanup_sysfs(idxd); 513 454 idxd_shutdown(pdev); 455 + if (device_pasid_enabled(idxd)) 456 + idxd_disable_system_pasid(idxd); 514 457 mutex_lock(&idxd_idr_lock); 515 458 idr_remove(&idxd_idrs[idxd->type], idxd->id); 516 459 mutex_unlock(&idxd_idr_lock); ··· 531 470 int err, i; 532 471 533 472 /* 534 - * If the CPU does not support write512, there's no point in 473 + * If the CPU does not support MOVDIR64B or ENQCMDS, there's no point in 535 474 * enumerating the device. We can not utilize it. 536 475 */ 537 476 if (!boot_cpu_has(X86_FEATURE_MOVDIR64B)) { ··· 539 478 return -ENODEV; 540 479 } 541 480 542 - pr_info("%s: Intel(R) Accelerator Devices Driver %s\n", 543 - DRV_NAME, IDXD_DRIVER_VERSION); 481 + if (!boot_cpu_has(X86_FEATURE_ENQCMD)) 482 + pr_warn("Platform does not have ENQCMD(S) support.\n"); 483 + else 484 + support_enqcmd = true; 544 485 545 486 mutex_init(&idxd_idr_lock); 546 487 for (i = 0; i < IDXD_TYPE_MAX; i++)
+134 -12
drivers/dma/idxd/irq.c
··· 11 11 #include "idxd.h" 12 12 #include "registers.h" 13 13 14 + enum irq_work_type { 15 + IRQ_WORK_NORMAL = 0, 16 + IRQ_WORK_PROCESS_FAULT, 17 + }; 18 + 19 + struct idxd_fault { 20 + struct work_struct work; 21 + u64 addr; 22 + struct idxd_device *idxd; 23 + }; 24 + 25 + static int irq_process_work_list(struct idxd_irq_entry *irq_entry, 26 + enum irq_work_type wtype, 27 + int *processed, u64 data); 28 + static int irq_process_pending_llist(struct idxd_irq_entry *irq_entry, 29 + enum irq_work_type wtype, 30 + int *processed, u64 data); 31 + 14 32 static void idxd_device_reinit(struct work_struct *work) 15 33 { 16 34 struct idxd_device *idxd = container_of(work, struct idxd_device, work); ··· 60 42 61 43 out: 62 44 idxd_device_wqs_clear_state(idxd); 45 + } 46 + 47 + static void idxd_device_fault_work(struct work_struct *work) 48 + { 49 + struct idxd_fault *fault = container_of(work, struct idxd_fault, work); 50 + struct idxd_irq_entry *ie; 51 + int i; 52 + int processed; 53 + int irqcnt = fault->idxd->num_wq_irqs + 1; 54 + 55 + for (i = 1; i < irqcnt; i++) { 56 + ie = &fault->idxd->irq_entries[i]; 57 + irq_process_work_list(ie, IRQ_WORK_PROCESS_FAULT, 58 + &processed, fault->addr); 59 + if (processed) 60 + break; 61 + 62 + irq_process_pending_llist(ie, IRQ_WORK_PROCESS_FAULT, 63 + &processed, fault->addr); 64 + if (processed) 65 + break; 66 + } 67 + 68 + kfree(fault); 69 + } 70 + 71 + static int idxd_device_schedule_fault_process(struct idxd_device *idxd, 72 + u64 fault_addr) 73 + { 74 + struct idxd_fault *fault; 75 + 76 + fault = kmalloc(sizeof(*fault), GFP_ATOMIC); 77 + if (!fault) 78 + return -ENOMEM; 79 + 80 + fault->addr = fault_addr; 81 + fault->idxd = idxd; 82 + INIT_WORK(&fault->work, idxd_device_fault_work); 83 + queue_work(idxd->wq, &fault->work); 84 + return 0; 63 85 } 64 86 65 87 irqreturn_t idxd_irq_handler(int vec, void *data) ··· 183 125 if (!err) 184 126 goto out; 185 127 128 + /* 129 + * This case should rarely happen and typically is due to software 130 + * programming error by the driver. 131 + */ 132 + if (idxd->sw_err.valid && 133 + idxd->sw_err.desc_valid && 134 + idxd->sw_err.fault_addr) 135 + idxd_device_schedule_fault_process(idxd, idxd->sw_err.fault_addr); 136 + 186 137 gensts.bits = ioread32(idxd->reg_base + IDXD_GENSTATS_OFFSET); 187 138 if (gensts.state == IDXD_DEVICE_STATE_HALT) { 188 139 idxd->state = IDXD_DEV_HALTED; ··· 219 152 return IRQ_HANDLED; 220 153 } 221 154 155 + static bool process_fault(struct idxd_desc *desc, u64 fault_addr) 156 + { 157 + /* 158 + * Completion address can be bad as well. Check fault address match for descriptor 159 + * and completion address. 160 + */ 161 + if ((u64)desc->hw == fault_addr || 162 + (u64)desc->completion == fault_addr) { 163 + idxd_dma_complete_txd(desc, IDXD_COMPLETE_DEV_FAIL); 164 + return true; 165 + } 166 + 167 + return false; 168 + } 169 + 170 + static bool complete_desc(struct idxd_desc *desc) 171 + { 172 + if (desc->completion->status) { 173 + idxd_dma_complete_txd(desc, IDXD_COMPLETE_NORMAL); 174 + return true; 175 + } 176 + 177 + return false; 178 + } 179 + 222 180 static int irq_process_pending_llist(struct idxd_irq_entry *irq_entry, 223 - int *processed) 181 + enum irq_work_type wtype, 182 + int *processed, u64 data) 224 183 { 225 184 struct idxd_desc *desc, *t; 226 185 struct llist_node *head; 227 186 int queued = 0; 187 + bool completed = false; 188 + unsigned long flags; 228 189 229 190 *processed = 0; 230 191 head = llist_del_all(&irq_entry->pending_llist); 231 192 if (!head) 232 - return 0; 193 + goto out; 233 194 234 195 llist_for_each_entry_safe(desc, t, head, llnode) { 235 - if (desc->completion->status) { 236 - idxd_dma_complete_txd(desc, IDXD_COMPLETE_NORMAL); 196 + if (wtype == IRQ_WORK_NORMAL) 197 + completed = complete_desc(desc); 198 + else if (wtype == IRQ_WORK_PROCESS_FAULT) 199 + completed = process_fault(desc, data); 200 + 201 + if (completed) { 237 202 idxd_free_desc(desc->wq, desc); 238 203 (*processed)++; 204 + if (wtype == IRQ_WORK_PROCESS_FAULT) 205 + break; 239 206 } else { 240 - list_add_tail(&desc->list, &irq_entry->work_list); 207 + spin_lock_irqsave(&irq_entry->list_lock, flags); 208 + list_add_tail(&desc->list, 209 + &irq_entry->work_list); 210 + spin_unlock_irqrestore(&irq_entry->list_lock, flags); 241 211 queued++; 242 212 } 243 213 } 244 214 215 + out: 245 216 return queued; 246 217 } 247 218 248 219 static int irq_process_work_list(struct idxd_irq_entry *irq_entry, 249 - int *processed) 220 + enum irq_work_type wtype, 221 + int *processed, u64 data) 250 222 { 251 223 struct list_head *node, *next; 252 224 int queued = 0; 225 + bool completed = false; 226 + unsigned long flags; 253 227 254 228 *processed = 0; 229 + spin_lock_irqsave(&irq_entry->list_lock, flags); 255 230 if (list_empty(&irq_entry->work_list)) 256 - return 0; 231 + goto out; 257 232 258 233 list_for_each_safe(node, next, &irq_entry->work_list) { 259 234 struct idxd_desc *desc = 260 235 container_of(node, struct idxd_desc, list); 261 236 262 - if (desc->completion->status) { 237 + spin_unlock_irqrestore(&irq_entry->list_lock, flags); 238 + if (wtype == IRQ_WORK_NORMAL) 239 + completed = complete_desc(desc); 240 + else if (wtype == IRQ_WORK_PROCESS_FAULT) 241 + completed = process_fault(desc, data); 242 + 243 + if (completed) { 244 + spin_lock_irqsave(&irq_entry->list_lock, flags); 263 245 list_del(&desc->list); 264 - /* process and callback */ 265 - idxd_dma_complete_txd(desc, IDXD_COMPLETE_NORMAL); 246 + spin_unlock_irqrestore(&irq_entry->list_lock, flags); 266 247 idxd_free_desc(desc->wq, desc); 267 248 (*processed)++; 249 + if (wtype == IRQ_WORK_PROCESS_FAULT) 250 + return queued; 268 251 } else { 269 252 queued++; 270 253 } 254 + spin_lock_irqsave(&irq_entry->list_lock, flags); 271 255 } 272 256 257 + out: 258 + spin_unlock_irqrestore(&irq_entry->list_lock, flags); 273 259 return queued; 274 260 } 275 261 ··· 350 230 * 5. Repeat until no more descriptors. 351 231 */ 352 232 do { 353 - rc = irq_process_work_list(irq_entry, &processed); 233 + rc = irq_process_work_list(irq_entry, IRQ_WORK_NORMAL, 234 + &processed, 0); 354 235 total += processed; 355 236 if (rc != 0) 356 237 continue; 357 238 358 - rc = irq_process_pending_llist(irq_entry, &processed); 239 + rc = irq_process_pending_llist(irq_entry, IRQ_WORK_NORMAL, 240 + &processed, 0); 359 241 total += processed; 360 242 } while (rc != 0); 361 243
+26 -2
drivers/dma/idxd/registers.h
··· 5 5 6 6 /* PCI Config */ 7 7 #define PCI_DEVICE_ID_INTEL_DSA_SPR0 0x0b25 8 + #define PCI_DEVICE_ID_INTEL_IAX_SPR0 0x0cfe 8 9 9 10 #define IDXD_MMIO_BAR 0 10 11 #define IDXD_WQ_BAR 2 ··· 48 47 u64 rsvd:20; 49 48 u64 shared_mode:1; 50 49 u64 dedicated_mode:1; 51 - u64 rsvd2:1; 50 + u64 wq_ats_support:1; 52 51 u64 priority:1; 53 52 u64 occupancy:1; 54 53 u64 occupancy_int:1; ··· 102 101 }; 103 102 u64 bits[2]; 104 103 } __packed; 104 + 105 + #define IDXD_TABLE_MULT 0x100 105 106 106 107 #define IDXD_GENCFG_OFFSET 0x80 107 108 union gencfg_reg { ··· 304 301 /* bytes 8-11 */ 305 302 u32 mode:1; /* shared or dedicated */ 306 303 u32 bof:1; /* block on fault */ 307 - u32 rsvd2:2; 304 + u32 wq_ats_disable:1; 305 + u32 rsvd2:1; 308 306 u32 priority:4; 309 307 u32 pasid:20; 310 308 u32 pasid_en:1; ··· 340 336 u32 bits[8]; 341 337 } __packed; 342 338 339 + #define WQCFG_PASID_IDX 2 340 + 343 341 /* 344 342 * This macro calculates the offset into the WQCFG register 345 343 * idxd - struct idxd * ··· 359 353 }) 360 354 361 355 #define WQCFG_STRIDES(_idxd_dev) ((_idxd_dev)->wqcfg_size / sizeof(u32)) 356 + 357 + #define GRPCFG_SIZE 64 358 + #define GRPWQCFG_STRIDES 4 359 + 360 + /* 361 + * This macro calculates the offset into the GRPCFG register 362 + * idxd - struct idxd * 363 + * n - wq id 364 + * ofs - the index of the 32b dword for the config register 365 + * 366 + * The WQCFG register block is divided into groups per each wq. The n index 367 + * allows us to move to the register group that's for that particular wq. 368 + * Each register is 32bits. The ofs gives us the number of register to access. 369 + */ 370 + #define GRPWQCFG_OFFSET(idxd_dev, n, ofs) ((idxd_dev)->grpcfg_offset +\ 371 + (n) * GRPCFG_SIZE + sizeof(u64) * (ofs)) 372 + #define GRPENGCFG_OFFSET(idxd_dev, n) ((idxd_dev)->grpcfg_offset + (n) * GRPCFG_SIZE + 32) 373 + #define GRPFLGCFG_OFFSET(idxd_dev, n) ((idxd_dev)->grpcfg_offset + (n) * GRPCFG_SIZE + 40) 362 374 363 375 #endif
+31 -6
drivers/dma/idxd/submit.c
··· 11 11 static struct idxd_desc *__get_desc(struct idxd_wq *wq, int idx, int cpu) 12 12 { 13 13 struct idxd_desc *desc; 14 + struct idxd_device *idxd = wq->idxd; 14 15 15 16 desc = wq->descs[idx]; 16 17 memset(desc->hw, 0, sizeof(struct dsa_hw_desc)); 17 - memset(desc->completion, 0, sizeof(struct dsa_completion_record)); 18 + memset(desc->completion, 0, idxd->compl_size); 18 19 desc->cpu = cpu; 20 + 21 + if (device_pasid_enabled(idxd)) 22 + desc->hw->pasid = idxd->pasid; 23 + 24 + /* 25 + * Descriptor completion vectors are 1-8 for MSIX. We will round 26 + * robin through the 8 vectors. 27 + */ 28 + wq->vec_ptr = (wq->vec_ptr % idxd->num_wq_irqs) + 1; 29 + desc->hw->int_handle = wq->vec_ptr; 19 30 return desc; 20 31 } 21 32 ··· 81 70 struct idxd_device *idxd = wq->idxd; 82 71 int vec = desc->hw->int_handle; 83 72 void __iomem *portal; 73 + int rc; 84 74 85 75 if (idxd->state != IDXD_DEV_ENABLED) 86 76 return -EIO; 87 77 88 - portal = wq->dportal; 78 + portal = wq->portal; 79 + 89 80 /* 90 - * The wmb() flushes writes to coherent DMA data before possibly 91 - * triggering a DMA read. The wmb() is necessary even on UP because 92 - * the recipient is a device. 81 + * The wmb() flushes writes to coherent DMA data before 82 + * possibly triggering a DMA read. The wmb() is necessary 83 + * even on UP because the recipient is a device. 93 84 */ 94 85 wmb(); 95 - iosubmit_cmds512(portal, desc->hw, 1); 86 + if (wq_dedicated(wq)) { 87 + iosubmit_cmds512(portal, desc->hw, 1); 88 + } else { 89 + /* 90 + * It's not likely that we would receive queue full rejection 91 + * since the descriptor allocation gates at wq size. If we 92 + * receive a -EAGAIN, that means something went wrong such as the 93 + * device is not accepting descriptor at all. 94 + */ 95 + rc = enqcmds(portal, desc->hw); 96 + if (rc < 0) 97 + return rc; 98 + } 96 99 97 100 /* 98 101 * Pending the descriptor to the lockless list for the irq_entry
+204 -3
drivers/dma/idxd/sysfs.c
··· 41 41 .release = idxd_conf_device_release, 42 42 }; 43 43 44 + static struct device_type iax_device_type = { 45 + .name = "iax", 46 + .release = idxd_conf_device_release, 47 + }; 48 + 44 49 static inline bool is_dsa_dev(struct device *dev) 45 50 { 46 51 return dev ? dev->type == &dsa_device_type : false; 47 52 } 48 53 54 + static inline bool is_iax_dev(struct device *dev) 55 + { 56 + return dev ? dev->type == &iax_device_type : false; 57 + } 58 + 49 59 static inline bool is_idxd_dev(struct device *dev) 50 60 { 51 - return is_dsa_dev(dev); 61 + return is_dsa_dev(dev) || is_iax_dev(dev); 52 62 } 53 63 54 64 static inline bool is_idxd_wq_dev(struct device *dev) ··· 183 173 mutex_unlock(&wq->wq_lock); 184 174 dev_warn(dev, "WQ name not set.\n"); 185 175 return -EINVAL; 176 + } 177 + 178 + /* Shared WQ checks */ 179 + if (wq_shared(wq)) { 180 + if (!device_swq_supported(idxd)) { 181 + dev_warn(dev, 182 + "PASID not enabled and shared WQ.\n"); 183 + mutex_unlock(&wq->wq_lock); 184 + return -ENXIO; 185 + } 186 + /* 187 + * Shared wq with the threshold set to 0 means the user 188 + * did not set the threshold or transitioned from a 189 + * dedicated wq but did not set threshold. A value 190 + * of 0 would effectively disable the shared wq. The 191 + * driver does not allow a value of 0 to be set for 192 + * threshold via sysfs. 193 + */ 194 + if (wq->threshold == 0) { 195 + dev_warn(dev, 196 + "Shared WQ and threshold 0.\n"); 197 + mutex_unlock(&wq->wq_lock); 198 + return -EINVAL; 199 + } 186 200 } 187 201 188 202 rc = idxd_wq_alloc_resources(wq); ··· 369 335 .shutdown = idxd_config_bus_shutdown, 370 336 }; 371 337 338 + struct bus_type iax_bus_type = { 339 + .name = "iax", 340 + .match = idxd_config_bus_match, 341 + .probe = idxd_config_bus_probe, 342 + .remove = idxd_config_bus_remove, 343 + .shutdown = idxd_config_bus_shutdown, 344 + }; 345 + 372 346 static struct bus_type *idxd_bus_types[] = { 373 - &dsa_bus_type 347 + &dsa_bus_type, 348 + &iax_bus_type 374 349 }; 375 350 376 351 static struct idxd_device_driver dsa_drv = { ··· 391 348 }, 392 349 }; 393 350 351 + static struct idxd_device_driver iax_drv = { 352 + .drv = { 353 + .name = "iax", 354 + .bus = &iax_bus_type, 355 + .owner = THIS_MODULE, 356 + .mod_name = KBUILD_MODNAME, 357 + }, 358 + }; 359 + 394 360 static struct idxd_device_driver *idxd_drvs[] = { 395 - &dsa_drv 361 + &dsa_drv, 362 + &iax_drv 396 363 }; 397 364 398 365 struct bus_type *idxd_get_bus_type(struct idxd_device *idxd) ··· 414 361 { 415 362 if (idxd->type == IDXD_TYPE_DSA) 416 363 return &dsa_device_type; 364 + else if (idxd->type == IDXD_TYPE_IAX) 365 + return &iax_device_type; 417 366 else 418 367 return NULL; 419 368 } ··· 556 501 if (rc < 0) 557 502 return -EINVAL; 558 503 504 + if (idxd->type == IDXD_TYPE_IAX) 505 + return -EOPNOTSUPP; 506 + 559 507 if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags)) 560 508 return -EPERM; 561 509 ··· 604 546 if (rc < 0) 605 547 return -EINVAL; 606 548 549 + if (idxd->type == IDXD_TYPE_IAX) 550 + return -EOPNOTSUPP; 551 + 607 552 if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags)) 608 553 return -EPERM; 609 554 ··· 648 587 rc = kstrtoul(buf, 10, &val); 649 588 if (rc < 0) 650 589 return -EINVAL; 590 + 591 + if (idxd->type == IDXD_TYPE_IAX) 592 + return -EOPNOTSUPP; 651 593 652 594 if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags)) 653 595 return -EPERM; ··· 939 875 if (sysfs_streq(buf, "dedicated")) { 940 876 set_bit(WQ_FLAG_DEDICATED, &wq->flags); 941 877 wq->threshold = 0; 878 + } else if (sysfs_streq(buf, "shared") && device_swq_supported(idxd)) { 879 + clear_bit(WQ_FLAG_DEDICATED, &wq->flags); 942 880 } else { 943 881 return -EINVAL; 944 882 } ··· 1039 973 static struct device_attribute dev_attr_wq_priority = 1040 974 __ATTR(priority, 0644, wq_priority_show, wq_priority_store); 1041 975 976 + static ssize_t wq_block_on_fault_show(struct device *dev, 977 + struct device_attribute *attr, char *buf) 978 + { 979 + struct idxd_wq *wq = container_of(dev, struct idxd_wq, conf_dev); 980 + 981 + return sprintf(buf, "%u\n", 982 + test_bit(WQ_FLAG_BLOCK_ON_FAULT, &wq->flags)); 983 + } 984 + 985 + static ssize_t wq_block_on_fault_store(struct device *dev, 986 + struct device_attribute *attr, 987 + const char *buf, size_t count) 988 + { 989 + struct idxd_wq *wq = container_of(dev, struct idxd_wq, conf_dev); 990 + struct idxd_device *idxd = wq->idxd; 991 + bool bof; 992 + int rc; 993 + 994 + if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags)) 995 + return -EPERM; 996 + 997 + if (wq->state != IDXD_WQ_DISABLED) 998 + return -ENXIO; 999 + 1000 + rc = kstrtobool(buf, &bof); 1001 + if (rc < 0) 1002 + return rc; 1003 + 1004 + if (bof) 1005 + set_bit(WQ_FLAG_BLOCK_ON_FAULT, &wq->flags); 1006 + else 1007 + clear_bit(WQ_FLAG_BLOCK_ON_FAULT, &wq->flags); 1008 + 1009 + return count; 1010 + } 1011 + 1012 + static struct device_attribute dev_attr_wq_block_on_fault = 1013 + __ATTR(block_on_fault, 0644, wq_block_on_fault_show, 1014 + wq_block_on_fault_store); 1015 + 1016 + static ssize_t wq_threshold_show(struct device *dev, 1017 + struct device_attribute *attr, char *buf) 1018 + { 1019 + struct idxd_wq *wq = container_of(dev, struct idxd_wq, conf_dev); 1020 + 1021 + return sprintf(buf, "%u\n", wq->threshold); 1022 + } 1023 + 1024 + static ssize_t wq_threshold_store(struct device *dev, 1025 + struct device_attribute *attr, 1026 + const char *buf, size_t count) 1027 + { 1028 + struct idxd_wq *wq = container_of(dev, struct idxd_wq, conf_dev); 1029 + struct idxd_device *idxd = wq->idxd; 1030 + unsigned int val; 1031 + int rc; 1032 + 1033 + rc = kstrtouint(buf, 0, &val); 1034 + if (rc < 0) 1035 + return -EINVAL; 1036 + 1037 + if (val > wq->size || val <= 0) 1038 + return -EINVAL; 1039 + 1040 + if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags)) 1041 + return -EPERM; 1042 + 1043 + if (wq->state != IDXD_WQ_DISABLED) 1044 + return -ENXIO; 1045 + 1046 + if (test_bit(WQ_FLAG_DEDICATED, &wq->flags)) 1047 + return -EINVAL; 1048 + 1049 + wq->threshold = val; 1050 + 1051 + return count; 1052 + } 1053 + 1054 + static struct device_attribute dev_attr_wq_threshold = 1055 + __ATTR(threshold, 0644, wq_threshold_show, wq_threshold_store); 1056 + 1042 1057 static ssize_t wq_type_show(struct device *dev, 1043 1058 struct device_attribute *attr, char *buf) 1044 1059 { ··· 1190 1043 1191 1044 if (strlen(buf) > WQ_NAME_SIZE || strlen(buf) == 0) 1192 1045 return -EINVAL; 1046 + 1047 + /* 1048 + * This is temporarily placed here until we have SVM support for 1049 + * dmaengine. 1050 + */ 1051 + if (wq->type == IDXD_WQT_KERNEL && device_pasid_enabled(wq->idxd)) 1052 + return -EOPNOTSUPP; 1193 1053 1194 1054 memset(wq->name, 0, WQ_NAME_SIZE + 1); 1195 1055 strncpy(wq->name, buf, WQ_NAME_SIZE); ··· 1301 1147 static struct device_attribute dev_attr_wq_max_batch_size = 1302 1148 __ATTR(max_batch_size, 0644, wq_max_batch_size_show, wq_max_batch_size_store); 1303 1149 1150 + static ssize_t wq_ats_disable_show(struct device *dev, struct device_attribute *attr, char *buf) 1151 + { 1152 + struct idxd_wq *wq = container_of(dev, struct idxd_wq, conf_dev); 1153 + 1154 + return sprintf(buf, "%u\n", wq->ats_dis); 1155 + } 1156 + 1157 + static ssize_t wq_ats_disable_store(struct device *dev, struct device_attribute *attr, 1158 + const char *buf, size_t count) 1159 + { 1160 + struct idxd_wq *wq = container_of(dev, struct idxd_wq, conf_dev); 1161 + struct idxd_device *idxd = wq->idxd; 1162 + bool ats_dis; 1163 + int rc; 1164 + 1165 + if (wq->state != IDXD_WQ_DISABLED) 1166 + return -EPERM; 1167 + 1168 + if (!idxd->hw.wq_cap.wq_ats_support) 1169 + return -EOPNOTSUPP; 1170 + 1171 + rc = kstrtobool(buf, &ats_dis); 1172 + if (rc < 0) 1173 + return rc; 1174 + 1175 + wq->ats_dis = ats_dis; 1176 + 1177 + return count; 1178 + } 1179 + 1180 + static struct device_attribute dev_attr_wq_ats_disable = 1181 + __ATTR(ats_disable, 0644, wq_ats_disable_show, wq_ats_disable_store); 1182 + 1304 1183 static struct attribute *idxd_wq_attributes[] = { 1305 1184 &dev_attr_wq_clients.attr, 1306 1185 &dev_attr_wq_state.attr, ··· 1341 1154 &dev_attr_wq_mode.attr, 1342 1155 &dev_attr_wq_size.attr, 1343 1156 &dev_attr_wq_priority.attr, 1157 + &dev_attr_wq_block_on_fault.attr, 1158 + &dev_attr_wq_threshold.attr, 1344 1159 &dev_attr_wq_type.attr, 1345 1160 &dev_attr_wq_name.attr, 1346 1161 &dev_attr_wq_cdev_minor.attr, 1347 1162 &dev_attr_wq_max_transfer_size.attr, 1348 1163 &dev_attr_wq_max_batch_size.attr, 1164 + &dev_attr_wq_ats_disable.attr, 1349 1165 NULL, 1350 1166 }; 1351 1167 ··· 1495 1305 } 1496 1306 static DEVICE_ATTR_RO(clients); 1497 1307 1308 + static ssize_t pasid_enabled_show(struct device *dev, 1309 + struct device_attribute *attr, char *buf) 1310 + { 1311 + struct idxd_device *idxd = 1312 + container_of(dev, struct idxd_device, conf_dev); 1313 + 1314 + return sprintf(buf, "%u\n", device_pasid_enabled(idxd)); 1315 + } 1316 + static DEVICE_ATTR_RO(pasid_enabled); 1317 + 1498 1318 static ssize_t state_show(struct device *dev, 1499 1319 struct device_attribute *attr, char *buf) 1500 1320 { ··· 1624 1424 &dev_attr_gen_cap.attr, 1625 1425 &dev_attr_configurable.attr, 1626 1426 &dev_attr_clients.attr, 1427 + &dev_attr_pasid_enabled.attr, 1627 1428 &dev_attr_state.attr, 1628 1429 &dev_attr_errors.attr, 1629 1430 &dev_attr_max_tokens.attr,
+4 -29
drivers/dma/imx-dma.c
··· 191 191 int request; 192 192 }; 193 193 194 - static const struct platform_device_id imx_dma_devtype[] = { 195 - { 196 - .name = "imx1-dma", 197 - .driver_data = IMX1_DMA, 198 - }, { 199 - .name = "imx21-dma", 200 - .driver_data = IMX21_DMA, 201 - }, { 202 - .name = "imx27-dma", 203 - .driver_data = IMX27_DMA, 204 - }, { 205 - /* sentinel */ 206 - } 207 - }; 208 - MODULE_DEVICE_TABLE(platform, imx_dma_devtype); 209 - 210 194 static const struct of_device_id imx_dma_of_dev_id[] = { 211 195 { 212 - .compatible = "fsl,imx1-dma", 213 - .data = &imx_dma_devtype[IMX1_DMA], 196 + .compatible = "fsl,imx1-dma", .data = (const void *)IMX1_DMA, 214 197 }, { 215 - .compatible = "fsl,imx21-dma", 216 - .data = &imx_dma_devtype[IMX21_DMA], 198 + .compatible = "fsl,imx21-dma", .data = (const void *)IMX21_DMA, 217 199 }, { 218 - .compatible = "fsl,imx27-dma", 219 - .data = &imx_dma_devtype[IMX27_DMA], 200 + .compatible = "fsl,imx27-dma", .data = (const void *)IMX27_DMA, 220 201 }, { 221 202 /* sentinel */ 222 203 } ··· 1037 1056 { 1038 1057 struct imxdma_engine *imxdma; 1039 1058 struct resource *res; 1040 - const struct of_device_id *of_id; 1041 1059 int ret, i; 1042 1060 int irq, irq_err; 1043 - 1044 - of_id = of_match_device(imx_dma_of_dev_id, &pdev->dev); 1045 - if (of_id) 1046 - pdev->id_entry = of_id->data; 1047 1061 1048 1062 imxdma = devm_kzalloc(&pdev->dev, sizeof(*imxdma), GFP_KERNEL); 1049 1063 if (!imxdma) 1050 1064 return -ENOMEM; 1051 1065 1052 1066 imxdma->dev = &pdev->dev; 1053 - imxdma->devtype = pdev->id_entry->driver_data; 1067 + imxdma->devtype = (enum imx_dma_type)of_device_get_match_data(&pdev->dev); 1054 1068 1055 1069 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1056 1070 imxdma->base = devm_ioremap_resource(&pdev->dev, res); ··· 1239 1263 .name = "imx-dma", 1240 1264 .of_match_table = imx_dma_of_dev_id, 1241 1265 }, 1242 - .id_table = imx_dma_devtype, 1243 1266 .remove = imxdma_remove, 1244 1267 }; 1245 1268
+1 -37
drivers/dma/imx-sdma.c
··· 566 566 .check_ratio = 1, 567 567 }; 568 568 569 - static const struct platform_device_id sdma_devtypes[] = { 570 - { 571 - .name = "imx25-sdma", 572 - .driver_data = (unsigned long)&sdma_imx25, 573 - }, { 574 - .name = "imx31-sdma", 575 - .driver_data = (unsigned long)&sdma_imx31, 576 - }, { 577 - .name = "imx35-sdma", 578 - .driver_data = (unsigned long)&sdma_imx35, 579 - }, { 580 - .name = "imx51-sdma", 581 - .driver_data = (unsigned long)&sdma_imx51, 582 - }, { 583 - .name = "imx53-sdma", 584 - .driver_data = (unsigned long)&sdma_imx53, 585 - }, { 586 - .name = "imx6q-sdma", 587 - .driver_data = (unsigned long)&sdma_imx6q, 588 - }, { 589 - .name = "imx7d-sdma", 590 - .driver_data = (unsigned long)&sdma_imx7d, 591 - }, { 592 - .name = "imx8mq-sdma", 593 - .driver_data = (unsigned long)&sdma_imx8mq, 594 - }, { 595 - /* sentinel */ 596 - } 597 - }; 598 - MODULE_DEVICE_TABLE(platform, sdma_devtypes); 599 - 600 569 static const struct of_device_id sdma_dt_ids[] = { 601 570 { .compatible = "fsl,imx6q-sdma", .data = &sdma_imx6q, }, 602 571 { .compatible = "fsl,imx53-sdma", .data = &sdma_imx53, }, ··· 1967 1998 s32 *saddr_arr; 1968 1999 const struct sdma_driver_data *drvdata = NULL; 1969 2000 1970 - if (of_id) 1971 - drvdata = of_id->data; 1972 - else if (pdev->id_entry) 1973 - drvdata = (void *)pdev->id_entry->driver_data; 1974 - 2001 + drvdata = of_id->data; 1975 2002 if (!drvdata) { 1976 2003 dev_err(&pdev->dev, "unable to find driver data\n"); 1977 2004 return -EINVAL; ··· 2176 2211 .name = "imx-sdma", 2177 2212 .of_match_table = sdma_dt_ids, 2178 2213 }, 2179 - .id_table = sdma_devtypes, 2180 2214 .remove = sdma_remove, 2181 2215 .probe = sdma_probe, 2182 2216 };
+5 -6
drivers/dma/ipu/ipu_idmac.c
··· 1160 1160 struct idmac_tx_desc *desc, *descnew; 1161 1161 bool done = false; 1162 1162 u32 ready0, ready1, curbuf, err; 1163 - unsigned long flags; 1164 1163 struct dmaengine_desc_callback cb; 1165 1164 1166 1165 /* IDMAC has cleared the respective BUFx_RDY bit, we manage the buffer */ 1167 1166 1168 1167 dev_dbg(dev, "IDMAC irq %d, buf %d\n", irq, ichan->active_buffer); 1169 1168 1170 - spin_lock_irqsave(&ipu_data.lock, flags); 1169 + spin_lock(&ipu_data.lock); 1171 1170 1172 1171 ready0 = idmac_read_ipureg(&ipu_data, IPU_CHA_BUF0_RDY); 1173 1172 ready1 = idmac_read_ipureg(&ipu_data, IPU_CHA_BUF1_RDY); ··· 1175 1176 1176 1177 if (err & (1 << chan_id)) { 1177 1178 idmac_write_ipureg(&ipu_data, 1 << chan_id, IPU_INT_STAT_4); 1178 - spin_unlock_irqrestore(&ipu_data.lock, flags); 1179 + spin_unlock(&ipu_data.lock); 1179 1180 /* 1180 1181 * Doing this 1181 1182 * ichan->sg[0] = ichan->sg[1] = NULL; ··· 1187 1188 chan_id, ready0, ready1, curbuf); 1188 1189 return IRQ_HANDLED; 1189 1190 } 1190 - spin_unlock_irqrestore(&ipu_data.lock, flags); 1191 + spin_unlock(&ipu_data.lock); 1191 1192 1192 1193 /* Other interrupts do not interfere with this channel */ 1193 1194 spin_lock(&ichan->lock); ··· 1250 1251 if (unlikely(sgnew)) { 1251 1252 ipu_submit_buffer(ichan, descnew, sgnew, !ichan->active_buffer); 1252 1253 } else { 1253 - spin_lock_irqsave(&ipu_data.lock, flags); 1254 + spin_lock(&ipu_data.lock); 1254 1255 ipu_ic_disable_task(&ipu_data, chan_id); 1255 - spin_unlock_irqrestore(&ipu_data.lock, flags); 1256 + spin_unlock(&ipu_data.lock); 1256 1257 ichan->status = IPU_CHANNEL_READY; 1257 1258 /* Continue to check for complete descriptor */ 1258 1259 }
+4 -5
drivers/dma/k3dma.c
··· 223 223 i = __ffs(stat); 224 224 stat &= ~BIT(i); 225 225 if (likely(tc1 & BIT(i)) || (tc2 & BIT(i))) { 226 - unsigned long flags; 227 226 228 227 p = &d->phy[i]; 229 228 c = p->vchan; 230 229 if (c && (tc1 & BIT(i))) { 231 - spin_lock_irqsave(&c->vc.lock, flags); 230 + spin_lock(&c->vc.lock); 232 231 if (p->ds_run != NULL) { 233 232 vchan_cookie_complete(&p->ds_run->vd); 234 233 p->ds_done = p->ds_run; 235 234 p->ds_run = NULL; 236 235 } 237 - spin_unlock_irqrestore(&c->vc.lock, flags); 236 + spin_unlock(&c->vc.lock); 238 237 } 239 238 if (c && (tc2 & BIT(i))) { 240 - spin_lock_irqsave(&c->vc.lock, flags); 239 + spin_lock(&c->vc.lock); 241 240 if (p->ds_run != NULL) 242 241 vchan_cyclic_callback(&p->ds_run->vd); 243 - spin_unlock_irqrestore(&c->vc.lock, flags); 242 + spin_unlock(&c->vc.lock); 244 243 } 245 244 irq_chan |= BIT(i); 246 245 }
+2 -3
drivers/dma/milbeaut-xdmac.c
··· 160 160 { 161 161 struct milbeaut_xdmac_chan *mc = dev_id; 162 162 struct milbeaut_xdmac_desc *md; 163 - unsigned long flags; 164 163 u32 val; 165 164 166 - spin_lock_irqsave(&mc->vc.lock, flags); 165 + spin_lock(&mc->vc.lock); 167 166 168 167 /* Ack and Stop */ 169 168 val = FIELD_PREP(M10V_XDDSD_IS_MASK, 0x0); ··· 176 177 177 178 milbeaut_xdmac_start(mc); 178 179 out: 179 - spin_unlock_irqrestore(&mc->vc.lock, flags); 180 + spin_unlock(&mc->vc.lock); 180 181 return IRQ_HANDLED; 181 182 } 182 183
+2 -3
drivers/dma/moxart-dma.c
··· 524 524 struct moxart_dmadev *mc = devid; 525 525 struct moxart_chan *ch = &mc->slave_chans[0]; 526 526 unsigned int i; 527 - unsigned long flags; 528 527 u32 ctrl; 529 528 530 529 dev_dbg(chan2dev(&ch->vc.chan), "%s\n", __func__); ··· 540 541 if (ctrl & APB_DMA_FIN_INT_STS) { 541 542 ctrl &= ~APB_DMA_FIN_INT_STS; 542 543 if (ch->desc) { 543 - spin_lock_irqsave(&ch->vc.lock, flags); 544 + spin_lock(&ch->vc.lock); 544 545 if (++ch->sgidx < ch->desc->sglen) { 545 546 moxart_dma_start_sg(ch, ch->sgidx); 546 547 } else { 547 548 vchan_cookie_complete(&ch->desc->vd); 548 549 moxart_dma_start_desc(&ch->vc.chan); 549 550 } 550 - spin_unlock_irqrestore(&ch->vc.lock, flags); 551 + spin_unlock(&ch->vc.lock); 551 552 } 552 553 } 553 554
+1 -1
drivers/dma/mv_xor.c
··· 1455 1455 .resume = mv_xor_resume, 1456 1456 .driver = { 1457 1457 .name = MV_XOR_NAME, 1458 - .of_match_table = of_match_ptr(mv_xor_dt_ids), 1458 + .of_match_table = mv_xor_dt_ids, 1459 1459 }, 1460 1460 }; 1461 1461
+3 -1
drivers/dma/mv_xor_v2.c
··· 771 771 goto disable_clk; 772 772 773 773 msi_desc = first_msi_entry(&pdev->dev); 774 - if (!msi_desc) 774 + if (!msi_desc) { 775 + ret = -ENODEV; 775 776 goto free_msi_irqs; 777 + } 776 778 xor_dev->msi_desc = msi_desc; 777 779 778 780 ret = devm_request_irq(&pdev->dev, msi_desc->irq,
+5 -32
drivers/dma/mxs-dma.c
··· 167 167 } 168 168 }; 169 169 170 - static const struct platform_device_id mxs_dma_ids[] = { 171 - { 172 - .name = "imx23-dma-apbh", 173 - .driver_data = (kernel_ulong_t) &mxs_dma_types[0], 174 - }, { 175 - .name = "imx23-dma-apbx", 176 - .driver_data = (kernel_ulong_t) &mxs_dma_types[1], 177 - }, { 178 - .name = "imx28-dma-apbh", 179 - .driver_data = (kernel_ulong_t) &mxs_dma_types[2], 180 - }, { 181 - .name = "imx28-dma-apbx", 182 - .driver_data = (kernel_ulong_t) &mxs_dma_types[3], 183 - }, { 184 - /* end of list */ 185 - } 186 - }; 187 - 188 170 static const struct of_device_id mxs_dma_dt_ids[] = { 189 - { .compatible = "fsl,imx23-dma-apbh", .data = &mxs_dma_ids[0], }, 190 - { .compatible = "fsl,imx23-dma-apbx", .data = &mxs_dma_ids[1], }, 191 - { .compatible = "fsl,imx28-dma-apbh", .data = &mxs_dma_ids[2], }, 192 - { .compatible = "fsl,imx28-dma-apbx", .data = &mxs_dma_ids[3], }, 171 + { .compatible = "fsl,imx23-dma-apbh", .data = &mxs_dma_types[0], }, 172 + { .compatible = "fsl,imx23-dma-apbx", .data = &mxs_dma_types[1], }, 173 + { .compatible = "fsl,imx28-dma-apbh", .data = &mxs_dma_types[2], }, 174 + { .compatible = "fsl,imx28-dma-apbx", .data = &mxs_dma_types[3], }, 193 175 { /* sentinel */ } 194 176 }; 195 177 MODULE_DEVICE_TABLE(of, mxs_dma_dt_ids); ··· 744 762 static int __init mxs_dma_probe(struct platform_device *pdev) 745 763 { 746 764 struct device_node *np = pdev->dev.of_node; 747 - const struct platform_device_id *id_entry; 748 - const struct of_device_id *of_id; 749 765 const struct mxs_dma_type *dma_type; 750 766 struct mxs_dma_engine *mxs_dma; 751 767 struct resource *iores; ··· 759 779 return ret; 760 780 } 761 781 762 - of_id = of_match_device(mxs_dma_dt_ids, &pdev->dev); 763 - if (of_id) 764 - id_entry = of_id->data; 765 - else 766 - id_entry = platform_get_device_id(pdev); 767 - 768 - dma_type = (struct mxs_dma_type *)id_entry->driver_data; 782 + dma_type = (struct mxs_dma_type *)of_device_get_match_data(&pdev->dev); 769 783 mxs_dma->type = dma_type->type; 770 784 mxs_dma->dev_id = dma_type->id; 771 785 ··· 839 865 .name = "mxs-dma", 840 866 .of_match_table = mxs_dma_dt_ids, 841 867 }, 842 - .id_table = mxs_dma_ids, 843 868 }; 844 869 845 870 static int __init mxs_dma_module_init(void)
+10
drivers/dma/of-dma.c
··· 75 75 ofdma->dma_router->route_free(ofdma->dma_router->dev, 76 76 route_data); 77 77 } else { 78 + int ret = 0; 79 + 78 80 chan->router = ofdma->dma_router; 79 81 chan->route_data = route_data; 82 + 83 + if (chan->device->device_router_config) 84 + ret = chan->device->device_router_config(chan); 85 + 86 + if (ret) { 87 + dma_release_channel(chan); 88 + chan = ERR_PTR(ret); 89 + } 80 90 } 81 91 82 92 /*
-2
drivers/dma/pl330.c
··· 1527 1527 1528 1528 /* First dry run to check if req is acceptable */ 1529 1529 ret = _setup_req(pl330, 1, thrd, idx, &xs); 1530 - if (ret < 0) 1531 - goto xfer_exit; 1532 1530 1533 1531 if (ret > pl330->mcbufsz / 2) { 1534 1532 dev_info(pl330->ddma.dev, "%s:%d Try increasing mcbufsz (%i/%i)\n",
+1 -3
drivers/dma/ppc4xx/adma.c
··· 69 69 }; 70 70 71 71 /* The list of channels exported by ppc440spe ADMA */ 72 - struct list_head 72 + static struct list_head 73 73 ppc440spe_adma_chan_list = LIST_HEAD_INIT(ppc440spe_adma_chan_list); 74 74 75 75 /* This flag is set when want to refetch the xor chain in the interrupt ··· 559 559 int sg_index, unsigned char mult_value) 560 560 { 561 561 struct dma_cdb *dma_hw_desc; 562 - struct xor_cb *xor_hw_desc; 563 562 u32 *psgu; 564 563 565 564 switch (chan->device->id) { ··· 589 590 *psgu |= cpu_to_le32(mult_value << mult_index); 590 591 break; 591 592 case PPC440SPE_XOR_ID: 592 - xor_hw_desc = desc->hw_desc; 593 593 break; 594 594 default: 595 595 BUG();
+2 -3
drivers/dma/pxa_dma.c
··· 606 606 struct pxad_chan *chan = phy->vchan; 607 607 struct virt_dma_desc *vd, *tmp; 608 608 unsigned int dcsr; 609 - unsigned long flags; 610 609 bool vd_completed; 611 610 dma_cookie_t last_started = 0; 612 611 ··· 615 616 if (dcsr & PXA_DCSR_RUN) 616 617 return IRQ_NONE; 617 618 618 - spin_lock_irqsave(&chan->vc.lock, flags); 619 + spin_lock(&chan->vc.lock); 619 620 list_for_each_entry_safe(vd, tmp, &chan->vc.desc_issued, node) { 620 621 vd_completed = is_desc_completed(vd); 621 622 dev_dbg(&chan->vc.chan.dev->device, ··· 657 658 pxad_launch_chan(chan, to_pxad_sw_desc(vd)); 658 659 } 659 660 } 660 - spin_unlock_irqrestore(&chan->vc.lock, flags); 661 + spin_unlock(&chan->vc.lock); 661 662 wake_up(&chan->wq_state); 662 663 663 664 return IRQ_HANDLED;
+23
drivers/dma/qcom/Kconfig
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 + config QCOM_ADM 3 + tristate "Qualcomm ADM support" 4 + depends on (ARCH_QCOM || COMPILE_TEST) && !PHYS_ADDR_T_64BIT 5 + select DMA_ENGINE 6 + select DMA_VIRTUAL_CHANNELS 7 + help 8 + Enable support for the Qualcomm Application Data Mover (ADM) DMA 9 + controller, as present on MSM8x60, APQ8064, and IPQ8064 devices. 10 + This controller provides DMA capabilities for both general purpose 11 + and on-chip peripheral devices. 12 + 2 13 config QCOM_BAM_DMA 3 14 tristate "QCOM BAM DMA support" 4 15 depends on ARCH_QCOM || (COMPILE_TEST && OF && ARM) ··· 18 7 help 19 8 Enable support for the QCOM BAM DMA controller. This controller 20 9 provides DMA capabilities for a variety of on-chip devices. 10 + 11 + config QCOM_GPI_DMA 12 + tristate "Qualcomm Technologies GPI DMA support" 13 + depends on ARCH_QCOM 14 + select DMA_ENGINE 15 + select DMA_VIRTUAL_CHANNELS 16 + help 17 + Enable support for the QCOM GPI DMA controller. This controller 18 + provides DMA capabilities for a variety of peripheral buses such 19 + as I2C, UART, and SPI. By using GPI dmaengine driver, bus drivers 20 + can use a standardize interface that is protocol independent to 21 + transfer data between DDR and peripheral. 21 22 22 23 config QCOM_HIDMA_MGMT 23 24 tristate "Qualcomm Technologies HIDMA Management support"
+2
drivers/dma/qcom/Makefile
··· 1 1 # SPDX-License-Identifier: GPL-2.0 2 + obj-$(CONFIG_QCOM_ADM) += qcom_adm.o 2 3 obj-$(CONFIG_QCOM_BAM_DMA) += bam_dma.o 4 + obj-$(CONFIG_QCOM_GPI_DMA) += gpi.o 3 5 obj-$(CONFIG_QCOM_HIDMA_MGMT) += hdma_mgmt.o 4 6 hdma_mgmt-objs := hidma_mgmt.o hidma_mgmt_sys.o 5 7 obj-$(CONFIG_QCOM_HIDMA) += hdma.o
+1 -1
drivers/dma/qcom/bam_dma.c
··· 875 875 876 876 ret = bam_pm_runtime_get_sync(bdev->dev); 877 877 if (ret < 0) 878 - return ret; 878 + return IRQ_NONE; 879 879 880 880 if (srcs & BAM_IRQ) { 881 881 clr_mask = readl_relaxed(bam_addr(bdev, 0, BAM_IRQ_STTS));
+2303
drivers/dma/qcom/gpi.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. 4 + * Copyright (c) 2020, Linaro Limited 5 + */ 6 + 7 + #include <dt-bindings/dma/qcom-gpi.h> 8 + #include <linux/bitfield.h> 9 + #include <linux/dma-mapping.h> 10 + #include <linux/dmaengine.h> 11 + #include <linux/module.h> 12 + #include <linux/of_dma.h> 13 + #include <linux/platform_device.h> 14 + #include <linux/dma/qcom-gpi-dma.h> 15 + #include <linux/scatterlist.h> 16 + #include <linux/slab.h> 17 + #include "../dmaengine.h" 18 + #include "../virt-dma.h" 19 + 20 + #define TRE_TYPE_DMA 0x10 21 + #define TRE_TYPE_GO 0x20 22 + #define TRE_TYPE_CONFIG0 0x22 23 + 24 + /* TRE flags */ 25 + #define TRE_FLAGS_CHAIN BIT(0) 26 + #define TRE_FLAGS_IEOB BIT(8) 27 + #define TRE_FLAGS_IEOT BIT(9) 28 + #define TRE_FLAGS_BEI BIT(10) 29 + #define TRE_FLAGS_LINK BIT(11) 30 + #define TRE_FLAGS_TYPE GENMASK(23, 16) 31 + 32 + /* SPI CONFIG0 WD0 */ 33 + #define TRE_SPI_C0_WORD_SZ GENMASK(4, 0) 34 + #define TRE_SPI_C0_LOOPBACK BIT(8) 35 + #define TRE_SPI_C0_CS BIT(11) 36 + #define TRE_SPI_C0_CPHA BIT(12) 37 + #define TRE_SPI_C0_CPOL BIT(13) 38 + #define TRE_SPI_C0_TX_PACK BIT(24) 39 + #define TRE_SPI_C0_RX_PACK BIT(25) 40 + 41 + /* CONFIG0 WD2 */ 42 + #define TRE_C0_CLK_DIV GENMASK(11, 0) 43 + #define TRE_C0_CLK_SRC GENMASK(19, 16) 44 + 45 + /* SPI GO WD0 */ 46 + #define TRE_SPI_GO_CMD GENMASK(4, 0) 47 + #define TRE_SPI_GO_CS GENMASK(10, 8) 48 + #define TRE_SPI_GO_FRAG BIT(26) 49 + 50 + /* GO WD2 */ 51 + #define TRE_RX_LEN GENMASK(23, 0) 52 + 53 + /* I2C Config0 WD0 */ 54 + #define TRE_I2C_C0_TLOW GENMASK(7, 0) 55 + #define TRE_I2C_C0_THIGH GENMASK(15, 8) 56 + #define TRE_I2C_C0_TCYL GENMASK(23, 16) 57 + #define TRE_I2C_C0_TX_PACK BIT(24) 58 + #define TRE_I2C_C0_RX_PACK BIT(25) 59 + 60 + /* I2C GO WD0 */ 61 + #define TRE_I2C_GO_CMD GENMASK(4, 0) 62 + #define TRE_I2C_GO_ADDR GENMASK(14, 8) 63 + #define TRE_I2C_GO_STRETCH BIT(26) 64 + 65 + /* DMA TRE */ 66 + #define TRE_DMA_LEN GENMASK(23, 0) 67 + 68 + /* Register offsets from gpi-top */ 69 + #define GPII_n_CH_k_CNTXT_0_OFFS(n, k) (0x20000 + (0x4000 * (n)) + (0x80 * (k))) 70 + #define GPII_n_CH_k_CNTXT_0_EL_SIZE GENMASK(31, 24) 71 + #define GPII_n_CH_k_CNTXT_0_CHSTATE GENMASK(23, 20) 72 + #define GPII_n_CH_k_CNTXT_0_ERIDX GENMASK(18, 14) 73 + #define GPII_n_CH_k_CNTXT_0_DIR BIT(3) 74 + #define GPII_n_CH_k_CNTXT_0_PROTO GENMASK(2, 0) 75 + 76 + #define GPII_n_CH_k_CNTXT_0(el_size, erindex, dir, chtype_proto) \ 77 + (FIELD_PREP(GPII_n_CH_k_CNTXT_0_EL_SIZE, el_size) | \ 78 + FIELD_PREP(GPII_n_CH_k_CNTXT_0_ERIDX, erindex) | \ 79 + FIELD_PREP(GPII_n_CH_k_CNTXT_0_DIR, dir) | \ 80 + FIELD_PREP(GPII_n_CH_k_CNTXT_0_PROTO, chtype_proto)) 81 + 82 + #define GPI_CHTYPE_DIR_IN (0) 83 + #define GPI_CHTYPE_DIR_OUT (1) 84 + 85 + #define GPI_CHTYPE_PROTO_GPI (0x2) 86 + 87 + #define GPII_n_CH_k_DOORBELL_0_OFFS(n, k) (0x22000 + (0x4000 * (n)) + (0x8 * (k))) 88 + #define GPII_n_CH_CMD_OFFS(n) (0x23008 + (0x4000 * (n))) 89 + #define GPII_n_CH_CMD_OPCODE GENMASK(31, 24) 90 + #define GPII_n_CH_CMD_CHID GENMASK(7, 0) 91 + #define GPII_n_CH_CMD(opcode, chid) \ 92 + (FIELD_PREP(GPII_n_CH_CMD_OPCODE, opcode) | \ 93 + FIELD_PREP(GPII_n_CH_CMD_CHID, chid)) 94 + 95 + #define GPII_n_CH_CMD_ALLOCATE (0) 96 + #define GPII_n_CH_CMD_START (1) 97 + #define GPII_n_CH_CMD_STOP (2) 98 + #define GPII_n_CH_CMD_RESET (9) 99 + #define GPII_n_CH_CMD_DE_ALLOC (10) 100 + #define GPII_n_CH_CMD_UART_SW_STALE (32) 101 + #define GPII_n_CH_CMD_UART_RFR_READY (33) 102 + #define GPII_n_CH_CMD_UART_RFR_NOT_READY (34) 103 + 104 + /* EV Context Array */ 105 + #define GPII_n_EV_CH_k_CNTXT_0_OFFS(n, k) (0x21000 + (0x4000 * (n)) + (0x80 * (k))) 106 + #define GPII_n_EV_k_CNTXT_0_EL_SIZE GENMASK(31, 24) 107 + #define GPII_n_EV_k_CNTXT_0_CHSTATE GENMASK(23, 20) 108 + #define GPII_n_EV_k_CNTXT_0_INTYPE BIT(16) 109 + #define GPII_n_EV_k_CNTXT_0_CHTYPE GENMASK(3, 0) 110 + 111 + #define GPII_n_EV_k_CNTXT_0(el_size, inttype, chtype) \ 112 + (FIELD_PREP(GPII_n_EV_k_CNTXT_0_EL_SIZE, el_size) | \ 113 + FIELD_PREP(GPII_n_EV_k_CNTXT_0_INTYPE, inttype) | \ 114 + FIELD_PREP(GPII_n_EV_k_CNTXT_0_CHTYPE, chtype)) 115 + 116 + #define GPI_INTTYPE_IRQ (1) 117 + #define GPI_CHTYPE_GPI_EV (0x2) 118 + 119 + enum CNTXT_OFFS { 120 + CNTXT_0_CONFIG = 0x0, 121 + CNTXT_1_R_LENGTH = 0x4, 122 + CNTXT_2_RING_BASE_LSB = 0x8, 123 + CNTXT_3_RING_BASE_MSB = 0xC, 124 + CNTXT_4_RING_RP_LSB = 0x10, 125 + CNTXT_5_RING_RP_MSB = 0x14, 126 + CNTXT_6_RING_WP_LSB = 0x18, 127 + CNTXT_7_RING_WP_MSB = 0x1C, 128 + CNTXT_8_RING_INT_MOD = 0x20, 129 + CNTXT_9_RING_INTVEC = 0x24, 130 + CNTXT_10_RING_MSI_LSB = 0x28, 131 + CNTXT_11_RING_MSI_MSB = 0x2C, 132 + CNTXT_12_RING_RP_UPDATE_LSB = 0x30, 133 + CNTXT_13_RING_RP_UPDATE_MSB = 0x34, 134 + }; 135 + 136 + #define GPII_n_EV_CH_k_DOORBELL_0_OFFS(n, k) (0x22100 + (0x4000 * (n)) + (0x8 * (k))) 137 + #define GPII_n_EV_CH_CMD_OFFS(n) (0x23010 + (0x4000 * (n))) 138 + #define GPII_n_EV_CMD_OPCODE GENMASK(31, 24) 139 + #define GPII_n_EV_CMD_CHID GENMASK(7, 0) 140 + #define GPII_n_EV_CMD(opcode, chid) \ 141 + (FIELD_PREP(GPII_n_EV_CMD_OPCODE, opcode) | \ 142 + FIELD_PREP(GPII_n_EV_CMD_CHID, chid)) 143 + 144 + #define GPII_n_EV_CH_CMD_ALLOCATE (0x00) 145 + #define GPII_n_EV_CH_CMD_RESET (0x09) 146 + #define GPII_n_EV_CH_CMD_DE_ALLOC (0x0A) 147 + 148 + #define GPII_n_CNTXT_TYPE_IRQ_OFFS(n) (0x23080 + (0x4000 * (n))) 149 + 150 + /* mask type register */ 151 + #define GPII_n_CNTXT_TYPE_IRQ_MSK_OFFS(n) (0x23088 + (0x4000 * (n))) 152 + #define GPII_n_CNTXT_TYPE_IRQ_MSK_BMSK GENMASK(6, 0) 153 + #define GPII_n_CNTXT_TYPE_IRQ_MSK_GENERAL BIT(6) 154 + #define GPII_n_CNTXT_TYPE_IRQ_MSK_IEOB BIT(3) 155 + #define GPII_n_CNTXT_TYPE_IRQ_MSK_GLOB BIT(2) 156 + #define GPII_n_CNTXT_TYPE_IRQ_MSK_EV_CTRL BIT(1) 157 + #define GPII_n_CNTXT_TYPE_IRQ_MSK_CH_CTRL BIT(0) 158 + 159 + #define GPII_n_CNTXT_SRC_GPII_CH_IRQ_OFFS(n) (0x23090 + (0x4000 * (n))) 160 + #define GPII_n_CNTXT_SRC_EV_CH_IRQ_OFFS(n) (0x23094 + (0x4000 * (n))) 161 + 162 + /* Mask channel control interrupt register */ 163 + #define GPII_n_CNTXT_SRC_CH_IRQ_MSK_OFFS(n) (0x23098 + (0x4000 * (n))) 164 + #define GPII_n_CNTXT_SRC_CH_IRQ_MSK_BMSK GENMASK(1, 0) 165 + 166 + /* Mask event control interrupt register */ 167 + #define GPII_n_CNTXT_SRC_EV_CH_IRQ_MSK_OFFS(n) (0x2309C + (0x4000 * (n))) 168 + #define GPII_n_CNTXT_SRC_EV_CH_IRQ_MSK_BMSK BIT(0) 169 + 170 + #define GPII_n_CNTXT_SRC_CH_IRQ_CLR_OFFS(n) (0x230A0 + (0x4000 * (n))) 171 + #define GPII_n_CNTXT_SRC_EV_CH_IRQ_CLR_OFFS(n) (0x230A4 + (0x4000 * (n))) 172 + 173 + /* Mask event interrupt register */ 174 + #define GPII_n_CNTXT_SRC_IEOB_IRQ_MSK_OFFS(n) (0x230B8 + (0x4000 * (n))) 175 + #define GPII_n_CNTXT_SRC_IEOB_IRQ_MSK_BMSK BIT(0) 176 + 177 + #define GPII_n_CNTXT_SRC_IEOB_IRQ_CLR_OFFS(n) (0x230C0 + (0x4000 * (n))) 178 + #define GPII_n_CNTXT_GLOB_IRQ_STTS_OFFS(n) (0x23100 + (0x4000 * (n))) 179 + #define GPI_GLOB_IRQ_ERROR_INT_MSK BIT(0) 180 + 181 + /* GPII specific Global - Enable bit register */ 182 + #define GPII_n_CNTXT_GLOB_IRQ_EN_OFFS(n) (0x23108 + (0x4000 * (n))) 183 + #define GPII_n_CNTXT_GLOB_IRQ_CLR_OFFS(n) (0x23110 + (0x4000 * (n))) 184 + #define GPII_n_CNTXT_GPII_IRQ_STTS_OFFS(n) (0x23118 + (0x4000 * (n))) 185 + 186 + /* GPII general interrupt - Enable bit register */ 187 + #define GPII_n_CNTXT_GPII_IRQ_EN_OFFS(n) (0x23120 + (0x4000 * (n))) 188 + #define GPII_n_CNTXT_GPII_IRQ_EN_BMSK GENMASK(3, 0) 189 + 190 + #define GPII_n_CNTXT_GPII_IRQ_CLR_OFFS(n) (0x23128 + (0x4000 * (n))) 191 + 192 + /* GPII Interrupt Type register */ 193 + #define GPII_n_CNTXT_INTSET_OFFS(n) (0x23180 + (0x4000 * (n))) 194 + #define GPII_n_CNTXT_INTSET_BMSK BIT(0) 195 + 196 + #define GPII_n_CNTXT_MSI_BASE_LSB_OFFS(n) (0x23188 + (0x4000 * (n))) 197 + #define GPII_n_CNTXT_MSI_BASE_MSB_OFFS(n) (0x2318C + (0x4000 * (n))) 198 + #define GPII_n_CNTXT_SCRATCH_0_OFFS(n) (0x23400 + (0x4000 * (n))) 199 + #define GPII_n_CNTXT_SCRATCH_1_OFFS(n) (0x23404 + (0x4000 * (n))) 200 + 201 + #define GPII_n_ERROR_LOG_OFFS(n) (0x23200 + (0x4000 * (n))) 202 + 203 + /* QOS Registers */ 204 + #define GPII_n_CH_k_QOS_OFFS(n, k) (0x2005C + (0x4000 * (n)) + (0x80 * (k))) 205 + 206 + /* Scratch registers */ 207 + #define GPII_n_CH_k_SCRATCH_0_OFFS(n, k) (0x20060 + (0x4000 * (n)) + (0x80 * (k))) 208 + #define GPII_n_CH_k_SCRATCH_0_SEID GENMASK(2, 0) 209 + #define GPII_n_CH_k_SCRATCH_0_PROTO GENMASK(7, 4) 210 + #define GPII_n_CH_k_SCRATCH_0_PAIR GENMASK(20, 16) 211 + #define GPII_n_CH_k_SCRATCH_0(pair, proto, seid) \ 212 + (FIELD_PREP(GPII_n_CH_k_SCRATCH_0_PAIR, pair) | \ 213 + FIELD_PREP(GPII_n_CH_k_SCRATCH_0_PROTO, proto) | \ 214 + FIELD_PREP(GPII_n_CH_k_SCRATCH_0_SEID, seid)) 215 + #define GPII_n_CH_k_SCRATCH_1_OFFS(n, k) (0x20064 + (0x4000 * (n)) + (0x80 * (k))) 216 + #define GPII_n_CH_k_SCRATCH_2_OFFS(n, k) (0x20068 + (0x4000 * (n)) + (0x80 * (k))) 217 + #define GPII_n_CH_k_SCRATCH_3_OFFS(n, k) (0x2006C + (0x4000 * (n)) + (0x80 * (k))) 218 + 219 + struct __packed gpi_tre { 220 + u32 dword[4]; 221 + }; 222 + 223 + enum msm_gpi_tce_code { 224 + MSM_GPI_TCE_SUCCESS = 1, 225 + MSM_GPI_TCE_EOT = 2, 226 + MSM_GPI_TCE_EOB = 4, 227 + MSM_GPI_TCE_UNEXP_ERR = 16, 228 + }; 229 + 230 + #define CMD_TIMEOUT_MS (250) 231 + 232 + #define MAX_CHANNELS_PER_GPII (2) 233 + #define GPI_TX_CHAN (0) 234 + #define GPI_RX_CHAN (1) 235 + #define STATE_IGNORE (U32_MAX) 236 + #define EV_FACTOR (2) 237 + #define REQ_OF_DMA_ARGS (5) /* # of arguments required from client */ 238 + #define CHAN_TRES 64 239 + 240 + struct __packed xfer_compl_event { 241 + u64 ptr; 242 + u32 length:24; 243 + u8 code; 244 + u16 status; 245 + u8 type; 246 + u8 chid; 247 + }; 248 + 249 + struct __packed immediate_data_event { 250 + u8 data_bytes[8]; 251 + u8 length:4; 252 + u8 resvd:4; 253 + u16 tre_index; 254 + u8 code; 255 + u16 status; 256 + u8 type; 257 + u8 chid; 258 + }; 259 + 260 + struct __packed qup_notif_event { 261 + u32 status; 262 + u32 time; 263 + u32 count:24; 264 + u8 resvd; 265 + u16 resvd1; 266 + u8 type; 267 + u8 chid; 268 + }; 269 + 270 + struct __packed gpi_ere { 271 + u32 dword[4]; 272 + }; 273 + 274 + enum GPI_EV_TYPE { 275 + XFER_COMPLETE_EV_TYPE = 0x22, 276 + IMMEDIATE_DATA_EV_TYPE = 0x30, 277 + QUP_NOTIF_EV_TYPE = 0x31, 278 + STALE_EV_TYPE = 0xFF, 279 + }; 280 + 281 + union __packed gpi_event { 282 + struct __packed xfer_compl_event xfer_compl_event; 283 + struct __packed immediate_data_event immediate_data_event; 284 + struct __packed qup_notif_event qup_notif_event; 285 + struct __packed gpi_ere gpi_ere; 286 + }; 287 + 288 + enum gpii_irq_settings { 289 + DEFAULT_IRQ_SETTINGS, 290 + MASK_IEOB_SETTINGS, 291 + }; 292 + 293 + enum gpi_ev_state { 294 + DEFAULT_EV_CH_STATE = 0, 295 + EV_STATE_NOT_ALLOCATED = DEFAULT_EV_CH_STATE, 296 + EV_STATE_ALLOCATED, 297 + MAX_EV_STATES 298 + }; 299 + 300 + static const char *const gpi_ev_state_str[MAX_EV_STATES] = { 301 + [EV_STATE_NOT_ALLOCATED] = "NOT ALLOCATED", 302 + [EV_STATE_ALLOCATED] = "ALLOCATED", 303 + }; 304 + 305 + #define TO_GPI_EV_STATE_STR(_state) (((_state) >= MAX_EV_STATES) ? \ 306 + "INVALID" : gpi_ev_state_str[(_state)]) 307 + 308 + enum gpi_ch_state { 309 + DEFAULT_CH_STATE = 0x0, 310 + CH_STATE_NOT_ALLOCATED = DEFAULT_CH_STATE, 311 + CH_STATE_ALLOCATED = 0x1, 312 + CH_STATE_STARTED = 0x2, 313 + CH_STATE_STOPPED = 0x3, 314 + CH_STATE_STOP_IN_PROC = 0x4, 315 + CH_STATE_ERROR = 0xf, 316 + MAX_CH_STATES 317 + }; 318 + 319 + enum gpi_cmd { 320 + GPI_CH_CMD_BEGIN, 321 + GPI_CH_CMD_ALLOCATE = GPI_CH_CMD_BEGIN, 322 + GPI_CH_CMD_START, 323 + GPI_CH_CMD_STOP, 324 + GPI_CH_CMD_RESET, 325 + GPI_CH_CMD_DE_ALLOC, 326 + GPI_CH_CMD_UART_SW_STALE, 327 + GPI_CH_CMD_UART_RFR_READY, 328 + GPI_CH_CMD_UART_RFR_NOT_READY, 329 + GPI_CH_CMD_END = GPI_CH_CMD_UART_RFR_NOT_READY, 330 + GPI_EV_CMD_BEGIN, 331 + GPI_EV_CMD_ALLOCATE = GPI_EV_CMD_BEGIN, 332 + GPI_EV_CMD_RESET, 333 + GPI_EV_CMD_DEALLOC, 334 + GPI_EV_CMD_END = GPI_EV_CMD_DEALLOC, 335 + GPI_MAX_CMD, 336 + }; 337 + 338 + #define IS_CHAN_CMD(_cmd) ((_cmd) <= GPI_CH_CMD_END) 339 + 340 + static const char *const gpi_cmd_str[GPI_MAX_CMD] = { 341 + [GPI_CH_CMD_ALLOCATE] = "CH ALLOCATE", 342 + [GPI_CH_CMD_START] = "CH START", 343 + [GPI_CH_CMD_STOP] = "CH STOP", 344 + [GPI_CH_CMD_RESET] = "CH_RESET", 345 + [GPI_CH_CMD_DE_ALLOC] = "DE ALLOC", 346 + [GPI_CH_CMD_UART_SW_STALE] = "UART SW STALE", 347 + [GPI_CH_CMD_UART_RFR_READY] = "UART RFR READY", 348 + [GPI_CH_CMD_UART_RFR_NOT_READY] = "UART RFR NOT READY", 349 + [GPI_EV_CMD_ALLOCATE] = "EV ALLOCATE", 350 + [GPI_EV_CMD_RESET] = "EV RESET", 351 + [GPI_EV_CMD_DEALLOC] = "EV DEALLOC", 352 + }; 353 + 354 + #define TO_GPI_CMD_STR(_cmd) (((_cmd) >= GPI_MAX_CMD) ? "INVALID" : \ 355 + gpi_cmd_str[(_cmd)]) 356 + 357 + /* 358 + * @DISABLE_STATE: no register access allowed 359 + * @CONFIG_STATE: client has configured the channel 360 + * @PREP_HARDWARE: register access is allowed 361 + * however, no processing EVENTS 362 + * @ACTIVE_STATE: channels are fully operational 363 + * @PREPARE_TERMINATE: graceful termination of channels 364 + * register access is allowed 365 + * @PAUSE_STATE: channels are active, but not processing any events 366 + */ 367 + enum gpi_pm_state { 368 + DISABLE_STATE, 369 + CONFIG_STATE, 370 + PREPARE_HARDWARE, 371 + ACTIVE_STATE, 372 + PREPARE_TERMINATE, 373 + PAUSE_STATE, 374 + MAX_PM_STATE 375 + }; 376 + 377 + #define REG_ACCESS_VALID(_pm_state) ((_pm_state) >= PREPARE_HARDWARE) 378 + 379 + static const char *const gpi_pm_state_str[MAX_PM_STATE] = { 380 + [DISABLE_STATE] = "DISABLE", 381 + [CONFIG_STATE] = "CONFIG", 382 + [PREPARE_HARDWARE] = "PREPARE HARDWARE", 383 + [ACTIVE_STATE] = "ACTIVE", 384 + [PREPARE_TERMINATE] = "PREPARE TERMINATE", 385 + [PAUSE_STATE] = "PAUSE", 386 + }; 387 + 388 + #define TO_GPI_PM_STR(_state) (((_state) >= MAX_PM_STATE) ? \ 389 + "INVALID" : gpi_pm_state_str[(_state)]) 390 + 391 + static const struct { 392 + enum gpi_cmd gpi_cmd; 393 + u32 opcode; 394 + u32 state; 395 + } gpi_cmd_info[GPI_MAX_CMD] = { 396 + { 397 + GPI_CH_CMD_ALLOCATE, 398 + GPII_n_CH_CMD_ALLOCATE, 399 + CH_STATE_ALLOCATED, 400 + }, 401 + { 402 + GPI_CH_CMD_START, 403 + GPII_n_CH_CMD_START, 404 + CH_STATE_STARTED, 405 + }, 406 + { 407 + GPI_CH_CMD_STOP, 408 + GPII_n_CH_CMD_STOP, 409 + CH_STATE_STOPPED, 410 + }, 411 + { 412 + GPI_CH_CMD_RESET, 413 + GPII_n_CH_CMD_RESET, 414 + CH_STATE_ALLOCATED, 415 + }, 416 + { 417 + GPI_CH_CMD_DE_ALLOC, 418 + GPII_n_CH_CMD_DE_ALLOC, 419 + CH_STATE_NOT_ALLOCATED, 420 + }, 421 + { 422 + GPI_CH_CMD_UART_SW_STALE, 423 + GPII_n_CH_CMD_UART_SW_STALE, 424 + STATE_IGNORE, 425 + }, 426 + { 427 + GPI_CH_CMD_UART_RFR_READY, 428 + GPII_n_CH_CMD_UART_RFR_READY, 429 + STATE_IGNORE, 430 + }, 431 + { 432 + GPI_CH_CMD_UART_RFR_NOT_READY, 433 + GPII_n_CH_CMD_UART_RFR_NOT_READY, 434 + STATE_IGNORE, 435 + }, 436 + { 437 + GPI_EV_CMD_ALLOCATE, 438 + GPII_n_EV_CH_CMD_ALLOCATE, 439 + EV_STATE_ALLOCATED, 440 + }, 441 + { 442 + GPI_EV_CMD_RESET, 443 + GPII_n_EV_CH_CMD_RESET, 444 + EV_STATE_ALLOCATED, 445 + }, 446 + { 447 + GPI_EV_CMD_DEALLOC, 448 + GPII_n_EV_CH_CMD_DE_ALLOC, 449 + EV_STATE_NOT_ALLOCATED, 450 + }, 451 + }; 452 + 453 + struct gpi_ring { 454 + void *pre_aligned; 455 + size_t alloc_size; 456 + phys_addr_t phys_addr; 457 + dma_addr_t dma_handle; 458 + void *base; 459 + void *wp; 460 + void *rp; 461 + u32 len; 462 + u32 el_size; 463 + u32 elements; 464 + bool configured; 465 + }; 466 + 467 + struct gpi_dev { 468 + struct dma_device dma_device; 469 + struct device *dev; 470 + struct resource *res; 471 + void __iomem *regs; 472 + void __iomem *ee_base; /*ee register base address*/ 473 + u32 max_gpii; /* maximum # of gpii instances available per gpi block */ 474 + u32 gpii_mask; /* gpii instances available for apps */ 475 + u32 ev_factor; /* ev ring length factor */ 476 + struct gpii *gpiis; 477 + }; 478 + 479 + struct reg_info { 480 + char *name; 481 + u32 offset; 482 + u32 val; 483 + }; 484 + 485 + struct gchan { 486 + struct virt_dma_chan vc; 487 + u32 chid; 488 + u32 seid; 489 + u32 protocol; 490 + struct gpii *gpii; 491 + enum gpi_ch_state ch_state; 492 + enum gpi_pm_state pm_state; 493 + void __iomem *ch_cntxt_base_reg; 494 + void __iomem *ch_cntxt_db_reg; 495 + void __iomem *ch_cmd_reg; 496 + u32 dir; 497 + struct gpi_ring ch_ring; 498 + void *config; 499 + }; 500 + 501 + struct gpii { 502 + u32 gpii_id; 503 + struct gchan gchan[MAX_CHANNELS_PER_GPII]; 504 + struct gpi_dev *gpi_dev; 505 + int irq; 506 + void __iomem *regs; /* points to gpi top */ 507 + void __iomem *ev_cntxt_base_reg; 508 + void __iomem *ev_cntxt_db_reg; 509 + void __iomem *ev_ring_rp_lsb_reg; 510 + void __iomem *ev_cmd_reg; 511 + void __iomem *ieob_clr_reg; 512 + struct mutex ctrl_lock; 513 + enum gpi_ev_state ev_state; 514 + bool configured_irq; 515 + enum gpi_pm_state pm_state; 516 + rwlock_t pm_lock; 517 + struct gpi_ring ev_ring; 518 + struct tasklet_struct ev_task; /* event processing tasklet */ 519 + struct completion cmd_completion; 520 + enum gpi_cmd gpi_cmd; 521 + u32 cntxt_type_irq_msk; 522 + bool ieob_set; 523 + }; 524 + 525 + #define MAX_TRE 3 526 + 527 + struct gpi_desc { 528 + struct virt_dma_desc vd; 529 + size_t len; 530 + void *db; /* DB register to program */ 531 + struct gchan *gchan; 532 + struct gpi_tre tre[MAX_TRE]; 533 + u32 num_tre; 534 + }; 535 + 536 + static const u32 GPII_CHAN_DIR[MAX_CHANNELS_PER_GPII] = { 537 + GPI_CHTYPE_DIR_OUT, GPI_CHTYPE_DIR_IN 538 + }; 539 + 540 + static irqreturn_t gpi_handle_irq(int irq, void *data); 541 + static void gpi_ring_recycle_ev_element(struct gpi_ring *ring); 542 + static int gpi_ring_add_element(struct gpi_ring *ring, void **wp); 543 + static void gpi_process_events(struct gpii *gpii); 544 + 545 + static inline struct gchan *to_gchan(struct dma_chan *dma_chan) 546 + { 547 + return container_of(dma_chan, struct gchan, vc.chan); 548 + } 549 + 550 + static inline struct gpi_desc *to_gpi_desc(struct virt_dma_desc *vd) 551 + { 552 + return container_of(vd, struct gpi_desc, vd); 553 + } 554 + 555 + static inline phys_addr_t to_physical(const struct gpi_ring *const ring, 556 + void *addr) 557 + { 558 + return ring->phys_addr + (addr - ring->base); 559 + } 560 + 561 + static inline void *to_virtual(const struct gpi_ring *const ring, phys_addr_t addr) 562 + { 563 + return ring->base + (addr - ring->phys_addr); 564 + } 565 + 566 + static inline u32 gpi_read_reg(struct gpii *gpii, void __iomem *addr) 567 + { 568 + return readl_relaxed(addr); 569 + } 570 + 571 + static inline void gpi_write_reg(struct gpii *gpii, void __iomem *addr, u32 val) 572 + { 573 + writel_relaxed(val, addr); 574 + } 575 + 576 + /* gpi_write_reg_field - write to specific bit field */ 577 + static inline void gpi_write_reg_field(struct gpii *gpii, void __iomem *addr, 578 + u32 mask, u32 shift, u32 val) 579 + { 580 + u32 tmp = gpi_read_reg(gpii, addr); 581 + 582 + tmp &= ~mask; 583 + val = tmp | ((val << shift) & mask); 584 + gpi_write_reg(gpii, addr, val); 585 + } 586 + 587 + static inline void 588 + gpi_update_reg(struct gpii *gpii, u32 offset, u32 mask, u32 val) 589 + { 590 + void __iomem *addr = gpii->regs + offset; 591 + u32 tmp = gpi_read_reg(gpii, addr); 592 + 593 + tmp &= ~mask; 594 + tmp |= u32_encode_bits(val, mask); 595 + 596 + gpi_write_reg(gpii, addr, tmp); 597 + } 598 + 599 + static void gpi_disable_interrupts(struct gpii *gpii) 600 + { 601 + gpi_update_reg(gpii, GPII_n_CNTXT_TYPE_IRQ_MSK_OFFS(gpii->gpii_id), 602 + GPII_n_CNTXT_TYPE_IRQ_MSK_BMSK, 0); 603 + gpi_update_reg(gpii, GPII_n_CNTXT_SRC_IEOB_IRQ_MSK_OFFS(gpii->gpii_id), 604 + GPII_n_CNTXT_SRC_IEOB_IRQ_MSK_BMSK, 0); 605 + gpi_update_reg(gpii, GPII_n_CNTXT_SRC_CH_IRQ_MSK_OFFS(gpii->gpii_id), 606 + GPII_n_CNTXT_SRC_CH_IRQ_MSK_BMSK, 0); 607 + gpi_update_reg(gpii, GPII_n_CNTXT_SRC_EV_CH_IRQ_MSK_OFFS(gpii->gpii_id), 608 + GPII_n_CNTXT_SRC_EV_CH_IRQ_MSK_BMSK, 0); 609 + gpi_update_reg(gpii, GPII_n_CNTXT_GLOB_IRQ_EN_OFFS(gpii->gpii_id), 610 + GPII_n_CNTXT_GPII_IRQ_EN_BMSK, 0); 611 + gpi_update_reg(gpii, GPII_n_CNTXT_GPII_IRQ_EN_OFFS(gpii->gpii_id), 612 + GPII_n_CNTXT_GPII_IRQ_EN_BMSK, 0); 613 + gpi_update_reg(gpii, GPII_n_CNTXT_INTSET_OFFS(gpii->gpii_id), 614 + GPII_n_CNTXT_INTSET_BMSK, 0); 615 + 616 + gpii->cntxt_type_irq_msk = 0; 617 + devm_free_irq(gpii->gpi_dev->dev, gpii->irq, gpii); 618 + gpii->configured_irq = false; 619 + } 620 + 621 + /* configure and enable interrupts */ 622 + static int gpi_config_interrupts(struct gpii *gpii, enum gpii_irq_settings settings, bool mask) 623 + { 624 + const u32 enable = (GPII_n_CNTXT_TYPE_IRQ_MSK_GENERAL | 625 + GPII_n_CNTXT_TYPE_IRQ_MSK_IEOB | 626 + GPII_n_CNTXT_TYPE_IRQ_MSK_GLOB | 627 + GPII_n_CNTXT_TYPE_IRQ_MSK_EV_CTRL | 628 + GPII_n_CNTXT_TYPE_IRQ_MSK_CH_CTRL); 629 + int ret; 630 + 631 + if (!gpii->configured_irq) { 632 + ret = devm_request_irq(gpii->gpi_dev->dev, gpii->irq, 633 + gpi_handle_irq, IRQF_TRIGGER_HIGH, 634 + "gpi-dma", gpii); 635 + if (ret < 0) { 636 + dev_err(gpii->gpi_dev->dev, "error request irq:%d ret:%d\n", 637 + gpii->irq, ret); 638 + return ret; 639 + } 640 + } 641 + 642 + if (settings == MASK_IEOB_SETTINGS) { 643 + /* 644 + * GPII only uses one EV ring per gpii so we can globally 645 + * enable/disable IEOB interrupt 646 + */ 647 + if (mask) 648 + gpii->cntxt_type_irq_msk |= GPII_n_CNTXT_TYPE_IRQ_MSK_IEOB; 649 + else 650 + gpii->cntxt_type_irq_msk &= ~(GPII_n_CNTXT_TYPE_IRQ_MSK_IEOB); 651 + gpi_update_reg(gpii, GPII_n_CNTXT_TYPE_IRQ_MSK_OFFS(gpii->gpii_id), 652 + GPII_n_CNTXT_TYPE_IRQ_MSK_BMSK, gpii->cntxt_type_irq_msk); 653 + } else { 654 + gpi_update_reg(gpii, GPII_n_CNTXT_TYPE_IRQ_MSK_OFFS(gpii->gpii_id), 655 + GPII_n_CNTXT_TYPE_IRQ_MSK_BMSK, enable); 656 + gpi_update_reg(gpii, GPII_n_CNTXT_SRC_IEOB_IRQ_MSK_OFFS(gpii->gpii_id), 657 + GPII_n_CNTXT_SRC_IEOB_IRQ_MSK_BMSK, 658 + GPII_n_CNTXT_SRC_IEOB_IRQ_MSK_BMSK); 659 + gpi_update_reg(gpii, GPII_n_CNTXT_SRC_CH_IRQ_MSK_OFFS(gpii->gpii_id), 660 + GPII_n_CNTXT_SRC_CH_IRQ_MSK_BMSK, 661 + GPII_n_CNTXT_SRC_CH_IRQ_MSK_BMSK); 662 + gpi_update_reg(gpii, GPII_n_CNTXT_SRC_EV_CH_IRQ_MSK_OFFS(gpii->gpii_id), 663 + GPII_n_CNTXT_SRC_EV_CH_IRQ_MSK_BMSK, 664 + GPII_n_CNTXT_SRC_EV_CH_IRQ_MSK_BMSK); 665 + gpi_update_reg(gpii, GPII_n_CNTXT_GLOB_IRQ_EN_OFFS(gpii->gpii_id), 666 + GPII_n_CNTXT_GPII_IRQ_EN_BMSK, 667 + GPII_n_CNTXT_GPII_IRQ_EN_BMSK); 668 + gpi_update_reg(gpii, GPII_n_CNTXT_GPII_IRQ_EN_OFFS(gpii->gpii_id), 669 + GPII_n_CNTXT_GPII_IRQ_EN_BMSK, GPII_n_CNTXT_GPII_IRQ_EN_BMSK); 670 + gpi_update_reg(gpii, GPII_n_CNTXT_MSI_BASE_LSB_OFFS(gpii->gpii_id), U32_MAX, 0); 671 + gpi_update_reg(gpii, GPII_n_CNTXT_MSI_BASE_MSB_OFFS(gpii->gpii_id), U32_MAX, 0); 672 + gpi_update_reg(gpii, GPII_n_CNTXT_SCRATCH_0_OFFS(gpii->gpii_id), U32_MAX, 0); 673 + gpi_update_reg(gpii, GPII_n_CNTXT_SCRATCH_1_OFFS(gpii->gpii_id), U32_MAX, 0); 674 + gpi_update_reg(gpii, GPII_n_CNTXT_INTSET_OFFS(gpii->gpii_id), 675 + GPII_n_CNTXT_INTSET_BMSK, 1); 676 + gpi_update_reg(gpii, GPII_n_ERROR_LOG_OFFS(gpii->gpii_id), U32_MAX, 0); 677 + 678 + gpii->cntxt_type_irq_msk = enable; 679 + } 680 + 681 + gpii->configured_irq = true; 682 + return 0; 683 + } 684 + 685 + /* Sends gpii event or channel command */ 686 + static int gpi_send_cmd(struct gpii *gpii, struct gchan *gchan, 687 + enum gpi_cmd gpi_cmd) 688 + { 689 + u32 chid = MAX_CHANNELS_PER_GPII; 690 + unsigned long timeout; 691 + void __iomem *cmd_reg; 692 + u32 cmd; 693 + 694 + if (gpi_cmd >= GPI_MAX_CMD) 695 + return -EINVAL; 696 + if (IS_CHAN_CMD(gpi_cmd)) 697 + chid = gchan->chid; 698 + 699 + dev_dbg(gpii->gpi_dev->dev, 700 + "sending cmd: %s:%u\n", TO_GPI_CMD_STR(gpi_cmd), chid); 701 + 702 + /* send opcode and wait for completion */ 703 + reinit_completion(&gpii->cmd_completion); 704 + gpii->gpi_cmd = gpi_cmd; 705 + 706 + cmd_reg = IS_CHAN_CMD(gpi_cmd) ? gchan->ch_cmd_reg : gpii->ev_cmd_reg; 707 + cmd = IS_CHAN_CMD(gpi_cmd) ? GPII_n_CH_CMD(gpi_cmd_info[gpi_cmd].opcode, chid) : 708 + GPII_n_EV_CMD(gpi_cmd_info[gpi_cmd].opcode, 0); 709 + gpi_write_reg(gpii, cmd_reg, cmd); 710 + timeout = wait_for_completion_timeout(&gpii->cmd_completion, 711 + msecs_to_jiffies(CMD_TIMEOUT_MS)); 712 + if (!timeout) { 713 + dev_err(gpii->gpi_dev->dev, "cmd: %s completion timeout:%u\n", 714 + TO_GPI_CMD_STR(gpi_cmd), chid); 715 + return -EIO; 716 + } 717 + 718 + /* confirm new ch state is correct , if the cmd is a state change cmd */ 719 + if (gpi_cmd_info[gpi_cmd].state == STATE_IGNORE) 720 + return 0; 721 + 722 + if (IS_CHAN_CMD(gpi_cmd) && gchan->ch_state == gpi_cmd_info[gpi_cmd].state) 723 + return 0; 724 + 725 + if (!IS_CHAN_CMD(gpi_cmd) && gpii->ev_state == gpi_cmd_info[gpi_cmd].state) 726 + return 0; 727 + 728 + return -EIO; 729 + } 730 + 731 + /* program transfer ring DB register */ 732 + static inline void gpi_write_ch_db(struct gchan *gchan, 733 + struct gpi_ring *ring, void *wp) 734 + { 735 + struct gpii *gpii = gchan->gpii; 736 + phys_addr_t p_wp; 737 + 738 + p_wp = to_physical(ring, wp); 739 + gpi_write_reg(gpii, gchan->ch_cntxt_db_reg, p_wp); 740 + } 741 + 742 + /* program event ring DB register */ 743 + static inline void gpi_write_ev_db(struct gpii *gpii, 744 + struct gpi_ring *ring, void *wp) 745 + { 746 + phys_addr_t p_wp; 747 + 748 + p_wp = ring->phys_addr + (wp - ring->base); 749 + gpi_write_reg(gpii, gpii->ev_cntxt_db_reg, p_wp); 750 + } 751 + 752 + /* process transfer completion interrupt */ 753 + static void gpi_process_ieob(struct gpii *gpii) 754 + { 755 + gpi_write_reg(gpii, gpii->ieob_clr_reg, BIT(0)); 756 + 757 + gpi_config_interrupts(gpii, MASK_IEOB_SETTINGS, 0); 758 + tasklet_hi_schedule(&gpii->ev_task); 759 + } 760 + 761 + /* process channel control interrupt */ 762 + static void gpi_process_ch_ctrl_irq(struct gpii *gpii) 763 + { 764 + u32 gpii_id = gpii->gpii_id; 765 + u32 offset = GPII_n_CNTXT_SRC_GPII_CH_IRQ_OFFS(gpii_id); 766 + u32 ch_irq = gpi_read_reg(gpii, gpii->regs + offset); 767 + struct gchan *gchan; 768 + u32 chid, state; 769 + 770 + /* clear the status */ 771 + offset = GPII_n_CNTXT_SRC_CH_IRQ_CLR_OFFS(gpii_id); 772 + gpi_write_reg(gpii, gpii->regs + offset, (u32)ch_irq); 773 + 774 + for (chid = 0; chid < MAX_CHANNELS_PER_GPII; chid++) { 775 + if (!(BIT(chid) & ch_irq)) 776 + continue; 777 + 778 + gchan = &gpii->gchan[chid]; 779 + state = gpi_read_reg(gpii, gchan->ch_cntxt_base_reg + 780 + CNTXT_0_CONFIG); 781 + state = FIELD_GET(GPII_n_CH_k_CNTXT_0_CHSTATE, state); 782 + 783 + /* 784 + * CH_CMD_DEALLOC cmd always successful. However cmd does 785 + * not change hardware status. So overwriting software state 786 + * to default state. 787 + */ 788 + if (gpii->gpi_cmd == GPI_CH_CMD_DE_ALLOC) 789 + state = DEFAULT_CH_STATE; 790 + gchan->ch_state = state; 791 + 792 + /* 793 + * Triggering complete all if ch_state is not a stop in process. 794 + * Stop in process is a transition state and we will wait for 795 + * stop interrupt before notifying. 796 + */ 797 + if (gchan->ch_state != CH_STATE_STOP_IN_PROC) 798 + complete_all(&gpii->cmd_completion); 799 + } 800 + } 801 + 802 + /* processing gpi general error interrupts */ 803 + static void gpi_process_gen_err_irq(struct gpii *gpii) 804 + { 805 + u32 gpii_id = gpii->gpii_id; 806 + u32 offset = GPII_n_CNTXT_GPII_IRQ_STTS_OFFS(gpii_id); 807 + u32 irq_stts = gpi_read_reg(gpii, gpii->regs + offset); 808 + 809 + /* clear the status */ 810 + dev_dbg(gpii->gpi_dev->dev, "irq_stts:0x%x\n", irq_stts); 811 + 812 + /* Clear the register */ 813 + offset = GPII_n_CNTXT_GPII_IRQ_CLR_OFFS(gpii_id); 814 + gpi_write_reg(gpii, gpii->regs + offset, irq_stts); 815 + } 816 + 817 + /* processing gpi level error interrupts */ 818 + static void gpi_process_glob_err_irq(struct gpii *gpii) 819 + { 820 + u32 gpii_id = gpii->gpii_id; 821 + u32 offset = GPII_n_CNTXT_GLOB_IRQ_STTS_OFFS(gpii_id); 822 + u32 irq_stts = gpi_read_reg(gpii, gpii->regs + offset); 823 + 824 + offset = GPII_n_CNTXT_GLOB_IRQ_CLR_OFFS(gpii_id); 825 + gpi_write_reg(gpii, gpii->regs + offset, irq_stts); 826 + 827 + /* only error interrupt should be set */ 828 + if (irq_stts & ~GPI_GLOB_IRQ_ERROR_INT_MSK) { 829 + dev_err(gpii->gpi_dev->dev, "invalid error status:0x%x\n", irq_stts); 830 + return; 831 + } 832 + 833 + offset = GPII_n_ERROR_LOG_OFFS(gpii_id); 834 + gpi_write_reg(gpii, gpii->regs + offset, 0); 835 + } 836 + 837 + /* gpii interrupt handler */ 838 + static irqreturn_t gpi_handle_irq(int irq, void *data) 839 + { 840 + struct gpii *gpii = data; 841 + u32 gpii_id = gpii->gpii_id; 842 + u32 type, offset; 843 + unsigned long flags; 844 + 845 + read_lock_irqsave(&gpii->pm_lock, flags); 846 + 847 + /* 848 + * States are out of sync to receive interrupt 849 + * while software state is in DISABLE state, bailing out. 850 + */ 851 + if (!REG_ACCESS_VALID(gpii->pm_state)) { 852 + dev_err(gpii->gpi_dev->dev, "receive interrupt while in %s state\n", 853 + TO_GPI_PM_STR(gpii->pm_state)); 854 + goto exit_irq; 855 + } 856 + 857 + offset = GPII_n_CNTXT_TYPE_IRQ_OFFS(gpii->gpii_id); 858 + type = gpi_read_reg(gpii, gpii->regs + offset); 859 + 860 + do { 861 + /* global gpii error */ 862 + if (type & GPII_n_CNTXT_TYPE_IRQ_MSK_GLOB) { 863 + gpi_process_glob_err_irq(gpii); 864 + type &= ~(GPII_n_CNTXT_TYPE_IRQ_MSK_GLOB); 865 + } 866 + 867 + /* transfer complete interrupt */ 868 + if (type & GPII_n_CNTXT_TYPE_IRQ_MSK_IEOB) { 869 + gpi_process_ieob(gpii); 870 + type &= ~GPII_n_CNTXT_TYPE_IRQ_MSK_IEOB; 871 + } 872 + 873 + /* event control irq */ 874 + if (type & GPII_n_CNTXT_TYPE_IRQ_MSK_EV_CTRL) { 875 + u32 ev_state; 876 + u32 ev_ch_irq; 877 + 878 + dev_dbg(gpii->gpi_dev->dev, 879 + "processing EV CTRL interrupt\n"); 880 + offset = GPII_n_CNTXT_SRC_EV_CH_IRQ_OFFS(gpii_id); 881 + ev_ch_irq = gpi_read_reg(gpii, gpii->regs + offset); 882 + 883 + offset = GPII_n_CNTXT_SRC_EV_CH_IRQ_CLR_OFFS 884 + (gpii_id); 885 + gpi_write_reg(gpii, gpii->regs + offset, ev_ch_irq); 886 + ev_state = gpi_read_reg(gpii, gpii->ev_cntxt_base_reg + 887 + CNTXT_0_CONFIG); 888 + ev_state = FIELD_GET(GPII_n_EV_k_CNTXT_0_CHSTATE, ev_state); 889 + 890 + /* 891 + * CMD EV_CMD_DEALLOC is always successful. However 892 + * cmd does not change hardware status. So overwriting 893 + * software state to default state. 894 + */ 895 + if (gpii->gpi_cmd == GPI_EV_CMD_DEALLOC) 896 + ev_state = DEFAULT_EV_CH_STATE; 897 + 898 + gpii->ev_state = ev_state; 899 + dev_dbg(gpii->gpi_dev->dev, "setting EV state to %s\n", 900 + TO_GPI_EV_STATE_STR(gpii->ev_state)); 901 + complete_all(&gpii->cmd_completion); 902 + type &= ~(GPII_n_CNTXT_TYPE_IRQ_MSK_EV_CTRL); 903 + } 904 + 905 + /* channel control irq */ 906 + if (type & GPII_n_CNTXT_TYPE_IRQ_MSK_CH_CTRL) { 907 + dev_dbg(gpii->gpi_dev->dev, "process CH CTRL interrupts\n"); 908 + gpi_process_ch_ctrl_irq(gpii); 909 + type &= ~(GPII_n_CNTXT_TYPE_IRQ_MSK_CH_CTRL); 910 + } 911 + 912 + if (type) { 913 + dev_err(gpii->gpi_dev->dev, "Unhandled interrupt status:0x%x\n", type); 914 + gpi_process_gen_err_irq(gpii); 915 + goto exit_irq; 916 + } 917 + 918 + offset = GPII_n_CNTXT_TYPE_IRQ_OFFS(gpii->gpii_id); 919 + type = gpi_read_reg(gpii, gpii->regs + offset); 920 + } while (type); 921 + 922 + exit_irq: 923 + read_unlock_irqrestore(&gpii->pm_lock, flags); 924 + 925 + return IRQ_HANDLED; 926 + } 927 + 928 + /* process DMA Immediate completion data events */ 929 + static void gpi_process_imed_data_event(struct gchan *gchan, 930 + struct immediate_data_event *imed_event) 931 + { 932 + struct gpii *gpii = gchan->gpii; 933 + struct gpi_ring *ch_ring = &gchan->ch_ring; 934 + void *tre = ch_ring->base + (ch_ring->el_size * imed_event->tre_index); 935 + struct dmaengine_result result; 936 + struct gpi_desc *gpi_desc; 937 + struct virt_dma_desc *vd; 938 + unsigned long flags; 939 + u32 chid; 940 + 941 + /* 942 + * If channel not active don't process event 943 + */ 944 + if (gchan->pm_state != ACTIVE_STATE) { 945 + dev_err(gpii->gpi_dev->dev, "skipping processing event because ch @ %s state\n", 946 + TO_GPI_PM_STR(gchan->pm_state)); 947 + return; 948 + } 949 + 950 + spin_lock_irqsave(&gchan->vc.lock, flags); 951 + vd = vchan_next_desc(&gchan->vc); 952 + if (!vd) { 953 + struct gpi_ere *gpi_ere; 954 + struct gpi_tre *gpi_tre; 955 + 956 + spin_unlock_irqrestore(&gchan->vc.lock, flags); 957 + dev_dbg(gpii->gpi_dev->dev, "event without a pending descriptor!\n"); 958 + gpi_ere = (struct gpi_ere *)imed_event; 959 + dev_dbg(gpii->gpi_dev->dev, 960 + "Event: %08x %08x %08x %08x\n", 961 + gpi_ere->dword[0], gpi_ere->dword[1], 962 + gpi_ere->dword[2], gpi_ere->dword[3]); 963 + gpi_tre = tre; 964 + dev_dbg(gpii->gpi_dev->dev, 965 + "Pending TRE: %08x %08x %08x %08x\n", 966 + gpi_tre->dword[0], gpi_tre->dword[1], 967 + gpi_tre->dword[2], gpi_tre->dword[3]); 968 + return; 969 + } 970 + gpi_desc = to_gpi_desc(vd); 971 + spin_unlock_irqrestore(&gchan->vc.lock, flags); 972 + 973 + /* 974 + * RP pointed by Event is to last TRE processed, 975 + * we need to update ring rp to tre + 1 976 + */ 977 + tre += ch_ring->el_size; 978 + if (tre >= (ch_ring->base + ch_ring->len)) 979 + tre = ch_ring->base; 980 + ch_ring->rp = tre; 981 + 982 + /* make sure rp updates are immediately visible to all cores */ 983 + smp_wmb(); 984 + 985 + chid = imed_event->chid; 986 + if (imed_event->code == MSM_GPI_TCE_EOT && gpii->ieob_set) { 987 + if (chid == GPI_RX_CHAN) 988 + goto gpi_free_desc; 989 + else 990 + return; 991 + } 992 + 993 + if (imed_event->code == MSM_GPI_TCE_UNEXP_ERR) 994 + result.result = DMA_TRANS_ABORTED; 995 + else 996 + result.result = DMA_TRANS_NOERROR; 997 + result.residue = gpi_desc->len - imed_event->length; 998 + 999 + dma_cookie_complete(&vd->tx); 1000 + dmaengine_desc_get_callback_invoke(&vd->tx, &result); 1001 + 1002 + gpi_free_desc: 1003 + spin_lock_irqsave(&gchan->vc.lock, flags); 1004 + list_del(&vd->node); 1005 + spin_unlock_irqrestore(&gchan->vc.lock, flags); 1006 + kfree(gpi_desc); 1007 + gpi_desc = NULL; 1008 + } 1009 + 1010 + /* processing transfer completion events */ 1011 + static void gpi_process_xfer_compl_event(struct gchan *gchan, 1012 + struct xfer_compl_event *compl_event) 1013 + { 1014 + struct gpii *gpii = gchan->gpii; 1015 + struct gpi_ring *ch_ring = &gchan->ch_ring; 1016 + void *ev_rp = to_virtual(ch_ring, compl_event->ptr); 1017 + struct virt_dma_desc *vd; 1018 + struct gpi_desc *gpi_desc; 1019 + struct dmaengine_result result; 1020 + unsigned long flags; 1021 + u32 chid; 1022 + 1023 + /* only process events on active channel */ 1024 + if (unlikely(gchan->pm_state != ACTIVE_STATE)) { 1025 + dev_err(gpii->gpi_dev->dev, "skipping processing event because ch @ %s state\n", 1026 + TO_GPI_PM_STR(gchan->pm_state)); 1027 + return; 1028 + } 1029 + 1030 + spin_lock_irqsave(&gchan->vc.lock, flags); 1031 + vd = vchan_next_desc(&gchan->vc); 1032 + if (!vd) { 1033 + struct gpi_ere *gpi_ere; 1034 + 1035 + spin_unlock_irqrestore(&gchan->vc.lock, flags); 1036 + dev_err(gpii->gpi_dev->dev, "Event without a pending descriptor!\n"); 1037 + gpi_ere = (struct gpi_ere *)compl_event; 1038 + dev_err(gpii->gpi_dev->dev, 1039 + "Event: %08x %08x %08x %08x\n", 1040 + gpi_ere->dword[0], gpi_ere->dword[1], 1041 + gpi_ere->dword[2], gpi_ere->dword[3]); 1042 + return; 1043 + } 1044 + 1045 + gpi_desc = to_gpi_desc(vd); 1046 + spin_unlock_irqrestore(&gchan->vc.lock, flags); 1047 + 1048 + /* 1049 + * RP pointed by Event is to last TRE processed, 1050 + * we need to update ring rp to ev_rp + 1 1051 + */ 1052 + ev_rp += ch_ring->el_size; 1053 + if (ev_rp >= (ch_ring->base + ch_ring->len)) 1054 + ev_rp = ch_ring->base; 1055 + ch_ring->rp = ev_rp; 1056 + 1057 + /* update must be visible to other cores */ 1058 + smp_wmb(); 1059 + 1060 + chid = compl_event->chid; 1061 + if (compl_event->code == MSM_GPI_TCE_EOT && gpii->ieob_set) { 1062 + if (chid == GPI_RX_CHAN) 1063 + goto gpi_free_desc; 1064 + else 1065 + return; 1066 + } 1067 + 1068 + if (compl_event->code == MSM_GPI_TCE_UNEXP_ERR) { 1069 + dev_err(gpii->gpi_dev->dev, "Error in Transaction\n"); 1070 + result.result = DMA_TRANS_ABORTED; 1071 + } else { 1072 + dev_dbg(gpii->gpi_dev->dev, "Transaction Success\n"); 1073 + result.result = DMA_TRANS_NOERROR; 1074 + } 1075 + result.residue = gpi_desc->len - compl_event->length; 1076 + dev_dbg(gpii->gpi_dev->dev, "Residue %d\n", result.residue); 1077 + 1078 + dma_cookie_complete(&vd->tx); 1079 + dmaengine_desc_get_callback_invoke(&vd->tx, &result); 1080 + 1081 + gpi_free_desc: 1082 + spin_lock_irqsave(&gchan->vc.lock, flags); 1083 + list_del(&vd->node); 1084 + spin_unlock_irqrestore(&gchan->vc.lock, flags); 1085 + kfree(gpi_desc); 1086 + gpi_desc = NULL; 1087 + } 1088 + 1089 + /* process all events */ 1090 + static void gpi_process_events(struct gpii *gpii) 1091 + { 1092 + struct gpi_ring *ev_ring = &gpii->ev_ring; 1093 + phys_addr_t cntxt_rp; 1094 + void *rp; 1095 + union gpi_event *gpi_event; 1096 + struct gchan *gchan; 1097 + u32 chid, type; 1098 + 1099 + cntxt_rp = gpi_read_reg(gpii, gpii->ev_ring_rp_lsb_reg); 1100 + rp = to_virtual(ev_ring, cntxt_rp); 1101 + 1102 + do { 1103 + while (rp != ev_ring->rp) { 1104 + gpi_event = ev_ring->rp; 1105 + chid = gpi_event->xfer_compl_event.chid; 1106 + type = gpi_event->xfer_compl_event.type; 1107 + 1108 + dev_dbg(gpii->gpi_dev->dev, 1109 + "Event: CHID:%u, type:%x %08x %08x %08x %08x\n", 1110 + chid, type, gpi_event->gpi_ere.dword[0], 1111 + gpi_event->gpi_ere.dword[1], gpi_event->gpi_ere.dword[2], 1112 + gpi_event->gpi_ere.dword[3]); 1113 + 1114 + switch (type) { 1115 + case XFER_COMPLETE_EV_TYPE: 1116 + gchan = &gpii->gchan[chid]; 1117 + gpi_process_xfer_compl_event(gchan, 1118 + &gpi_event->xfer_compl_event); 1119 + break; 1120 + case STALE_EV_TYPE: 1121 + dev_dbg(gpii->gpi_dev->dev, "stale event, not processing\n"); 1122 + break; 1123 + case IMMEDIATE_DATA_EV_TYPE: 1124 + gchan = &gpii->gchan[chid]; 1125 + gpi_process_imed_data_event(gchan, 1126 + &gpi_event->immediate_data_event); 1127 + break; 1128 + case QUP_NOTIF_EV_TYPE: 1129 + dev_dbg(gpii->gpi_dev->dev, "QUP_NOTIF_EV_TYPE\n"); 1130 + break; 1131 + default: 1132 + dev_dbg(gpii->gpi_dev->dev, 1133 + "not supported event type:0x%x\n", type); 1134 + } 1135 + gpi_ring_recycle_ev_element(ev_ring); 1136 + } 1137 + gpi_write_ev_db(gpii, ev_ring, ev_ring->wp); 1138 + 1139 + /* clear pending IEOB events */ 1140 + gpi_write_reg(gpii, gpii->ieob_clr_reg, BIT(0)); 1141 + 1142 + cntxt_rp = gpi_read_reg(gpii, gpii->ev_ring_rp_lsb_reg); 1143 + rp = to_virtual(ev_ring, cntxt_rp); 1144 + 1145 + } while (rp != ev_ring->rp); 1146 + } 1147 + 1148 + /* processing events using tasklet */ 1149 + static void gpi_ev_tasklet(unsigned long data) 1150 + { 1151 + struct gpii *gpii = (struct gpii *)data; 1152 + 1153 + read_lock_bh(&gpii->pm_lock); 1154 + if (!REG_ACCESS_VALID(gpii->pm_state)) { 1155 + read_unlock_bh(&gpii->pm_lock); 1156 + dev_err(gpii->gpi_dev->dev, "not processing any events, pm_state:%s\n", 1157 + TO_GPI_PM_STR(gpii->pm_state)); 1158 + return; 1159 + } 1160 + 1161 + /* process the events */ 1162 + gpi_process_events(gpii); 1163 + 1164 + /* enable IEOB, switching back to interrupts */ 1165 + gpi_config_interrupts(gpii, MASK_IEOB_SETTINGS, 1); 1166 + read_unlock_bh(&gpii->pm_lock); 1167 + } 1168 + 1169 + /* marks all pending events for the channel as stale */ 1170 + static void gpi_mark_stale_events(struct gchan *gchan) 1171 + { 1172 + struct gpii *gpii = gchan->gpii; 1173 + struct gpi_ring *ev_ring = &gpii->ev_ring; 1174 + u32 cntxt_rp, local_rp; 1175 + void *ev_rp; 1176 + 1177 + cntxt_rp = gpi_read_reg(gpii, gpii->ev_ring_rp_lsb_reg); 1178 + 1179 + ev_rp = ev_ring->rp; 1180 + local_rp = (u32)to_physical(ev_ring, ev_rp); 1181 + while (local_rp != cntxt_rp) { 1182 + union gpi_event *gpi_event = ev_rp; 1183 + u32 chid = gpi_event->xfer_compl_event.chid; 1184 + 1185 + if (chid == gchan->chid) 1186 + gpi_event->xfer_compl_event.type = STALE_EV_TYPE; 1187 + ev_rp += ev_ring->el_size; 1188 + if (ev_rp >= (ev_ring->base + ev_ring->len)) 1189 + ev_rp = ev_ring->base; 1190 + cntxt_rp = gpi_read_reg(gpii, gpii->ev_ring_rp_lsb_reg); 1191 + local_rp = (u32)to_physical(ev_ring, ev_rp); 1192 + } 1193 + } 1194 + 1195 + /* reset sw state and issue channel reset or de-alloc */ 1196 + static int gpi_reset_chan(struct gchan *gchan, enum gpi_cmd gpi_cmd) 1197 + { 1198 + struct gpii *gpii = gchan->gpii; 1199 + struct gpi_ring *ch_ring = &gchan->ch_ring; 1200 + unsigned long flags; 1201 + LIST_HEAD(list); 1202 + int ret; 1203 + 1204 + ret = gpi_send_cmd(gpii, gchan, gpi_cmd); 1205 + if (ret) { 1206 + dev_err(gpii->gpi_dev->dev, "Error with cmd:%s ret:%d\n", 1207 + TO_GPI_CMD_STR(gpi_cmd), ret); 1208 + return ret; 1209 + } 1210 + 1211 + /* initialize the local ring ptrs */ 1212 + ch_ring->rp = ch_ring->base; 1213 + ch_ring->wp = ch_ring->base; 1214 + 1215 + /* visible to other cores */ 1216 + smp_wmb(); 1217 + 1218 + /* check event ring for any stale events */ 1219 + write_lock_irq(&gpii->pm_lock); 1220 + gpi_mark_stale_events(gchan); 1221 + 1222 + /* remove all async descriptors */ 1223 + spin_lock_irqsave(&gchan->vc.lock, flags); 1224 + vchan_get_all_descriptors(&gchan->vc, &list); 1225 + spin_unlock_irqrestore(&gchan->vc.lock, flags); 1226 + write_unlock_irq(&gpii->pm_lock); 1227 + vchan_dma_desc_free_list(&gchan->vc, &list); 1228 + 1229 + return 0; 1230 + } 1231 + 1232 + static int gpi_start_chan(struct gchan *gchan) 1233 + { 1234 + struct gpii *gpii = gchan->gpii; 1235 + int ret; 1236 + 1237 + ret = gpi_send_cmd(gpii, gchan, GPI_CH_CMD_START); 1238 + if (ret) { 1239 + dev_err(gpii->gpi_dev->dev, "Error with cmd:%s ret:%d\n", 1240 + TO_GPI_CMD_STR(GPI_CH_CMD_START), ret); 1241 + return ret; 1242 + } 1243 + 1244 + /* gpii CH is active now */ 1245 + write_lock_irq(&gpii->pm_lock); 1246 + gchan->pm_state = ACTIVE_STATE; 1247 + write_unlock_irq(&gpii->pm_lock); 1248 + 1249 + return 0; 1250 + } 1251 + 1252 + static int gpi_stop_chan(struct gchan *gchan) 1253 + { 1254 + struct gpii *gpii = gchan->gpii; 1255 + int ret; 1256 + 1257 + ret = gpi_send_cmd(gpii, gchan, GPI_CH_CMD_STOP); 1258 + if (ret) { 1259 + dev_err(gpii->gpi_dev->dev, "Error with cmd:%s ret:%d\n", 1260 + TO_GPI_CMD_STR(GPI_CH_CMD_STOP), ret); 1261 + return ret; 1262 + } 1263 + 1264 + return 0; 1265 + } 1266 + 1267 + /* allocate and configure the transfer channel */ 1268 + static int gpi_alloc_chan(struct gchan *chan, bool send_alloc_cmd) 1269 + { 1270 + struct gpii *gpii = chan->gpii; 1271 + struct gpi_ring *ring = &chan->ch_ring; 1272 + int ret; 1273 + u32 id = gpii->gpii_id; 1274 + u32 chid = chan->chid; 1275 + u32 pair_chid = !chid; 1276 + 1277 + if (send_alloc_cmd) { 1278 + ret = gpi_send_cmd(gpii, chan, GPI_CH_CMD_ALLOCATE); 1279 + if (ret) { 1280 + dev_err(gpii->gpi_dev->dev, "Error with cmd:%s ret:%d\n", 1281 + TO_GPI_CMD_STR(GPI_CH_CMD_ALLOCATE), ret); 1282 + return ret; 1283 + } 1284 + } 1285 + 1286 + gpi_write_reg(gpii, chan->ch_cntxt_base_reg + CNTXT_0_CONFIG, 1287 + GPII_n_CH_k_CNTXT_0(ring->el_size, 0, chan->dir, GPI_CHTYPE_PROTO_GPI)); 1288 + gpi_write_reg(gpii, chan->ch_cntxt_base_reg + CNTXT_1_R_LENGTH, ring->len); 1289 + gpi_write_reg(gpii, chan->ch_cntxt_base_reg + CNTXT_2_RING_BASE_LSB, ring->phys_addr); 1290 + gpi_write_reg(gpii, chan->ch_cntxt_base_reg + CNTXT_3_RING_BASE_MSB, 1291 + upper_32_bits(ring->phys_addr)); 1292 + gpi_write_reg(gpii, chan->ch_cntxt_db_reg + CNTXT_5_RING_RP_MSB - CNTXT_4_RING_RP_LSB, 1293 + upper_32_bits(ring->phys_addr)); 1294 + gpi_write_reg(gpii, gpii->regs + GPII_n_CH_k_SCRATCH_0_OFFS(id, chid), 1295 + GPII_n_CH_k_SCRATCH_0(pair_chid, chan->protocol, chan->seid)); 1296 + gpi_write_reg(gpii, gpii->regs + GPII_n_CH_k_SCRATCH_1_OFFS(id, chid), 0); 1297 + gpi_write_reg(gpii, gpii->regs + GPII_n_CH_k_SCRATCH_2_OFFS(id, chid), 0); 1298 + gpi_write_reg(gpii, gpii->regs + GPII_n_CH_k_SCRATCH_3_OFFS(id, chid), 0); 1299 + gpi_write_reg(gpii, gpii->regs + GPII_n_CH_k_QOS_OFFS(id, chid), 1); 1300 + 1301 + /* flush all the writes */ 1302 + wmb(); 1303 + return 0; 1304 + } 1305 + 1306 + /* allocate and configure event ring */ 1307 + static int gpi_alloc_ev_chan(struct gpii *gpii) 1308 + { 1309 + struct gpi_ring *ring = &gpii->ev_ring; 1310 + void __iomem *base = gpii->ev_cntxt_base_reg; 1311 + int ret; 1312 + 1313 + ret = gpi_send_cmd(gpii, NULL, GPI_EV_CMD_ALLOCATE); 1314 + if (ret) { 1315 + dev_err(gpii->gpi_dev->dev, "error with cmd:%s ret:%d\n", 1316 + TO_GPI_CMD_STR(GPI_EV_CMD_ALLOCATE), ret); 1317 + return ret; 1318 + } 1319 + 1320 + /* program event context */ 1321 + gpi_write_reg(gpii, base + CNTXT_0_CONFIG, 1322 + GPII_n_EV_k_CNTXT_0(ring->el_size, GPI_INTTYPE_IRQ, GPI_CHTYPE_GPI_EV)); 1323 + gpi_write_reg(gpii, base + CNTXT_1_R_LENGTH, ring->len); 1324 + gpi_write_reg(gpii, base + CNTXT_2_RING_BASE_LSB, lower_32_bits(ring->phys_addr)); 1325 + gpi_write_reg(gpii, base + CNTXT_3_RING_BASE_MSB, upper_32_bits(ring->phys_addr)); 1326 + gpi_write_reg(gpii, gpii->ev_cntxt_db_reg + CNTXT_5_RING_RP_MSB - CNTXT_4_RING_RP_LSB, 1327 + upper_32_bits(ring->phys_addr)); 1328 + gpi_write_reg(gpii, base + CNTXT_8_RING_INT_MOD, 0); 1329 + gpi_write_reg(gpii, base + CNTXT_10_RING_MSI_LSB, 0); 1330 + gpi_write_reg(gpii, base + CNTXT_11_RING_MSI_MSB, 0); 1331 + gpi_write_reg(gpii, base + CNTXT_8_RING_INT_MOD, 0); 1332 + gpi_write_reg(gpii, base + CNTXT_12_RING_RP_UPDATE_LSB, 0); 1333 + gpi_write_reg(gpii, base + CNTXT_13_RING_RP_UPDATE_MSB, 0); 1334 + 1335 + /* add events to ring */ 1336 + ring->wp = (ring->base + ring->len - ring->el_size); 1337 + 1338 + /* flush all the writes */ 1339 + wmb(); 1340 + 1341 + /* gpii is active now */ 1342 + write_lock_irq(&gpii->pm_lock); 1343 + gpii->pm_state = ACTIVE_STATE; 1344 + write_unlock_irq(&gpii->pm_lock); 1345 + gpi_write_ev_db(gpii, ring, ring->wp); 1346 + 1347 + return 0; 1348 + } 1349 + 1350 + /* calculate # of ERE/TRE available to queue */ 1351 + static int gpi_ring_num_elements_avail(const struct gpi_ring * const ring) 1352 + { 1353 + int elements = 0; 1354 + 1355 + if (ring->wp < ring->rp) { 1356 + elements = ((ring->rp - ring->wp) / ring->el_size) - 1; 1357 + } else { 1358 + elements = (ring->rp - ring->base) / ring->el_size; 1359 + elements += ((ring->base + ring->len - ring->wp) / ring->el_size) - 1; 1360 + } 1361 + 1362 + return elements; 1363 + } 1364 + 1365 + static int gpi_ring_add_element(struct gpi_ring *ring, void **wp) 1366 + { 1367 + if (gpi_ring_num_elements_avail(ring) <= 0) 1368 + return -ENOMEM; 1369 + 1370 + *wp = ring->wp; 1371 + ring->wp += ring->el_size; 1372 + if (ring->wp >= (ring->base + ring->len)) 1373 + ring->wp = ring->base; 1374 + 1375 + /* visible to other cores */ 1376 + smp_wmb(); 1377 + 1378 + return 0; 1379 + } 1380 + 1381 + static void gpi_ring_recycle_ev_element(struct gpi_ring *ring) 1382 + { 1383 + /* Update the WP */ 1384 + ring->wp += ring->el_size; 1385 + if (ring->wp >= (ring->base + ring->len)) 1386 + ring->wp = ring->base; 1387 + 1388 + /* Update the RP */ 1389 + ring->rp += ring->el_size; 1390 + if (ring->rp >= (ring->base + ring->len)) 1391 + ring->rp = ring->base; 1392 + 1393 + /* visible to other cores */ 1394 + smp_wmb(); 1395 + } 1396 + 1397 + static void gpi_free_ring(struct gpi_ring *ring, 1398 + struct gpii *gpii) 1399 + { 1400 + dma_free_coherent(gpii->gpi_dev->dev, ring->alloc_size, 1401 + ring->pre_aligned, ring->dma_handle); 1402 + memset(ring, 0, sizeof(*ring)); 1403 + } 1404 + 1405 + /* allocate memory for transfer and event rings */ 1406 + static int gpi_alloc_ring(struct gpi_ring *ring, u32 elements, 1407 + u32 el_size, struct gpii *gpii) 1408 + { 1409 + u64 len = elements * el_size; 1410 + int bit; 1411 + 1412 + /* ring len must be power of 2 */ 1413 + bit = find_last_bit((unsigned long *)&len, 32); 1414 + if (((1 << bit) - 1) & len) 1415 + bit++; 1416 + len = 1 << bit; 1417 + ring->alloc_size = (len + (len - 1)); 1418 + dev_dbg(gpii->gpi_dev->dev, 1419 + "#el:%u el_size:%u len:%u actual_len:%llu alloc_size:%lu\n", 1420 + elements, el_size, (elements * el_size), len, 1421 + ring->alloc_size); 1422 + 1423 + ring->pre_aligned = dma_alloc_coherent(gpii->gpi_dev->dev, 1424 + ring->alloc_size, 1425 + &ring->dma_handle, GFP_KERNEL); 1426 + if (!ring->pre_aligned) { 1427 + dev_err(gpii->gpi_dev->dev, "could not alloc size:%lu mem for ring\n", 1428 + ring->alloc_size); 1429 + return -ENOMEM; 1430 + } 1431 + 1432 + /* align the physical mem */ 1433 + ring->phys_addr = (ring->dma_handle + (len - 1)) & ~(len - 1); 1434 + ring->base = ring->pre_aligned + (ring->phys_addr - ring->dma_handle); 1435 + ring->rp = ring->base; 1436 + ring->wp = ring->base; 1437 + ring->len = len; 1438 + ring->el_size = el_size; 1439 + ring->elements = ring->len / ring->el_size; 1440 + memset(ring->base, 0, ring->len); 1441 + ring->configured = true; 1442 + 1443 + /* update to other cores */ 1444 + smp_wmb(); 1445 + 1446 + dev_dbg(gpii->gpi_dev->dev, 1447 + "phy_pre:0x%0llx phy_alig:0x%0llx len:%u el_size:%u elements:%u\n", 1448 + ring->dma_handle, ring->phys_addr, ring->len, 1449 + ring->el_size, ring->elements); 1450 + 1451 + return 0; 1452 + } 1453 + 1454 + /* copy tre into transfer ring */ 1455 + static void gpi_queue_xfer(struct gpii *gpii, struct gchan *gchan, 1456 + struct gpi_tre *gpi_tre, void **wp) 1457 + { 1458 + struct gpi_tre *ch_tre; 1459 + int ret; 1460 + 1461 + /* get next tre location we can copy */ 1462 + ret = gpi_ring_add_element(&gchan->ch_ring, (void **)&ch_tre); 1463 + if (unlikely(ret)) { 1464 + dev_err(gpii->gpi_dev->dev, "Error adding ring element to xfer ring\n"); 1465 + return; 1466 + } 1467 + 1468 + /* copy the tre info */ 1469 + memcpy(ch_tre, gpi_tre, sizeof(*ch_tre)); 1470 + *wp = ch_tre; 1471 + } 1472 + 1473 + /* reset and restart transfer channel */ 1474 + static int gpi_terminate_all(struct dma_chan *chan) 1475 + { 1476 + struct gchan *gchan = to_gchan(chan); 1477 + struct gpii *gpii = gchan->gpii; 1478 + int schid, echid, i; 1479 + int ret = 0; 1480 + 1481 + mutex_lock(&gpii->ctrl_lock); 1482 + 1483 + /* 1484 + * treat both channels as a group if its protocol is not UART 1485 + * STOP, RESET, or START needs to be in lockstep 1486 + */ 1487 + schid = (gchan->protocol == QCOM_GPI_UART) ? gchan->chid : 0; 1488 + echid = (gchan->protocol == QCOM_GPI_UART) ? schid + 1 : MAX_CHANNELS_PER_GPII; 1489 + 1490 + /* stop the channel */ 1491 + for (i = schid; i < echid; i++) { 1492 + gchan = &gpii->gchan[i]; 1493 + 1494 + /* disable ch state so no more TRE processing */ 1495 + write_lock_irq(&gpii->pm_lock); 1496 + gchan->pm_state = PREPARE_TERMINATE; 1497 + write_unlock_irq(&gpii->pm_lock); 1498 + 1499 + /* send command to Stop the channel */ 1500 + ret = gpi_stop_chan(gchan); 1501 + } 1502 + 1503 + /* reset the channels (clears any pending tre) */ 1504 + for (i = schid; i < echid; i++) { 1505 + gchan = &gpii->gchan[i]; 1506 + 1507 + ret = gpi_reset_chan(gchan, GPI_CH_CMD_RESET); 1508 + if (ret) { 1509 + dev_err(gpii->gpi_dev->dev, "Error resetting channel ret:%d\n", ret); 1510 + goto terminate_exit; 1511 + } 1512 + 1513 + /* reprogram channel CNTXT */ 1514 + ret = gpi_alloc_chan(gchan, false); 1515 + if (ret) { 1516 + dev_err(gpii->gpi_dev->dev, "Error alloc_channel ret:%d\n", ret); 1517 + goto terminate_exit; 1518 + } 1519 + } 1520 + 1521 + /* restart the channels */ 1522 + for (i = schid; i < echid; i++) { 1523 + gchan = &gpii->gchan[i]; 1524 + 1525 + ret = gpi_start_chan(gchan); 1526 + if (ret) { 1527 + dev_err(gpii->gpi_dev->dev, "Error Starting Channel ret:%d\n", ret); 1528 + goto terminate_exit; 1529 + } 1530 + } 1531 + 1532 + terminate_exit: 1533 + mutex_unlock(&gpii->ctrl_lock); 1534 + return ret; 1535 + } 1536 + 1537 + /* pause dma transfer for all channels */ 1538 + static int gpi_pause(struct dma_chan *chan) 1539 + { 1540 + struct gchan *gchan = to_gchan(chan); 1541 + struct gpii *gpii = gchan->gpii; 1542 + int i, ret; 1543 + 1544 + mutex_lock(&gpii->ctrl_lock); 1545 + 1546 + /* 1547 + * pause/resume are per gpii not per channel, so 1548 + * client needs to call pause only once 1549 + */ 1550 + if (gpii->pm_state == PAUSE_STATE) { 1551 + dev_dbg(gpii->gpi_dev->dev, "channel is already paused\n"); 1552 + mutex_unlock(&gpii->ctrl_lock); 1553 + return 0; 1554 + } 1555 + 1556 + /* send stop command to stop the channels */ 1557 + for (i = 0; i < MAX_CHANNELS_PER_GPII; i++) { 1558 + ret = gpi_stop_chan(&gpii->gchan[i]); 1559 + if (ret) { 1560 + mutex_unlock(&gpii->ctrl_lock); 1561 + return ret; 1562 + } 1563 + } 1564 + 1565 + disable_irq(gpii->irq); 1566 + 1567 + /* Wait for threads to complete out */ 1568 + tasklet_kill(&gpii->ev_task); 1569 + 1570 + write_lock_irq(&gpii->pm_lock); 1571 + gpii->pm_state = PAUSE_STATE; 1572 + write_unlock_irq(&gpii->pm_lock); 1573 + mutex_unlock(&gpii->ctrl_lock); 1574 + 1575 + return 0; 1576 + } 1577 + 1578 + /* resume dma transfer */ 1579 + static int gpi_resume(struct dma_chan *chan) 1580 + { 1581 + struct gchan *gchan = to_gchan(chan); 1582 + struct gpii *gpii = gchan->gpii; 1583 + int i, ret; 1584 + 1585 + mutex_lock(&gpii->ctrl_lock); 1586 + if (gpii->pm_state == ACTIVE_STATE) { 1587 + dev_dbg(gpii->gpi_dev->dev, "channel is already active\n"); 1588 + mutex_unlock(&gpii->ctrl_lock); 1589 + return 0; 1590 + } 1591 + 1592 + enable_irq(gpii->irq); 1593 + 1594 + /* send start command to start the channels */ 1595 + for (i = 0; i < MAX_CHANNELS_PER_GPII; i++) { 1596 + ret = gpi_send_cmd(gpii, &gpii->gchan[i], GPI_CH_CMD_START); 1597 + if (ret) { 1598 + dev_err(gpii->gpi_dev->dev, "Error starting chan, ret:%d\n", ret); 1599 + mutex_unlock(&gpii->ctrl_lock); 1600 + return ret; 1601 + } 1602 + } 1603 + 1604 + write_lock_irq(&gpii->pm_lock); 1605 + gpii->pm_state = ACTIVE_STATE; 1606 + write_unlock_irq(&gpii->pm_lock); 1607 + mutex_unlock(&gpii->ctrl_lock); 1608 + 1609 + return 0; 1610 + } 1611 + 1612 + static void gpi_desc_free(struct virt_dma_desc *vd) 1613 + { 1614 + struct gpi_desc *gpi_desc = to_gpi_desc(vd); 1615 + 1616 + kfree(gpi_desc); 1617 + gpi_desc = NULL; 1618 + } 1619 + 1620 + static int 1621 + gpi_peripheral_config(struct dma_chan *chan, struct dma_slave_config *config) 1622 + { 1623 + struct gchan *gchan = to_gchan(chan); 1624 + 1625 + if (!config->peripheral_config) 1626 + return -EINVAL; 1627 + 1628 + gchan->config = krealloc(gchan->config, config->peripheral_size, GFP_NOWAIT); 1629 + if (!gchan->config) 1630 + return -ENOMEM; 1631 + 1632 + memcpy(gchan->config, config->peripheral_config, config->peripheral_size); 1633 + 1634 + return 0; 1635 + } 1636 + 1637 + static int gpi_create_i2c_tre(struct gchan *chan, struct gpi_desc *desc, 1638 + struct scatterlist *sgl, enum dma_transfer_direction direction) 1639 + { 1640 + struct gpi_i2c_config *i2c = chan->config; 1641 + struct device *dev = chan->gpii->gpi_dev->dev; 1642 + unsigned int tre_idx = 0; 1643 + dma_addr_t address; 1644 + struct gpi_tre *tre; 1645 + unsigned int i; 1646 + 1647 + /* first create config tre if applicable */ 1648 + if (i2c->set_config) { 1649 + tre = &desc->tre[tre_idx]; 1650 + tre_idx++; 1651 + 1652 + tre->dword[0] = u32_encode_bits(i2c->low_count, TRE_I2C_C0_TLOW); 1653 + tre->dword[0] |= u32_encode_bits(i2c->high_count, TRE_I2C_C0_THIGH); 1654 + tre->dword[0] |= u32_encode_bits(i2c->cycle_count, TRE_I2C_C0_TCYL); 1655 + tre->dword[0] |= u32_encode_bits(i2c->pack_enable, TRE_I2C_C0_TX_PACK); 1656 + tre->dword[0] |= u32_encode_bits(i2c->pack_enable, TRE_I2C_C0_RX_PACK); 1657 + 1658 + tre->dword[1] = 0; 1659 + 1660 + tre->dword[2] = u32_encode_bits(i2c->clk_div, TRE_C0_CLK_DIV); 1661 + 1662 + tre->dword[3] = u32_encode_bits(TRE_TYPE_CONFIG0, TRE_FLAGS_TYPE); 1663 + tre->dword[3] |= u32_encode_bits(1, TRE_FLAGS_CHAIN); 1664 + } 1665 + 1666 + /* create the GO tre for Tx */ 1667 + if (i2c->op == I2C_WRITE) { 1668 + tre = &desc->tre[tre_idx]; 1669 + tre_idx++; 1670 + 1671 + if (i2c->multi_msg) 1672 + tre->dword[0] = u32_encode_bits(I2C_READ, TRE_I2C_GO_CMD); 1673 + else 1674 + tre->dword[0] = u32_encode_bits(i2c->op, TRE_I2C_GO_CMD); 1675 + 1676 + tre->dword[0] |= u32_encode_bits(i2c->addr, TRE_I2C_GO_ADDR); 1677 + tre->dword[0] |= u32_encode_bits(i2c->stretch, TRE_I2C_GO_STRETCH); 1678 + 1679 + tre->dword[1] = 0; 1680 + tre->dword[2] = u32_encode_bits(i2c->rx_len, TRE_RX_LEN); 1681 + 1682 + tre->dword[3] = u32_encode_bits(TRE_TYPE_GO, TRE_FLAGS_TYPE); 1683 + 1684 + if (i2c->multi_msg) 1685 + tre->dword[3] |= u32_encode_bits(1, TRE_FLAGS_LINK); 1686 + else 1687 + tre->dword[3] |= u32_encode_bits(1, TRE_FLAGS_CHAIN); 1688 + } 1689 + 1690 + if (i2c->op == I2C_READ || i2c->multi_msg == false) { 1691 + /* create the DMA TRE */ 1692 + tre = &desc->tre[tre_idx]; 1693 + tre_idx++; 1694 + 1695 + address = sg_dma_address(sgl); 1696 + tre->dword[0] = lower_32_bits(address); 1697 + tre->dword[1] = upper_32_bits(address); 1698 + 1699 + tre->dword[2] = u32_encode_bits(sg_dma_len(sgl), TRE_DMA_LEN); 1700 + 1701 + tre->dword[3] = u32_encode_bits(TRE_TYPE_DMA, TRE_FLAGS_TYPE); 1702 + tre->dword[3] |= u32_encode_bits(1, TRE_FLAGS_IEOT); 1703 + }; 1704 + 1705 + for (i = 0; i < tre_idx; i++) 1706 + dev_dbg(dev, "TRE:%d %x:%x:%x:%x\n", i, desc->tre[i].dword[0], 1707 + desc->tre[i].dword[1], desc->tre[i].dword[2], desc->tre[i].dword[3]); 1708 + 1709 + return tre_idx; 1710 + } 1711 + 1712 + static int gpi_create_spi_tre(struct gchan *chan, struct gpi_desc *desc, 1713 + struct scatterlist *sgl, enum dma_transfer_direction direction) 1714 + { 1715 + struct gpi_spi_config *spi = chan->config; 1716 + struct device *dev = chan->gpii->gpi_dev->dev; 1717 + unsigned int tre_idx = 0; 1718 + dma_addr_t address; 1719 + struct gpi_tre *tre; 1720 + unsigned int i; 1721 + 1722 + /* first create config tre if applicable */ 1723 + if (direction == DMA_MEM_TO_DEV && spi->set_config) { 1724 + tre = &desc->tre[tre_idx]; 1725 + tre_idx++; 1726 + 1727 + tre->dword[0] = u32_encode_bits(spi->word_len, TRE_SPI_C0_WORD_SZ); 1728 + tre->dword[0] |= u32_encode_bits(spi->loopback_en, TRE_SPI_C0_LOOPBACK); 1729 + tre->dword[0] |= u32_encode_bits(spi->clock_pol_high, TRE_SPI_C0_CPOL); 1730 + tre->dword[0] |= u32_encode_bits(spi->data_pol_high, TRE_SPI_C0_CPHA); 1731 + tre->dword[0] |= u32_encode_bits(spi->pack_en, TRE_SPI_C0_TX_PACK); 1732 + tre->dword[0] |= u32_encode_bits(spi->pack_en, TRE_SPI_C0_RX_PACK); 1733 + 1734 + tre->dword[1] = 0; 1735 + 1736 + tre->dword[2] = u32_encode_bits(spi->clk_div, TRE_C0_CLK_DIV); 1737 + tre->dword[2] |= u32_encode_bits(spi->clk_src, TRE_C0_CLK_SRC); 1738 + 1739 + tre->dword[3] = u32_encode_bits(TRE_TYPE_CONFIG0, TRE_FLAGS_TYPE); 1740 + tre->dword[3] |= u32_encode_bits(1, TRE_FLAGS_CHAIN); 1741 + } 1742 + 1743 + /* create the GO tre for Tx */ 1744 + if (direction == DMA_MEM_TO_DEV) { 1745 + tre = &desc->tre[tre_idx]; 1746 + tre_idx++; 1747 + 1748 + tre->dword[0] = u32_encode_bits(spi->fragmentation, TRE_SPI_GO_FRAG); 1749 + tre->dword[0] |= u32_encode_bits(spi->cs, TRE_SPI_GO_CS); 1750 + tre->dword[0] |= u32_encode_bits(spi->cmd, TRE_SPI_GO_CMD); 1751 + 1752 + tre->dword[1] = 0; 1753 + 1754 + tre->dword[2] = u32_encode_bits(spi->rx_len, TRE_RX_LEN); 1755 + 1756 + tre->dword[3] = u32_encode_bits(TRE_TYPE_GO, TRE_FLAGS_TYPE); 1757 + if (spi->cmd == SPI_RX) 1758 + tre->dword[3] |= u32_encode_bits(1, TRE_FLAGS_IEOB); 1759 + else 1760 + tre->dword[3] |= u32_encode_bits(1, TRE_FLAGS_CHAIN); 1761 + } 1762 + 1763 + /* create the dma tre */ 1764 + tre = &desc->tre[tre_idx]; 1765 + tre_idx++; 1766 + 1767 + address = sg_dma_address(sgl); 1768 + tre->dword[0] = lower_32_bits(address); 1769 + tre->dword[1] = upper_32_bits(address); 1770 + 1771 + tre->dword[2] = u32_encode_bits(sg_dma_len(sgl), TRE_DMA_LEN); 1772 + 1773 + tre->dword[3] = u32_encode_bits(TRE_TYPE_DMA, TRE_FLAGS_TYPE); 1774 + if (direction == DMA_MEM_TO_DEV) 1775 + tre->dword[3] |= u32_encode_bits(1, TRE_FLAGS_IEOT); 1776 + 1777 + for (i = 0; i < tre_idx; i++) 1778 + dev_dbg(dev, "TRE:%d %x:%x:%x:%x\n", i, desc->tre[i].dword[0], 1779 + desc->tre[i].dword[1], desc->tre[i].dword[2], desc->tre[i].dword[3]); 1780 + 1781 + return tre_idx; 1782 + } 1783 + 1784 + /* copy tre into transfer ring */ 1785 + static struct dma_async_tx_descriptor * 1786 + gpi_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, 1787 + unsigned int sg_len, enum dma_transfer_direction direction, 1788 + unsigned long flags, void *context) 1789 + { 1790 + struct gchan *gchan = to_gchan(chan); 1791 + struct gpii *gpii = gchan->gpii; 1792 + struct device *dev = gpii->gpi_dev->dev; 1793 + struct gpi_ring *ch_ring = &gchan->ch_ring; 1794 + struct gpi_desc *gpi_desc; 1795 + u32 nr, nr_tre = 0; 1796 + u8 set_config; 1797 + int i; 1798 + 1799 + gpii->ieob_set = false; 1800 + if (!is_slave_direction(direction)) { 1801 + dev_err(gpii->gpi_dev->dev, "invalid dma direction: %d\n", direction); 1802 + return NULL; 1803 + } 1804 + 1805 + if (sg_len > 1) { 1806 + dev_err(dev, "Multi sg sent, we support only one atm: %d\n", sg_len); 1807 + return NULL; 1808 + } 1809 + 1810 + nr_tre = 3; 1811 + set_config = *(u32 *)gchan->config; 1812 + if (!set_config) 1813 + nr_tre = 2; 1814 + if (direction == DMA_DEV_TO_MEM) /* rx */ 1815 + nr_tre = 1; 1816 + 1817 + /* calculate # of elements required & available */ 1818 + nr = gpi_ring_num_elements_avail(ch_ring); 1819 + if (nr < nr_tre) { 1820 + dev_err(dev, "not enough space in ring, avail:%u required:%u\n", nr, nr_tre); 1821 + return NULL; 1822 + } 1823 + 1824 + gpi_desc = kzalloc(sizeof(*gpi_desc), GFP_NOWAIT); 1825 + if (!gpi_desc) 1826 + return NULL; 1827 + 1828 + /* create TREs for xfer */ 1829 + if (gchan->protocol == QCOM_GPI_SPI) { 1830 + i = gpi_create_spi_tre(gchan, gpi_desc, sgl, direction); 1831 + } else if (gchan->protocol == QCOM_GPI_I2C) { 1832 + i = gpi_create_i2c_tre(gchan, gpi_desc, sgl, direction); 1833 + } else { 1834 + dev_err(dev, "invalid peripheral: %d\n", gchan->protocol); 1835 + kfree(gpi_desc); 1836 + return NULL; 1837 + } 1838 + 1839 + /* set up the descriptor */ 1840 + gpi_desc->gchan = gchan; 1841 + gpi_desc->len = sg_dma_len(sgl); 1842 + gpi_desc->num_tre = i; 1843 + 1844 + return vchan_tx_prep(&gchan->vc, &gpi_desc->vd, flags); 1845 + } 1846 + 1847 + /* rings transfer ring db to being transfer */ 1848 + static void gpi_issue_pending(struct dma_chan *chan) 1849 + { 1850 + struct gchan *gchan = to_gchan(chan); 1851 + struct gpii *gpii = gchan->gpii; 1852 + unsigned long flags, pm_lock_flags; 1853 + struct virt_dma_desc *vd = NULL; 1854 + struct gpi_desc *gpi_desc; 1855 + struct gpi_ring *ch_ring = &gchan->ch_ring; 1856 + void *tre, *wp = NULL; 1857 + int i; 1858 + 1859 + read_lock_irqsave(&gpii->pm_lock, pm_lock_flags); 1860 + 1861 + /* move all submitted discriptors to issued list */ 1862 + spin_lock_irqsave(&gchan->vc.lock, flags); 1863 + if (vchan_issue_pending(&gchan->vc)) 1864 + vd = list_last_entry(&gchan->vc.desc_issued, 1865 + struct virt_dma_desc, node); 1866 + spin_unlock_irqrestore(&gchan->vc.lock, flags); 1867 + 1868 + /* nothing to do list is empty */ 1869 + if (!vd) { 1870 + read_unlock_irqrestore(&gpii->pm_lock, pm_lock_flags); 1871 + return; 1872 + } 1873 + 1874 + gpi_desc = to_gpi_desc(vd); 1875 + for (i = 0; i < gpi_desc->num_tre; i++) { 1876 + tre = &gpi_desc->tre[i]; 1877 + gpi_queue_xfer(gpii, gchan, tre, &wp); 1878 + } 1879 + 1880 + gpi_desc->db = ch_ring->wp; 1881 + gpi_write_ch_db(gchan, &gchan->ch_ring, gpi_desc->db); 1882 + read_unlock_irqrestore(&gpii->pm_lock, pm_lock_flags); 1883 + } 1884 + 1885 + static int gpi_ch_init(struct gchan *gchan) 1886 + { 1887 + struct gpii *gpii = gchan->gpii; 1888 + const int ev_factor = gpii->gpi_dev->ev_factor; 1889 + u32 elements; 1890 + int i = 0, ret = 0; 1891 + 1892 + gchan->pm_state = CONFIG_STATE; 1893 + 1894 + /* check if both channels are configured before continue */ 1895 + for (i = 0; i < MAX_CHANNELS_PER_GPII; i++) 1896 + if (gpii->gchan[i].pm_state != CONFIG_STATE) 1897 + goto exit_gpi_init; 1898 + 1899 + /* protocol must be same for both channels */ 1900 + if (gpii->gchan[0].protocol != gpii->gchan[1].protocol) { 1901 + dev_err(gpii->gpi_dev->dev, "protocol did not match protocol %u != %u\n", 1902 + gpii->gchan[0].protocol, gpii->gchan[1].protocol); 1903 + ret = -EINVAL; 1904 + goto exit_gpi_init; 1905 + } 1906 + 1907 + /* allocate memory for event ring */ 1908 + elements = CHAN_TRES << ev_factor; 1909 + ret = gpi_alloc_ring(&gpii->ev_ring, elements, 1910 + sizeof(union gpi_event), gpii); 1911 + if (ret) 1912 + goto exit_gpi_init; 1913 + 1914 + /* configure interrupts */ 1915 + write_lock_irq(&gpii->pm_lock); 1916 + gpii->pm_state = PREPARE_HARDWARE; 1917 + write_unlock_irq(&gpii->pm_lock); 1918 + ret = gpi_config_interrupts(gpii, DEFAULT_IRQ_SETTINGS, 0); 1919 + if (ret) { 1920 + dev_err(gpii->gpi_dev->dev, "error config. interrupts, ret:%d\n", ret); 1921 + goto error_config_int; 1922 + } 1923 + 1924 + /* allocate event rings */ 1925 + ret = gpi_alloc_ev_chan(gpii); 1926 + if (ret) { 1927 + dev_err(gpii->gpi_dev->dev, "error alloc_ev_chan:%d\n", ret); 1928 + goto error_alloc_ev_ring; 1929 + } 1930 + 1931 + /* Allocate all channels */ 1932 + for (i = 0; i < MAX_CHANNELS_PER_GPII; i++) { 1933 + ret = gpi_alloc_chan(&gpii->gchan[i], true); 1934 + if (ret) { 1935 + dev_err(gpii->gpi_dev->dev, "Error allocating chan:%d\n", ret); 1936 + goto error_alloc_chan; 1937 + } 1938 + } 1939 + 1940 + /* start channels */ 1941 + for (i = 0; i < MAX_CHANNELS_PER_GPII; i++) { 1942 + ret = gpi_start_chan(&gpii->gchan[i]); 1943 + if (ret) { 1944 + dev_err(gpii->gpi_dev->dev, "Error start chan:%d\n", ret); 1945 + goto error_start_chan; 1946 + } 1947 + } 1948 + return ret; 1949 + 1950 + error_start_chan: 1951 + for (i = i - 1; i >= 0; i++) { 1952 + gpi_stop_chan(&gpii->gchan[i]); 1953 + gpi_send_cmd(gpii, gchan, GPI_CH_CMD_RESET); 1954 + } 1955 + i = 2; 1956 + error_alloc_chan: 1957 + for (i = i - 1; i >= 0; i--) 1958 + gpi_reset_chan(gchan, GPI_CH_CMD_DE_ALLOC); 1959 + error_alloc_ev_ring: 1960 + gpi_disable_interrupts(gpii); 1961 + error_config_int: 1962 + gpi_free_ring(&gpii->ev_ring, gpii); 1963 + exit_gpi_init: 1964 + mutex_unlock(&gpii->ctrl_lock); 1965 + return ret; 1966 + } 1967 + 1968 + /* release all channel resources */ 1969 + static void gpi_free_chan_resources(struct dma_chan *chan) 1970 + { 1971 + struct gchan *gchan = to_gchan(chan); 1972 + struct gpii *gpii = gchan->gpii; 1973 + enum gpi_pm_state cur_state; 1974 + int ret, i; 1975 + 1976 + mutex_lock(&gpii->ctrl_lock); 1977 + 1978 + cur_state = gchan->pm_state; 1979 + 1980 + /* disable ch state so no more TRE processing for this channel */ 1981 + write_lock_irq(&gpii->pm_lock); 1982 + gchan->pm_state = PREPARE_TERMINATE; 1983 + write_unlock_irq(&gpii->pm_lock); 1984 + 1985 + /* attempt to do graceful hardware shutdown */ 1986 + if (cur_state == ACTIVE_STATE) { 1987 + gpi_stop_chan(gchan); 1988 + 1989 + ret = gpi_send_cmd(gpii, gchan, GPI_CH_CMD_RESET); 1990 + if (ret) 1991 + dev_err(gpii->gpi_dev->dev, "error resetting channel:%d\n", ret); 1992 + 1993 + gpi_reset_chan(gchan, GPI_CH_CMD_DE_ALLOC); 1994 + } 1995 + 1996 + /* free all allocated memory */ 1997 + gpi_free_ring(&gchan->ch_ring, gpii); 1998 + vchan_free_chan_resources(&gchan->vc); 1999 + kfree(gchan->config); 2000 + 2001 + write_lock_irq(&gpii->pm_lock); 2002 + gchan->pm_state = DISABLE_STATE; 2003 + write_unlock_irq(&gpii->pm_lock); 2004 + 2005 + /* if other rings are still active exit */ 2006 + for (i = 0; i < MAX_CHANNELS_PER_GPII; i++) 2007 + if (gpii->gchan[i].ch_ring.configured) 2008 + goto exit_free; 2009 + 2010 + /* deallocate EV Ring */ 2011 + cur_state = gpii->pm_state; 2012 + write_lock_irq(&gpii->pm_lock); 2013 + gpii->pm_state = PREPARE_TERMINATE; 2014 + write_unlock_irq(&gpii->pm_lock); 2015 + 2016 + /* wait for threads to complete out */ 2017 + tasklet_kill(&gpii->ev_task); 2018 + 2019 + /* send command to de allocate event ring */ 2020 + if (cur_state == ACTIVE_STATE) 2021 + gpi_send_cmd(gpii, NULL, GPI_EV_CMD_DEALLOC); 2022 + 2023 + gpi_free_ring(&gpii->ev_ring, gpii); 2024 + 2025 + /* disable interrupts */ 2026 + if (cur_state == ACTIVE_STATE) 2027 + gpi_disable_interrupts(gpii); 2028 + 2029 + /* set final state to disable */ 2030 + write_lock_irq(&gpii->pm_lock); 2031 + gpii->pm_state = DISABLE_STATE; 2032 + write_unlock_irq(&gpii->pm_lock); 2033 + 2034 + exit_free: 2035 + mutex_unlock(&gpii->ctrl_lock); 2036 + } 2037 + 2038 + /* allocate channel resources */ 2039 + static int gpi_alloc_chan_resources(struct dma_chan *chan) 2040 + { 2041 + struct gchan *gchan = to_gchan(chan); 2042 + struct gpii *gpii = gchan->gpii; 2043 + int ret; 2044 + 2045 + mutex_lock(&gpii->ctrl_lock); 2046 + 2047 + /* allocate memory for transfer ring */ 2048 + ret = gpi_alloc_ring(&gchan->ch_ring, CHAN_TRES, 2049 + sizeof(struct gpi_tre), gpii); 2050 + if (ret) 2051 + goto xfer_alloc_err; 2052 + 2053 + ret = gpi_ch_init(gchan); 2054 + 2055 + mutex_unlock(&gpii->ctrl_lock); 2056 + 2057 + return ret; 2058 + xfer_alloc_err: 2059 + mutex_unlock(&gpii->ctrl_lock); 2060 + 2061 + return ret; 2062 + } 2063 + 2064 + static int gpi_find_avail_gpii(struct gpi_dev *gpi_dev, u32 seid) 2065 + { 2066 + struct gchan *tx_chan, *rx_chan; 2067 + unsigned int gpii; 2068 + 2069 + /* check if same seid is already configured for another chid */ 2070 + for (gpii = 0; gpii < gpi_dev->max_gpii; gpii++) { 2071 + if (!((1 << gpii) & gpi_dev->gpii_mask)) 2072 + continue; 2073 + 2074 + tx_chan = &gpi_dev->gpiis[gpii].gchan[GPI_TX_CHAN]; 2075 + rx_chan = &gpi_dev->gpiis[gpii].gchan[GPI_RX_CHAN]; 2076 + 2077 + if (rx_chan->vc.chan.client_count && rx_chan->seid == seid) 2078 + return gpii; 2079 + if (tx_chan->vc.chan.client_count && tx_chan->seid == seid) 2080 + return gpii; 2081 + } 2082 + 2083 + /* no channels configured with same seid, return next avail gpii */ 2084 + for (gpii = 0; gpii < gpi_dev->max_gpii; gpii++) { 2085 + if (!((1 << gpii) & gpi_dev->gpii_mask)) 2086 + continue; 2087 + 2088 + tx_chan = &gpi_dev->gpiis[gpii].gchan[GPI_TX_CHAN]; 2089 + rx_chan = &gpi_dev->gpiis[gpii].gchan[GPI_RX_CHAN]; 2090 + 2091 + /* check if gpii is configured */ 2092 + if (tx_chan->vc.chan.client_count || 2093 + rx_chan->vc.chan.client_count) 2094 + continue; 2095 + 2096 + /* found a free gpii */ 2097 + return gpii; 2098 + } 2099 + 2100 + /* no gpii instance available to use */ 2101 + return -EIO; 2102 + } 2103 + 2104 + /* gpi_of_dma_xlate: open client requested channel */ 2105 + static struct dma_chan *gpi_of_dma_xlate(struct of_phandle_args *args, 2106 + struct of_dma *of_dma) 2107 + { 2108 + struct gpi_dev *gpi_dev = (struct gpi_dev *)of_dma->of_dma_data; 2109 + u32 seid, chid; 2110 + int gpii; 2111 + struct gchan *gchan; 2112 + 2113 + if (args->args_count < 3) { 2114 + dev_err(gpi_dev->dev, "gpii require minimum 2 args, client passed:%d args\n", 2115 + args->args_count); 2116 + return NULL; 2117 + } 2118 + 2119 + chid = args->args[0]; 2120 + if (chid >= MAX_CHANNELS_PER_GPII) { 2121 + dev_err(gpi_dev->dev, "gpii channel:%d not valid\n", chid); 2122 + return NULL; 2123 + } 2124 + 2125 + seid = args->args[1]; 2126 + 2127 + /* find next available gpii to use */ 2128 + gpii = gpi_find_avail_gpii(gpi_dev, seid); 2129 + if (gpii < 0) { 2130 + dev_err(gpi_dev->dev, "no available gpii instances\n"); 2131 + return NULL; 2132 + } 2133 + 2134 + gchan = &gpi_dev->gpiis[gpii].gchan[chid]; 2135 + if (gchan->vc.chan.client_count) { 2136 + dev_err(gpi_dev->dev, "gpii:%d chid:%d seid:%d already configured\n", 2137 + gpii, chid, gchan->seid); 2138 + return NULL; 2139 + } 2140 + 2141 + gchan->seid = seid; 2142 + gchan->protocol = args->args[2]; 2143 + 2144 + return dma_get_slave_channel(&gchan->vc.chan); 2145 + } 2146 + 2147 + static int gpi_probe(struct platform_device *pdev) 2148 + { 2149 + struct gpi_dev *gpi_dev; 2150 + unsigned int i; 2151 + int ret; 2152 + 2153 + gpi_dev = devm_kzalloc(&pdev->dev, sizeof(*gpi_dev), GFP_KERNEL); 2154 + if (!gpi_dev) 2155 + return -ENOMEM; 2156 + 2157 + gpi_dev->dev = &pdev->dev; 2158 + gpi_dev->res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 2159 + gpi_dev->regs = devm_ioremap_resource(gpi_dev->dev, gpi_dev->res); 2160 + if (IS_ERR(gpi_dev->regs)) 2161 + return PTR_ERR(gpi_dev->regs); 2162 + gpi_dev->ee_base = gpi_dev->regs; 2163 + 2164 + ret = of_property_read_u32(gpi_dev->dev->of_node, "dma-channels", 2165 + &gpi_dev->max_gpii); 2166 + if (ret) { 2167 + dev_err(gpi_dev->dev, "missing 'max-no-gpii' DT node\n"); 2168 + return ret; 2169 + } 2170 + 2171 + ret = of_property_read_u32(gpi_dev->dev->of_node, "dma-channel-mask", 2172 + &gpi_dev->gpii_mask); 2173 + if (ret) { 2174 + dev_err(gpi_dev->dev, "missing 'gpii-mask' DT node\n"); 2175 + return ret; 2176 + } 2177 + 2178 + gpi_dev->ev_factor = EV_FACTOR; 2179 + 2180 + ret = dma_set_mask(gpi_dev->dev, DMA_BIT_MASK(64)); 2181 + if (ret) { 2182 + dev_err(gpi_dev->dev, "Error setting dma_mask to 64, ret:%d\n", ret); 2183 + return ret; 2184 + } 2185 + 2186 + gpi_dev->gpiis = devm_kzalloc(gpi_dev->dev, sizeof(*gpi_dev->gpiis) * 2187 + gpi_dev->max_gpii, GFP_KERNEL); 2188 + if (!gpi_dev->gpiis) 2189 + return -ENOMEM; 2190 + 2191 + /* setup all the supported gpii */ 2192 + INIT_LIST_HEAD(&gpi_dev->dma_device.channels); 2193 + for (i = 0; i < gpi_dev->max_gpii; i++) { 2194 + struct gpii *gpii = &gpi_dev->gpiis[i]; 2195 + int chan; 2196 + 2197 + if (!((1 << i) & gpi_dev->gpii_mask)) 2198 + continue; 2199 + 2200 + /* set up ev cntxt register map */ 2201 + gpii->ev_cntxt_base_reg = gpi_dev->ee_base + GPII_n_EV_CH_k_CNTXT_0_OFFS(i, 0); 2202 + gpii->ev_cntxt_db_reg = gpi_dev->ee_base + GPII_n_EV_CH_k_DOORBELL_0_OFFS(i, 0); 2203 + gpii->ev_ring_rp_lsb_reg = gpii->ev_cntxt_base_reg + CNTXT_4_RING_RP_LSB; 2204 + gpii->ev_cmd_reg = gpi_dev->ee_base + GPII_n_EV_CH_CMD_OFFS(i); 2205 + gpii->ieob_clr_reg = gpi_dev->ee_base + GPII_n_CNTXT_SRC_IEOB_IRQ_CLR_OFFS(i); 2206 + 2207 + /* set up irq */ 2208 + ret = platform_get_irq(pdev, i); 2209 + if (ret < 0) { 2210 + dev_err(gpi_dev->dev, "platform_get_irq failed for %d:%d\n", i, ret); 2211 + return ret; 2212 + } 2213 + gpii->irq = ret; 2214 + 2215 + /* set up channel specific register info */ 2216 + for (chan = 0; chan < MAX_CHANNELS_PER_GPII; chan++) { 2217 + struct gchan *gchan = &gpii->gchan[chan]; 2218 + 2219 + /* set up ch cntxt register map */ 2220 + gchan->ch_cntxt_base_reg = gpi_dev->ee_base + 2221 + GPII_n_CH_k_CNTXT_0_OFFS(i, chan); 2222 + gchan->ch_cntxt_db_reg = gpi_dev->ee_base + 2223 + GPII_n_CH_k_DOORBELL_0_OFFS(i, chan); 2224 + gchan->ch_cmd_reg = gpi_dev->ee_base + GPII_n_CH_CMD_OFFS(i); 2225 + 2226 + /* vchan setup */ 2227 + vchan_init(&gchan->vc, &gpi_dev->dma_device); 2228 + gchan->vc.desc_free = gpi_desc_free; 2229 + gchan->chid = chan; 2230 + gchan->gpii = gpii; 2231 + gchan->dir = GPII_CHAN_DIR[chan]; 2232 + } 2233 + mutex_init(&gpii->ctrl_lock); 2234 + rwlock_init(&gpii->pm_lock); 2235 + tasklet_init(&gpii->ev_task, gpi_ev_tasklet, 2236 + (unsigned long)gpii); 2237 + init_completion(&gpii->cmd_completion); 2238 + gpii->gpii_id = i; 2239 + gpii->regs = gpi_dev->ee_base; 2240 + gpii->gpi_dev = gpi_dev; 2241 + } 2242 + 2243 + platform_set_drvdata(pdev, gpi_dev); 2244 + 2245 + /* clear and Set capabilities */ 2246 + dma_cap_zero(gpi_dev->dma_device.cap_mask); 2247 + dma_cap_set(DMA_SLAVE, gpi_dev->dma_device.cap_mask); 2248 + 2249 + /* configure dmaengine apis */ 2250 + gpi_dev->dma_device.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); 2251 + gpi_dev->dma_device.residue_granularity = DMA_RESIDUE_GRANULARITY_DESCRIPTOR; 2252 + gpi_dev->dma_device.src_addr_widths = DMA_SLAVE_BUSWIDTH_8_BYTES; 2253 + gpi_dev->dma_device.dst_addr_widths = DMA_SLAVE_BUSWIDTH_8_BYTES; 2254 + gpi_dev->dma_device.device_alloc_chan_resources = gpi_alloc_chan_resources; 2255 + gpi_dev->dma_device.device_free_chan_resources = gpi_free_chan_resources; 2256 + gpi_dev->dma_device.device_tx_status = dma_cookie_status; 2257 + gpi_dev->dma_device.device_issue_pending = gpi_issue_pending; 2258 + gpi_dev->dma_device.device_prep_slave_sg = gpi_prep_slave_sg; 2259 + gpi_dev->dma_device.device_config = gpi_peripheral_config; 2260 + gpi_dev->dma_device.device_terminate_all = gpi_terminate_all; 2261 + gpi_dev->dma_device.dev = gpi_dev->dev; 2262 + gpi_dev->dma_device.device_pause = gpi_pause; 2263 + gpi_dev->dma_device.device_resume = gpi_resume; 2264 + 2265 + /* register with dmaengine framework */ 2266 + ret = dma_async_device_register(&gpi_dev->dma_device); 2267 + if (ret) { 2268 + dev_err(gpi_dev->dev, "async_device_register failed ret:%d", ret); 2269 + return ret; 2270 + } 2271 + 2272 + ret = of_dma_controller_register(gpi_dev->dev->of_node, 2273 + gpi_of_dma_xlate, gpi_dev); 2274 + if (ret) { 2275 + dev_err(gpi_dev->dev, "of_dma_controller_reg failed ret:%d", ret); 2276 + return ret; 2277 + } 2278 + 2279 + return ret; 2280 + } 2281 + 2282 + static const struct of_device_id gpi_of_match[] = { 2283 + { .compatible = "qcom,sdm845-gpi-dma" }, 2284 + { }, 2285 + }; 2286 + MODULE_DEVICE_TABLE(of, gpi_of_match); 2287 + 2288 + static struct platform_driver gpi_driver = { 2289 + .probe = gpi_probe, 2290 + .driver = { 2291 + .name = KBUILD_MODNAME, 2292 + .of_match_table = gpi_of_match, 2293 + }, 2294 + }; 2295 + 2296 + static int __init gpi_init(void) 2297 + { 2298 + return platform_driver_register(&gpi_driver); 2299 + } 2300 + subsys_initcall(gpi_init) 2301 + 2302 + MODULE_DESCRIPTION("QCOM GPI DMA engine driver"); 2303 + MODULE_LICENSE("GPL v2");
+905
drivers/dma/qcom/qcom_adm.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. 4 + */ 5 + 6 + #include <linux/clk.h> 7 + #include <linux/delay.h> 8 + #include <linux/device.h> 9 + #include <linux/dmaengine.h> 10 + #include <linux/dma-mapping.h> 11 + #include <linux/init.h> 12 + #include <linux/interrupt.h> 13 + #include <linux/io.h> 14 + #include <linux/kernel.h> 15 + #include <linux/module.h> 16 + #include <linux/of.h> 17 + #include <linux/of_address.h> 18 + #include <linux/of_irq.h> 19 + #include <linux/of_dma.h> 20 + #include <linux/platform_device.h> 21 + #include <linux/reset.h> 22 + #include <linux/scatterlist.h> 23 + #include <linux/slab.h> 24 + 25 + #include "../dmaengine.h" 26 + #include "../virt-dma.h" 27 + 28 + /* ADM registers - calculated from channel number and security domain */ 29 + #define ADM_CHAN_MULTI 0x4 30 + #define ADM_CI_MULTI 0x4 31 + #define ADM_CRCI_MULTI 0x4 32 + #define ADM_EE_MULTI 0x800 33 + #define ADM_CHAN_OFFS(chan) (ADM_CHAN_MULTI * (chan)) 34 + #define ADM_EE_OFFS(ee) (ADM_EE_MULTI * (ee)) 35 + #define ADM_CHAN_EE_OFFS(chan, ee) (ADM_CHAN_OFFS(chan) + ADM_EE_OFFS(ee)) 36 + #define ADM_CHAN_OFFS(chan) (ADM_CHAN_MULTI * (chan)) 37 + #define ADM_CI_OFFS(ci) (ADM_CHAN_OFF(ci)) 38 + #define ADM_CH_CMD_PTR(chan, ee) (ADM_CHAN_EE_OFFS(chan, ee)) 39 + #define ADM_CH_RSLT(chan, ee) (0x40 + ADM_CHAN_EE_OFFS(chan, ee)) 40 + #define ADM_CH_FLUSH_STATE0(chan, ee) (0x80 + ADM_CHAN_EE_OFFS(chan, ee)) 41 + #define ADM_CH_STATUS_SD(chan, ee) (0x200 + ADM_CHAN_EE_OFFS(chan, ee)) 42 + #define ADM_CH_CONF(chan) (0x240 + ADM_CHAN_OFFS(chan)) 43 + #define ADM_CH_RSLT_CONF(chan, ee) (0x300 + ADM_CHAN_EE_OFFS(chan, ee)) 44 + #define ADM_SEC_DOMAIN_IRQ_STATUS(ee) (0x380 + ADM_EE_OFFS(ee)) 45 + #define ADM_CI_CONF(ci) (0x390 + (ci) * ADM_CI_MULTI) 46 + #define ADM_GP_CTL 0x3d8 47 + #define ADM_CRCI_CTL(crci, ee) (0x400 + (crci) * ADM_CRCI_MULTI + \ 48 + ADM_EE_OFFS(ee)) 49 + 50 + /* channel status */ 51 + #define ADM_CH_STATUS_VALID BIT(1) 52 + 53 + /* channel result */ 54 + #define ADM_CH_RSLT_VALID BIT(31) 55 + #define ADM_CH_RSLT_ERR BIT(3) 56 + #define ADM_CH_RSLT_FLUSH BIT(2) 57 + #define ADM_CH_RSLT_TPD BIT(1) 58 + 59 + /* channel conf */ 60 + #define ADM_CH_CONF_SHADOW_EN BIT(12) 61 + #define ADM_CH_CONF_MPU_DISABLE BIT(11) 62 + #define ADM_CH_CONF_PERM_MPU_CONF BIT(9) 63 + #define ADM_CH_CONF_FORCE_RSLT_EN BIT(7) 64 + #define ADM_CH_CONF_SEC_DOMAIN(ee) ((((ee) & 0x3) << 4) | (((ee) & 0x4) << 11)) 65 + 66 + /* channel result conf */ 67 + #define ADM_CH_RSLT_CONF_FLUSH_EN BIT(1) 68 + #define ADM_CH_RSLT_CONF_IRQ_EN BIT(0) 69 + 70 + /* CRCI CTL */ 71 + #define ADM_CRCI_CTL_MUX_SEL BIT(18) 72 + #define ADM_CRCI_CTL_RST BIT(17) 73 + 74 + /* CI configuration */ 75 + #define ADM_CI_RANGE_END(x) ((x) << 24) 76 + #define ADM_CI_RANGE_START(x) ((x) << 16) 77 + #define ADM_CI_BURST_4_WORDS BIT(2) 78 + #define ADM_CI_BURST_8_WORDS BIT(3) 79 + 80 + /* GP CTL */ 81 + #define ADM_GP_CTL_LP_EN BIT(12) 82 + #define ADM_GP_CTL_LP_CNT(x) ((x) << 8) 83 + 84 + /* Command pointer list entry */ 85 + #define ADM_CPLE_LP BIT(31) 86 + #define ADM_CPLE_CMD_PTR_LIST BIT(29) 87 + 88 + /* Command list entry */ 89 + #define ADM_CMD_LC BIT(31) 90 + #define ADM_CMD_DST_CRCI(n) (((n) & 0xf) << 7) 91 + #define ADM_CMD_SRC_CRCI(n) (((n) & 0xf) << 3) 92 + 93 + #define ADM_CMD_TYPE_SINGLE 0x0 94 + #define ADM_CMD_TYPE_BOX 0x3 95 + 96 + #define ADM_CRCI_MUX_SEL BIT(4) 97 + #define ADM_DESC_ALIGN 8 98 + #define ADM_MAX_XFER (SZ_64K - 1) 99 + #define ADM_MAX_ROWS (SZ_64K - 1) 100 + #define ADM_MAX_CHANNELS 16 101 + 102 + struct adm_desc_hw_box { 103 + u32 cmd; 104 + u32 src_addr; 105 + u32 dst_addr; 106 + u32 row_len; 107 + u32 num_rows; 108 + u32 row_offset; 109 + }; 110 + 111 + struct adm_desc_hw_single { 112 + u32 cmd; 113 + u32 src_addr; 114 + u32 dst_addr; 115 + u32 len; 116 + }; 117 + 118 + struct adm_async_desc { 119 + struct virt_dma_desc vd; 120 + struct adm_device *adev; 121 + 122 + size_t length; 123 + enum dma_transfer_direction dir; 124 + dma_addr_t dma_addr; 125 + size_t dma_len; 126 + 127 + void *cpl; 128 + dma_addr_t cp_addr; 129 + u32 crci; 130 + u32 mux; 131 + u32 blk_size; 132 + }; 133 + 134 + struct adm_chan { 135 + struct virt_dma_chan vc; 136 + struct adm_device *adev; 137 + 138 + /* parsed from DT */ 139 + u32 id; /* channel id */ 140 + 141 + struct adm_async_desc *curr_txd; 142 + struct dma_slave_config slave; 143 + struct list_head node; 144 + 145 + int error; 146 + int initialized; 147 + }; 148 + 149 + static inline struct adm_chan *to_adm_chan(struct dma_chan *common) 150 + { 151 + return container_of(common, struct adm_chan, vc.chan); 152 + } 153 + 154 + struct adm_device { 155 + void __iomem *regs; 156 + struct device *dev; 157 + struct dma_device common; 158 + struct device_dma_parameters dma_parms; 159 + struct adm_chan *channels; 160 + 161 + u32 ee; 162 + 163 + struct clk *core_clk; 164 + struct clk *iface_clk; 165 + 166 + struct reset_control *clk_reset; 167 + struct reset_control *c0_reset; 168 + struct reset_control *c1_reset; 169 + struct reset_control *c2_reset; 170 + int irq; 171 + }; 172 + 173 + /** 174 + * adm_free_chan - Frees dma resources associated with the specific channel 175 + * 176 + * @chan: dma channel 177 + * 178 + * Free all allocated descriptors associated with this channel 179 + */ 180 + static void adm_free_chan(struct dma_chan *chan) 181 + { 182 + /* free all queued descriptors */ 183 + vchan_free_chan_resources(to_virt_chan(chan)); 184 + } 185 + 186 + /** 187 + * adm_get_blksize - Get block size from burst value 188 + * 189 + * @burst: Burst size of transaction 190 + */ 191 + static int adm_get_blksize(unsigned int burst) 192 + { 193 + int ret; 194 + 195 + switch (burst) { 196 + case 16: 197 + case 32: 198 + case 64: 199 + case 128: 200 + ret = ffs(burst >> 4) - 1; 201 + break; 202 + case 192: 203 + ret = 4; 204 + break; 205 + case 256: 206 + ret = 5; 207 + break; 208 + default: 209 + ret = -EINVAL; 210 + break; 211 + } 212 + 213 + return ret; 214 + } 215 + 216 + /** 217 + * adm_process_fc_descriptors - Process descriptors for flow controlled xfers 218 + * 219 + * @achan: ADM channel 220 + * @desc: Descriptor memory pointer 221 + * @sg: Scatterlist entry 222 + * @crci: CRCI value 223 + * @burst: Burst size of transaction 224 + * @direction: DMA transfer direction 225 + */ 226 + static void *adm_process_fc_descriptors(struct adm_chan *achan, void *desc, 227 + struct scatterlist *sg, u32 crci, 228 + u32 burst, 229 + enum dma_transfer_direction direction) 230 + { 231 + struct adm_desc_hw_box *box_desc = NULL; 232 + struct adm_desc_hw_single *single_desc; 233 + u32 remainder = sg_dma_len(sg); 234 + u32 rows, row_offset, crci_cmd; 235 + u32 mem_addr = sg_dma_address(sg); 236 + u32 *incr_addr = &mem_addr; 237 + u32 *src, *dst; 238 + 239 + if (direction == DMA_DEV_TO_MEM) { 240 + crci_cmd = ADM_CMD_SRC_CRCI(crci); 241 + row_offset = burst; 242 + src = &achan->slave.src_addr; 243 + dst = &mem_addr; 244 + } else { 245 + crci_cmd = ADM_CMD_DST_CRCI(crci); 246 + row_offset = burst << 16; 247 + src = &mem_addr; 248 + dst = &achan->slave.dst_addr; 249 + } 250 + 251 + while (remainder >= burst) { 252 + box_desc = desc; 253 + box_desc->cmd = ADM_CMD_TYPE_BOX | crci_cmd; 254 + box_desc->row_offset = row_offset; 255 + box_desc->src_addr = *src; 256 + box_desc->dst_addr = *dst; 257 + 258 + rows = remainder / burst; 259 + rows = min_t(u32, rows, ADM_MAX_ROWS); 260 + box_desc->num_rows = rows << 16 | rows; 261 + box_desc->row_len = burst << 16 | burst; 262 + 263 + *incr_addr += burst * rows; 264 + remainder -= burst * rows; 265 + desc += sizeof(*box_desc); 266 + } 267 + 268 + /* if leftover bytes, do one single descriptor */ 269 + if (remainder) { 270 + single_desc = desc; 271 + single_desc->cmd = ADM_CMD_TYPE_SINGLE | crci_cmd; 272 + single_desc->len = remainder; 273 + single_desc->src_addr = *src; 274 + single_desc->dst_addr = *dst; 275 + desc += sizeof(*single_desc); 276 + 277 + if (sg_is_last(sg)) 278 + single_desc->cmd |= ADM_CMD_LC; 279 + } else { 280 + if (box_desc && sg_is_last(sg)) 281 + box_desc->cmd |= ADM_CMD_LC; 282 + } 283 + 284 + return desc; 285 + } 286 + 287 + /** 288 + * adm_process_non_fc_descriptors - Process descriptors for non-fc xfers 289 + * 290 + * @achan: ADM channel 291 + * @desc: Descriptor memory pointer 292 + * @sg: Scatterlist entry 293 + * @direction: DMA transfer direction 294 + */ 295 + static void *adm_process_non_fc_descriptors(struct adm_chan *achan, void *desc, 296 + struct scatterlist *sg, 297 + enum dma_transfer_direction direction) 298 + { 299 + struct adm_desc_hw_single *single_desc; 300 + u32 remainder = sg_dma_len(sg); 301 + u32 mem_addr = sg_dma_address(sg); 302 + u32 *incr_addr = &mem_addr; 303 + u32 *src, *dst; 304 + 305 + if (direction == DMA_DEV_TO_MEM) { 306 + src = &achan->slave.src_addr; 307 + dst = &mem_addr; 308 + } else { 309 + src = &mem_addr; 310 + dst = &achan->slave.dst_addr; 311 + } 312 + 313 + do { 314 + single_desc = desc; 315 + single_desc->cmd = ADM_CMD_TYPE_SINGLE; 316 + single_desc->src_addr = *src; 317 + single_desc->dst_addr = *dst; 318 + single_desc->len = (remainder > ADM_MAX_XFER) ? 319 + ADM_MAX_XFER : remainder; 320 + 321 + remainder -= single_desc->len; 322 + *incr_addr += single_desc->len; 323 + desc += sizeof(*single_desc); 324 + } while (remainder); 325 + 326 + /* set last command if this is the end of the whole transaction */ 327 + if (sg_is_last(sg)) 328 + single_desc->cmd |= ADM_CMD_LC; 329 + 330 + return desc; 331 + } 332 + 333 + /** 334 + * adm_prep_slave_sg - Prep slave sg transaction 335 + * 336 + * @chan: dma channel 337 + * @sgl: scatter gather list 338 + * @sg_len: length of sg 339 + * @direction: DMA transfer direction 340 + * @flags: DMA flags 341 + * @context: transfer context (unused) 342 + */ 343 + static struct dma_async_tx_descriptor *adm_prep_slave_sg(struct dma_chan *chan, 344 + struct scatterlist *sgl, 345 + unsigned int sg_len, 346 + enum dma_transfer_direction direction, 347 + unsigned long flags, 348 + void *context) 349 + { 350 + struct adm_chan *achan = to_adm_chan(chan); 351 + struct adm_device *adev = achan->adev; 352 + struct adm_async_desc *async_desc; 353 + struct scatterlist *sg; 354 + dma_addr_t cple_addr; 355 + u32 i, burst; 356 + u32 single_count = 0, box_count = 0, crci = 0; 357 + void *desc; 358 + u32 *cple; 359 + int blk_size = 0; 360 + 361 + if (!is_slave_direction(direction)) { 362 + dev_err(adev->dev, "invalid dma direction\n"); 363 + return NULL; 364 + } 365 + 366 + /* 367 + * get burst value from slave configuration 368 + */ 369 + burst = (direction == DMA_MEM_TO_DEV) ? 370 + achan->slave.dst_maxburst : 371 + achan->slave.src_maxburst; 372 + 373 + /* if using flow control, validate burst and crci values */ 374 + if (achan->slave.device_fc) { 375 + blk_size = adm_get_blksize(burst); 376 + if (blk_size < 0) { 377 + dev_err(adev->dev, "invalid burst value: %d\n", 378 + burst); 379 + return ERR_PTR(-EINVAL); 380 + } 381 + 382 + crci = achan->slave.slave_id & 0xf; 383 + if (!crci || achan->slave.slave_id > 0x1f) { 384 + dev_err(adev->dev, "invalid crci value\n"); 385 + return ERR_PTR(-EINVAL); 386 + } 387 + } 388 + 389 + /* iterate through sgs and compute allocation size of structures */ 390 + for_each_sg(sgl, sg, sg_len, i) { 391 + if (achan->slave.device_fc) { 392 + box_count += DIV_ROUND_UP(sg_dma_len(sg) / burst, 393 + ADM_MAX_ROWS); 394 + if (sg_dma_len(sg) % burst) 395 + single_count++; 396 + } else { 397 + single_count += DIV_ROUND_UP(sg_dma_len(sg), 398 + ADM_MAX_XFER); 399 + } 400 + } 401 + 402 + async_desc = kzalloc(sizeof(*async_desc), GFP_NOWAIT); 403 + if (!async_desc) 404 + return ERR_PTR(-ENOMEM); 405 + 406 + if (crci) 407 + async_desc->mux = achan->slave.slave_id & ADM_CRCI_MUX_SEL ? 408 + ADM_CRCI_CTL_MUX_SEL : 0; 409 + async_desc->crci = crci; 410 + async_desc->blk_size = blk_size; 411 + async_desc->dma_len = single_count * sizeof(struct adm_desc_hw_single) + 412 + box_count * sizeof(struct adm_desc_hw_box) + 413 + sizeof(*cple) + 2 * ADM_DESC_ALIGN; 414 + 415 + async_desc->cpl = kzalloc(async_desc->dma_len, GFP_NOWAIT); 416 + if (!async_desc->cpl) 417 + goto free; 418 + 419 + async_desc->adev = adev; 420 + 421 + /* both command list entry and descriptors must be 8 byte aligned */ 422 + cple = PTR_ALIGN(async_desc->cpl, ADM_DESC_ALIGN); 423 + desc = PTR_ALIGN(cple + 1, ADM_DESC_ALIGN); 424 + 425 + for_each_sg(sgl, sg, sg_len, i) { 426 + async_desc->length += sg_dma_len(sg); 427 + 428 + if (achan->slave.device_fc) 429 + desc = adm_process_fc_descriptors(achan, desc, sg, crci, 430 + burst, direction); 431 + else 432 + desc = adm_process_non_fc_descriptors(achan, desc, sg, 433 + direction); 434 + } 435 + 436 + async_desc->dma_addr = dma_map_single(adev->dev, async_desc->cpl, 437 + async_desc->dma_len, 438 + DMA_TO_DEVICE); 439 + if (dma_mapping_error(adev->dev, async_desc->dma_addr)) 440 + goto free; 441 + 442 + cple_addr = async_desc->dma_addr + ((void *)cple - async_desc->cpl); 443 + 444 + /* init cmd list */ 445 + dma_sync_single_for_cpu(adev->dev, cple_addr, sizeof(*cple), 446 + DMA_TO_DEVICE); 447 + *cple = ADM_CPLE_LP; 448 + *cple |= (async_desc->dma_addr + ADM_DESC_ALIGN) >> 3; 449 + dma_sync_single_for_device(adev->dev, cple_addr, sizeof(*cple), 450 + DMA_TO_DEVICE); 451 + 452 + return vchan_tx_prep(&achan->vc, &async_desc->vd, flags); 453 + 454 + free: 455 + kfree(async_desc); 456 + return ERR_PTR(-ENOMEM); 457 + } 458 + 459 + /** 460 + * adm_terminate_all - terminate all transactions on a channel 461 + * @chan: dma channel 462 + * 463 + * Dequeues and frees all transactions, aborts current transaction 464 + * No callbacks are done 465 + * 466 + */ 467 + static int adm_terminate_all(struct dma_chan *chan) 468 + { 469 + struct adm_chan *achan = to_adm_chan(chan); 470 + struct adm_device *adev = achan->adev; 471 + unsigned long flags; 472 + LIST_HEAD(head); 473 + 474 + spin_lock_irqsave(&achan->vc.lock, flags); 475 + vchan_get_all_descriptors(&achan->vc, &head); 476 + 477 + /* send flush command to terminate current transaction */ 478 + writel_relaxed(0x0, 479 + adev->regs + ADM_CH_FLUSH_STATE0(achan->id, adev->ee)); 480 + 481 + spin_unlock_irqrestore(&achan->vc.lock, flags); 482 + 483 + vchan_dma_desc_free_list(&achan->vc, &head); 484 + 485 + return 0; 486 + } 487 + 488 + static int adm_slave_config(struct dma_chan *chan, struct dma_slave_config *cfg) 489 + { 490 + struct adm_chan *achan = to_adm_chan(chan); 491 + unsigned long flag; 492 + 493 + spin_lock_irqsave(&achan->vc.lock, flag); 494 + memcpy(&achan->slave, cfg, sizeof(struct dma_slave_config)); 495 + spin_unlock_irqrestore(&achan->vc.lock, flag); 496 + 497 + return 0; 498 + } 499 + 500 + /** 501 + * adm_start_dma - start next transaction 502 + * @achan: ADM dma channel 503 + */ 504 + static void adm_start_dma(struct adm_chan *achan) 505 + { 506 + struct virt_dma_desc *vd = vchan_next_desc(&achan->vc); 507 + struct adm_device *adev = achan->adev; 508 + struct adm_async_desc *async_desc; 509 + 510 + lockdep_assert_held(&achan->vc.lock); 511 + 512 + if (!vd) 513 + return; 514 + 515 + list_del(&vd->node); 516 + 517 + /* write next command list out to the CMD FIFO */ 518 + async_desc = container_of(vd, struct adm_async_desc, vd); 519 + achan->curr_txd = async_desc; 520 + 521 + /* reset channel error */ 522 + achan->error = 0; 523 + 524 + if (!achan->initialized) { 525 + /* enable interrupts */ 526 + writel(ADM_CH_CONF_SHADOW_EN | 527 + ADM_CH_CONF_PERM_MPU_CONF | 528 + ADM_CH_CONF_MPU_DISABLE | 529 + ADM_CH_CONF_SEC_DOMAIN(adev->ee), 530 + adev->regs + ADM_CH_CONF(achan->id)); 531 + 532 + writel(ADM_CH_RSLT_CONF_IRQ_EN | ADM_CH_RSLT_CONF_FLUSH_EN, 533 + adev->regs + ADM_CH_RSLT_CONF(achan->id, adev->ee)); 534 + 535 + achan->initialized = 1; 536 + } 537 + 538 + /* set the crci block size if this transaction requires CRCI */ 539 + if (async_desc->crci) { 540 + writel(async_desc->mux | async_desc->blk_size, 541 + adev->regs + ADM_CRCI_CTL(async_desc->crci, adev->ee)); 542 + } 543 + 544 + /* make sure IRQ enable doesn't get reordered */ 545 + wmb(); 546 + 547 + /* write next command list out to the CMD FIFO */ 548 + writel(ALIGN(async_desc->dma_addr, ADM_DESC_ALIGN) >> 3, 549 + adev->regs + ADM_CH_CMD_PTR(achan->id, adev->ee)); 550 + } 551 + 552 + /** 553 + * adm_dma_irq - irq handler for ADM controller 554 + * @irq: IRQ of interrupt 555 + * @data: callback data 556 + * 557 + * IRQ handler for the bam controller 558 + */ 559 + static irqreturn_t adm_dma_irq(int irq, void *data) 560 + { 561 + struct adm_device *adev = data; 562 + u32 srcs, i; 563 + struct adm_async_desc *async_desc; 564 + unsigned long flags; 565 + 566 + srcs = readl_relaxed(adev->regs + 567 + ADM_SEC_DOMAIN_IRQ_STATUS(adev->ee)); 568 + 569 + for (i = 0; i < ADM_MAX_CHANNELS; i++) { 570 + struct adm_chan *achan = &adev->channels[i]; 571 + u32 status, result; 572 + 573 + if (srcs & BIT(i)) { 574 + status = readl_relaxed(adev->regs + 575 + ADM_CH_STATUS_SD(i, adev->ee)); 576 + 577 + /* if no result present, skip */ 578 + if (!(status & ADM_CH_STATUS_VALID)) 579 + continue; 580 + 581 + result = readl_relaxed(adev->regs + 582 + ADM_CH_RSLT(i, adev->ee)); 583 + 584 + /* no valid results, skip */ 585 + if (!(result & ADM_CH_RSLT_VALID)) 586 + continue; 587 + 588 + /* flag error if transaction was flushed or failed */ 589 + if (result & (ADM_CH_RSLT_ERR | ADM_CH_RSLT_FLUSH)) 590 + achan->error = 1; 591 + 592 + spin_lock_irqsave(&achan->vc.lock, flags); 593 + async_desc = achan->curr_txd; 594 + 595 + achan->curr_txd = NULL; 596 + 597 + if (async_desc) { 598 + vchan_cookie_complete(&async_desc->vd); 599 + 600 + /* kick off next DMA */ 601 + adm_start_dma(achan); 602 + } 603 + 604 + spin_unlock_irqrestore(&achan->vc.lock, flags); 605 + } 606 + } 607 + 608 + return IRQ_HANDLED; 609 + } 610 + 611 + /** 612 + * adm_tx_status - returns status of transaction 613 + * @chan: dma channel 614 + * @cookie: transaction cookie 615 + * @txstate: DMA transaction state 616 + * 617 + * Return status of dma transaction 618 + */ 619 + static enum dma_status adm_tx_status(struct dma_chan *chan, dma_cookie_t cookie, 620 + struct dma_tx_state *txstate) 621 + { 622 + struct adm_chan *achan = to_adm_chan(chan); 623 + struct virt_dma_desc *vd; 624 + enum dma_status ret; 625 + unsigned long flags; 626 + size_t residue = 0; 627 + 628 + ret = dma_cookie_status(chan, cookie, txstate); 629 + if (ret == DMA_COMPLETE || !txstate) 630 + return ret; 631 + 632 + spin_lock_irqsave(&achan->vc.lock, flags); 633 + 634 + vd = vchan_find_desc(&achan->vc, cookie); 635 + if (vd) 636 + residue = container_of(vd, struct adm_async_desc, vd)->length; 637 + 638 + spin_unlock_irqrestore(&achan->vc.lock, flags); 639 + 640 + /* 641 + * residue is either the full length if it is in the issued list, or 0 642 + * if it is in progress. We have no reliable way of determining 643 + * anything inbetween 644 + */ 645 + dma_set_residue(txstate, residue); 646 + 647 + if (achan->error) 648 + return DMA_ERROR; 649 + 650 + return ret; 651 + } 652 + 653 + /** 654 + * adm_issue_pending - starts pending transactions 655 + * @chan: dma channel 656 + * 657 + * Issues all pending transactions and starts DMA 658 + */ 659 + static void adm_issue_pending(struct dma_chan *chan) 660 + { 661 + struct adm_chan *achan = to_adm_chan(chan); 662 + unsigned long flags; 663 + 664 + spin_lock_irqsave(&achan->vc.lock, flags); 665 + 666 + if (vchan_issue_pending(&achan->vc) && !achan->curr_txd) 667 + adm_start_dma(achan); 668 + spin_unlock_irqrestore(&achan->vc.lock, flags); 669 + } 670 + 671 + /** 672 + * adm_dma_free_desc - free descriptor memory 673 + * @vd: virtual descriptor 674 + * 675 + */ 676 + static void adm_dma_free_desc(struct virt_dma_desc *vd) 677 + { 678 + struct adm_async_desc *async_desc = container_of(vd, 679 + struct adm_async_desc, vd); 680 + 681 + dma_unmap_single(async_desc->adev->dev, async_desc->dma_addr, 682 + async_desc->dma_len, DMA_TO_DEVICE); 683 + kfree(async_desc->cpl); 684 + kfree(async_desc); 685 + } 686 + 687 + static void adm_channel_init(struct adm_device *adev, struct adm_chan *achan, 688 + u32 index) 689 + { 690 + achan->id = index; 691 + achan->adev = adev; 692 + 693 + vchan_init(&achan->vc, &adev->common); 694 + achan->vc.desc_free = adm_dma_free_desc; 695 + } 696 + 697 + static int adm_dma_probe(struct platform_device *pdev) 698 + { 699 + struct adm_device *adev; 700 + int ret; 701 + u32 i; 702 + 703 + adev = devm_kzalloc(&pdev->dev, sizeof(*adev), GFP_KERNEL); 704 + if (!adev) 705 + return -ENOMEM; 706 + 707 + adev->dev = &pdev->dev; 708 + 709 + adev->regs = devm_platform_ioremap_resource(pdev, 0); 710 + if (IS_ERR(adev->regs)) 711 + return PTR_ERR(adev->regs); 712 + 713 + adev->irq = platform_get_irq(pdev, 0); 714 + if (adev->irq < 0) 715 + return adev->irq; 716 + 717 + ret = of_property_read_u32(pdev->dev.of_node, "qcom,ee", &adev->ee); 718 + if (ret) { 719 + dev_err(adev->dev, "Execution environment unspecified\n"); 720 + return ret; 721 + } 722 + 723 + adev->core_clk = devm_clk_get(adev->dev, "core"); 724 + if (IS_ERR(adev->core_clk)) 725 + return PTR_ERR(adev->core_clk); 726 + 727 + adev->iface_clk = devm_clk_get(adev->dev, "iface"); 728 + if (IS_ERR(adev->iface_clk)) 729 + return PTR_ERR(adev->iface_clk); 730 + 731 + adev->clk_reset = devm_reset_control_get_exclusive(&pdev->dev, "clk"); 732 + if (IS_ERR(adev->clk_reset)) { 733 + dev_err(adev->dev, "failed to get ADM0 reset\n"); 734 + return PTR_ERR(adev->clk_reset); 735 + } 736 + 737 + adev->c0_reset = devm_reset_control_get_exclusive(&pdev->dev, "c0"); 738 + if (IS_ERR(adev->c0_reset)) { 739 + dev_err(adev->dev, "failed to get ADM0 C0 reset\n"); 740 + return PTR_ERR(adev->c0_reset); 741 + } 742 + 743 + adev->c1_reset = devm_reset_control_get_exclusive(&pdev->dev, "c1"); 744 + if (IS_ERR(adev->c1_reset)) { 745 + dev_err(adev->dev, "failed to get ADM0 C1 reset\n"); 746 + return PTR_ERR(adev->c1_reset); 747 + } 748 + 749 + adev->c2_reset = devm_reset_control_get_exclusive(&pdev->dev, "c2"); 750 + if (IS_ERR(adev->c2_reset)) { 751 + dev_err(adev->dev, "failed to get ADM0 C2 reset\n"); 752 + return PTR_ERR(adev->c2_reset); 753 + } 754 + 755 + ret = clk_prepare_enable(adev->core_clk); 756 + if (ret) { 757 + dev_err(adev->dev, "failed to prepare/enable core clock\n"); 758 + return ret; 759 + } 760 + 761 + ret = clk_prepare_enable(adev->iface_clk); 762 + if (ret) { 763 + dev_err(adev->dev, "failed to prepare/enable iface clock\n"); 764 + goto err_disable_core_clk; 765 + } 766 + 767 + reset_control_assert(adev->clk_reset); 768 + reset_control_assert(adev->c0_reset); 769 + reset_control_assert(adev->c1_reset); 770 + reset_control_assert(adev->c2_reset); 771 + 772 + udelay(2); 773 + 774 + reset_control_deassert(adev->clk_reset); 775 + reset_control_deassert(adev->c0_reset); 776 + reset_control_deassert(adev->c1_reset); 777 + reset_control_deassert(adev->c2_reset); 778 + 779 + adev->channels = devm_kcalloc(adev->dev, ADM_MAX_CHANNELS, 780 + sizeof(*adev->channels), GFP_KERNEL); 781 + 782 + if (!adev->channels) { 783 + ret = -ENOMEM; 784 + goto err_disable_clks; 785 + } 786 + 787 + /* allocate and initialize channels */ 788 + INIT_LIST_HEAD(&adev->common.channels); 789 + 790 + for (i = 0; i < ADM_MAX_CHANNELS; i++) 791 + adm_channel_init(adev, &adev->channels[i], i); 792 + 793 + /* reset CRCIs */ 794 + for (i = 0; i < 16; i++) 795 + writel(ADM_CRCI_CTL_RST, adev->regs + 796 + ADM_CRCI_CTL(i, adev->ee)); 797 + 798 + /* configure client interfaces */ 799 + writel(ADM_CI_RANGE_START(0x40) | ADM_CI_RANGE_END(0xb0) | 800 + ADM_CI_BURST_8_WORDS, adev->regs + ADM_CI_CONF(0)); 801 + writel(ADM_CI_RANGE_START(0x2a) | ADM_CI_RANGE_END(0x2c) | 802 + ADM_CI_BURST_8_WORDS, adev->regs + ADM_CI_CONF(1)); 803 + writel(ADM_CI_RANGE_START(0x12) | ADM_CI_RANGE_END(0x28) | 804 + ADM_CI_BURST_8_WORDS, adev->regs + ADM_CI_CONF(2)); 805 + writel(ADM_GP_CTL_LP_EN | ADM_GP_CTL_LP_CNT(0xf), 806 + adev->regs + ADM_GP_CTL); 807 + 808 + ret = devm_request_irq(adev->dev, adev->irq, adm_dma_irq, 809 + 0, "adm_dma", adev); 810 + if (ret) 811 + goto err_disable_clks; 812 + 813 + platform_set_drvdata(pdev, adev); 814 + 815 + adev->common.dev = adev->dev; 816 + adev->common.dev->dma_parms = &adev->dma_parms; 817 + 818 + /* set capabilities */ 819 + dma_cap_zero(adev->common.cap_mask); 820 + dma_cap_set(DMA_SLAVE, adev->common.cap_mask); 821 + dma_cap_set(DMA_PRIVATE, adev->common.cap_mask); 822 + 823 + /* initialize dmaengine apis */ 824 + adev->common.directions = BIT(DMA_DEV_TO_MEM | DMA_MEM_TO_DEV); 825 + adev->common.residue_granularity = DMA_RESIDUE_GRANULARITY_DESCRIPTOR; 826 + adev->common.src_addr_widths = DMA_SLAVE_BUSWIDTH_4_BYTES; 827 + adev->common.dst_addr_widths = DMA_SLAVE_BUSWIDTH_4_BYTES; 828 + adev->common.device_free_chan_resources = adm_free_chan; 829 + adev->common.device_prep_slave_sg = adm_prep_slave_sg; 830 + adev->common.device_issue_pending = adm_issue_pending; 831 + adev->common.device_tx_status = adm_tx_status; 832 + adev->common.device_terminate_all = adm_terminate_all; 833 + adev->common.device_config = adm_slave_config; 834 + 835 + ret = dma_async_device_register(&adev->common); 836 + if (ret) { 837 + dev_err(adev->dev, "failed to register dma async device\n"); 838 + goto err_disable_clks; 839 + } 840 + 841 + ret = of_dma_controller_register(pdev->dev.of_node, 842 + of_dma_xlate_by_chan_id, 843 + &adev->common); 844 + if (ret) 845 + goto err_unregister_dma; 846 + 847 + return 0; 848 + 849 + err_unregister_dma: 850 + dma_async_device_unregister(&adev->common); 851 + err_disable_clks: 852 + clk_disable_unprepare(adev->iface_clk); 853 + err_disable_core_clk: 854 + clk_disable_unprepare(adev->core_clk); 855 + 856 + return ret; 857 + } 858 + 859 + static int adm_dma_remove(struct platform_device *pdev) 860 + { 861 + struct adm_device *adev = platform_get_drvdata(pdev); 862 + struct adm_chan *achan; 863 + u32 i; 864 + 865 + of_dma_controller_free(pdev->dev.of_node); 866 + dma_async_device_unregister(&adev->common); 867 + 868 + for (i = 0; i < ADM_MAX_CHANNELS; i++) { 869 + achan = &adev->channels[i]; 870 + 871 + /* mask IRQs for this channel/EE pair */ 872 + writel(0, adev->regs + ADM_CH_RSLT_CONF(achan->id, adev->ee)); 873 + 874 + tasklet_kill(&adev->channels[i].vc.task); 875 + adm_terminate_all(&adev->channels[i].vc.chan); 876 + } 877 + 878 + devm_free_irq(adev->dev, adev->irq, adev); 879 + 880 + clk_disable_unprepare(adev->core_clk); 881 + clk_disable_unprepare(adev->iface_clk); 882 + 883 + return 0; 884 + } 885 + 886 + static const struct of_device_id adm_of_match[] = { 887 + { .compatible = "qcom,adm", }, 888 + {} 889 + }; 890 + MODULE_DEVICE_TABLE(of, adm_of_match); 891 + 892 + static struct platform_driver adm_dma_driver = { 893 + .probe = adm_dma_probe, 894 + .remove = adm_dma_remove, 895 + .driver = { 896 + .name = "adm-dma-engine", 897 + .of_match_table = adm_of_match, 898 + }, 899 + }; 900 + 901 + module_platform_driver(adm_dma_driver); 902 + 903 + MODULE_AUTHOR("Andy Gross <agross@codeaurora.org>"); 904 + MODULE_DESCRIPTION("QCOM ADM DMA engine driver"); 905 + MODULE_LICENSE("GPL v2");
+5 -7
drivers/dma/sf-pdma/sf-pdma.c
··· 326 326 { 327 327 struct sf_pdma_chan *chan = dev_id; 328 328 struct pdma_regs *regs = &chan->regs; 329 - unsigned long flags; 330 329 u64 residue; 331 330 332 - spin_lock_irqsave(&chan->vchan.lock, flags); 331 + spin_lock(&chan->vchan.lock); 333 332 writel((readl(regs->ctrl)) & ~PDMA_DONE_STATUS_MASK, regs->ctrl); 334 333 residue = readq(regs->residue); 335 334 ··· 345 346 sf_pdma_xfer_desc(chan); 346 347 } 347 348 348 - spin_unlock_irqrestore(&chan->vchan.lock, flags); 349 + spin_unlock(&chan->vchan.lock); 349 350 350 351 return IRQ_HANDLED; 351 352 } ··· 354 355 { 355 356 struct sf_pdma_chan *chan = dev_id; 356 357 struct pdma_regs *regs = &chan->regs; 357 - unsigned long flags; 358 358 359 - spin_lock_irqsave(&chan->lock, flags); 359 + spin_lock(&chan->lock); 360 360 writel((readl(regs->ctrl)) & ~PDMA_ERR_STATUS_MASK, regs->ctrl); 361 - spin_unlock_irqrestore(&chan->lock, flags); 361 + spin_unlock(&chan->lock); 362 362 363 363 tasklet_schedule(&chan->err_tasklet); 364 364 ··· 582 584 .remove = sf_pdma_remove, 583 585 .driver = { 584 586 .name = "sf-pdma", 585 - .of_match_table = of_match_ptr(sf_pdma_dt_ids), 587 + .of_match_table = sf_pdma_dt_ids, 586 588 }, 587 589 }; 588 590
+2 -3
drivers/dma/ste_dma40.c
··· 1643 1643 u32 row; 1644 1644 long chan = -1; 1645 1645 struct d40_chan *d40c; 1646 - unsigned long flags; 1647 1646 struct d40_base *base = data; 1648 1647 u32 *regs = base->regs_interrupt; 1649 1648 struct d40_interrupt_lookup *il = base->gen_dmac.il; 1650 1649 u32 il_size = base->gen_dmac.il_size; 1651 1650 1652 - spin_lock_irqsave(&base->interrupt_lock, flags); 1651 + spin_lock(&base->interrupt_lock); 1653 1652 1654 1653 /* Read interrupt status of both logical and physical channels */ 1655 1654 for (i = 0; i < il_size; i++) ··· 1693 1694 spin_unlock(&d40c->lock); 1694 1695 } 1695 1696 1696 - spin_unlock_irqrestore(&base->interrupt_lock, flags); 1697 + spin_unlock(&base->interrupt_lock); 1697 1698 1698 1699 return IRQ_HANDLED; 1699 1700 }
+31 -16
drivers/dma/stm32-dma.c
··· 264 264 } 265 265 266 266 static enum dma_slave_buswidth stm32_dma_get_max_width(u32 buf_len, 267 + dma_addr_t buf_addr, 267 268 u32 threshold) 268 269 { 269 270 enum dma_slave_buswidth max_width; 271 + u64 addr = buf_addr; 270 272 271 273 if (threshold == STM32_DMA_FIFO_THRESHOLD_FULL) 272 274 max_width = DMA_SLAVE_BUSWIDTH_4_BYTES; ··· 278 276 while ((buf_len < max_width || buf_len % max_width) && 279 277 max_width > DMA_SLAVE_BUSWIDTH_1_BYTE) 280 278 max_width = max_width >> 1; 279 + 280 + if (do_div(addr, max_width)) 281 + max_width = DMA_SLAVE_BUSWIDTH_1_BYTE; 281 282 282 283 return max_width; 283 284 } ··· 653 648 scr = stm32_dma_read(dmadev, STM32_DMA_SCR(chan->id)); 654 649 sfcr = stm32_dma_read(dmadev, STM32_DMA_SFCR(chan->id)); 655 650 656 - if (status & STM32_DMA_TCI) { 657 - stm32_dma_irq_clear(chan, STM32_DMA_TCI); 658 - if (scr & STM32_DMA_SCR_TCIE) 659 - stm32_dma_handle_chan_done(chan); 660 - status &= ~STM32_DMA_TCI; 661 - } 662 - if (status & STM32_DMA_HTI) { 663 - stm32_dma_irq_clear(chan, STM32_DMA_HTI); 664 - status &= ~STM32_DMA_HTI; 665 - } 666 651 if (status & STM32_DMA_FEI) { 667 652 stm32_dma_irq_clear(chan, STM32_DMA_FEI); 668 653 status &= ~STM32_DMA_FEI; 669 654 if (sfcr & STM32_DMA_SFCR_FEIE) { 670 - if (!(scr & STM32_DMA_SCR_EN)) 655 + if (!(scr & STM32_DMA_SCR_EN) && 656 + !(status & STM32_DMA_TCI)) 671 657 dev_err(chan2dev(chan), "FIFO Error\n"); 672 658 else 673 659 dev_dbg(chan2dev(chan), "FIFO over/underrun\n"); ··· 670 674 if (sfcr & STM32_DMA_SCR_DMEIE) 671 675 dev_dbg(chan2dev(chan), "Direct mode overrun\n"); 672 676 } 677 + 678 + if (status & STM32_DMA_TCI) { 679 + stm32_dma_irq_clear(chan, STM32_DMA_TCI); 680 + if (scr & STM32_DMA_SCR_TCIE) 681 + stm32_dma_handle_chan_done(chan); 682 + status &= ~STM32_DMA_TCI; 683 + } 684 + 685 + if (status & STM32_DMA_HTI) { 686 + stm32_dma_irq_clear(chan, STM32_DMA_HTI); 687 + status &= ~STM32_DMA_HTI; 688 + } 689 + 673 690 if (status) { 674 691 stm32_dma_irq_clear(chan, status); 675 692 dev_err(chan2dev(chan), "DMA error: status=0x%08x\n", status); ··· 712 703 static int stm32_dma_set_xfer_param(struct stm32_dma_chan *chan, 713 704 enum dma_transfer_direction direction, 714 705 enum dma_slave_buswidth *buswidth, 715 - u32 buf_len) 706 + u32 buf_len, dma_addr_t buf_addr) 716 707 { 717 708 enum dma_slave_buswidth src_addr_width, dst_addr_width; 718 709 int src_bus_width, dst_bus_width; ··· 744 735 return dst_burst_size; 745 736 746 737 /* Set memory data size */ 747 - src_addr_width = stm32_dma_get_max_width(buf_len, fifoth); 738 + src_addr_width = stm32_dma_get_max_width(buf_len, buf_addr, 739 + fifoth); 748 740 chan->mem_width = src_addr_width; 749 741 src_bus_width = stm32_dma_get_width(chan, src_addr_width); 750 742 if (src_bus_width < 0) ··· 794 784 return src_burst_size; 795 785 796 786 /* Set memory data size */ 797 - dst_addr_width = stm32_dma_get_max_width(buf_len, fifoth); 787 + dst_addr_width = stm32_dma_get_max_width(buf_len, buf_addr, 788 + fifoth); 798 789 chan->mem_width = dst_addr_width; 799 790 dst_bus_width = stm32_dma_get_width(chan, dst_addr_width); 800 791 if (dst_bus_width < 0) ··· 883 872 884 873 for_each_sg(sgl, sg, sg_len, i) { 885 874 ret = stm32_dma_set_xfer_param(chan, direction, &buswidth, 886 - sg_dma_len(sg)); 875 + sg_dma_len(sg), 876 + sg_dma_address(sg)); 887 877 if (ret < 0) 888 878 goto err; 889 879 ··· 952 940 return NULL; 953 941 } 954 942 955 - ret = stm32_dma_set_xfer_param(chan, direction, &buswidth, period_len); 943 + ret = stm32_dma_set_xfer_param(chan, direction, &buswidth, period_len, 944 + buf_addr); 956 945 if (ret < 0) 957 946 return NULL; 958 947 ··· 1229 1216 pm_runtime_put(dmadev->ddev.dev); 1230 1217 1231 1218 vchan_free_chan_resources(to_virt_chan(c)); 1219 + stm32_dma_clear_reg(&chan->chan_reg); 1220 + chan->threshold = 0; 1232 1221 } 1233 1222 1234 1223 static void stm32_dma_desc_free(struct virt_dma_desc *vdesc)
+1 -1
drivers/dma/stm32-dmamux.c
··· 168 168 return ERR_PTR(ret); 169 169 } 170 170 171 - static const struct of_device_id stm32_stm32dma_master_match[] = { 171 + static const struct of_device_id stm32_stm32dma_master_match[] __maybe_unused = { 172 172 { .compatible = "st,stm32-dma", }, 173 173 {}, 174 174 };
+35 -31
drivers/dma/stm32-mdma.c
··· 339 339 struct stm32_mdma_desc *desc; 340 340 int i; 341 341 342 - desc = kzalloc(offsetof(typeof(*desc), node[count]), GFP_NOWAIT); 342 + desc = kzalloc(struct_size(desc, node, count), GFP_NOWAIT); 343 343 if (!desc) 344 344 return NULL; 345 345 ··· 1346 1346 { 1347 1347 struct stm32_mdma_device *dmadev = devid; 1348 1348 struct stm32_mdma_chan *chan = devid; 1349 - u32 reg, id, ien, status, flag; 1349 + u32 reg, id, ccr, ien, status; 1350 1350 1351 1351 /* Find out which channel generates the interrupt */ 1352 1352 status = readl_relaxed(dmadev->base + STM32_MDMA_GISR0); ··· 1368 1368 1369 1369 chan = &dmadev->chan[id]; 1370 1370 if (!chan) { 1371 - dev_dbg(mdma2dev(dmadev), "MDMA channel not initialized\n"); 1372 - goto exit; 1371 + dev_warn(mdma2dev(dmadev), "MDMA channel not initialized\n"); 1372 + return IRQ_NONE; 1373 1373 } 1374 1374 1375 1375 /* Handle interrupt for the channel */ 1376 1376 spin_lock(&chan->vchan.lock); 1377 - status = stm32_mdma_read(dmadev, STM32_MDMA_CISR(chan->id)); 1378 - ien = stm32_mdma_read(dmadev, STM32_MDMA_CCR(chan->id)); 1379 - ien &= STM32_MDMA_CCR_IRQ_MASK; 1380 - ien >>= 1; 1377 + status = stm32_mdma_read(dmadev, STM32_MDMA_CISR(id)); 1378 + /* Mask Channel ReQuest Active bit which can be set in case of MEM2MEM */ 1379 + status &= ~STM32_MDMA_CISR_CRQA; 1380 + ccr = stm32_mdma_read(dmadev, STM32_MDMA_CCR(id)); 1381 + ien = (ccr & STM32_MDMA_CCR_IRQ_MASK) >> 1; 1381 1382 1382 1383 if (!(status & ien)) { 1383 1384 spin_unlock(&chan->vchan.lock); 1384 - dev_dbg(chan2dev(chan), 1385 - "spurious it (status=0x%04x, ien=0x%04x)\n", 1386 - status, ien); 1385 + dev_warn(chan2dev(chan), 1386 + "spurious it (status=0x%04x, ien=0x%04x)\n", 1387 + status, ien); 1387 1388 return IRQ_NONE; 1388 1389 } 1389 1390 1390 - flag = __ffs(status & ien); 1391 - reg = STM32_MDMA_CIFCR(chan->id); 1391 + reg = STM32_MDMA_CIFCR(id); 1392 1392 1393 - switch (1 << flag) { 1394 - case STM32_MDMA_CISR_TEIF: 1395 - id = chan->id; 1396 - status = readl_relaxed(dmadev->base + STM32_MDMA_CESR(id)); 1397 - dev_err(chan2dev(chan), "Transfer Err: stat=0x%08x\n", status); 1393 + if (status & STM32_MDMA_CISR_TEIF) { 1394 + dev_err(chan2dev(chan), "Transfer Err: stat=0x%08x\n", 1395 + readl_relaxed(dmadev->base + STM32_MDMA_CESR(id))); 1398 1396 stm32_mdma_set_bits(dmadev, reg, STM32_MDMA_CIFCR_CTEIF); 1399 - break; 1397 + status &= ~STM32_MDMA_CISR_TEIF; 1398 + } 1400 1399 1401 - case STM32_MDMA_CISR_CTCIF: 1400 + if (status & STM32_MDMA_CISR_CTCIF) { 1402 1401 stm32_mdma_set_bits(dmadev, reg, STM32_MDMA_CIFCR_CCTCIF); 1402 + status &= ~STM32_MDMA_CISR_CTCIF; 1403 1403 stm32_mdma_xfer_end(chan); 1404 - break; 1404 + } 1405 1405 1406 - case STM32_MDMA_CISR_BRTIF: 1406 + if (status & STM32_MDMA_CISR_BRTIF) { 1407 1407 stm32_mdma_set_bits(dmadev, reg, STM32_MDMA_CIFCR_CBRTIF); 1408 - break; 1408 + status &= ~STM32_MDMA_CISR_BRTIF; 1409 + } 1409 1410 1410 - case STM32_MDMA_CISR_BTIF: 1411 + if (status & STM32_MDMA_CISR_BTIF) { 1411 1412 stm32_mdma_set_bits(dmadev, reg, STM32_MDMA_CIFCR_CBTIF); 1413 + status &= ~STM32_MDMA_CISR_BTIF; 1412 1414 chan->curr_hwdesc++; 1413 1415 if (chan->desc && chan->desc->cyclic) { 1414 1416 if (chan->curr_hwdesc == chan->desc->count) 1415 1417 chan->curr_hwdesc = 0; 1416 1418 vchan_cyclic_callback(&chan->desc->vdesc); 1417 1419 } 1418 - break; 1420 + } 1419 1421 1420 - case STM32_MDMA_CISR_TCIF: 1422 + if (status & STM32_MDMA_CISR_TCIF) { 1421 1423 stm32_mdma_set_bits(dmadev, reg, STM32_MDMA_CIFCR_CLTCIF); 1422 - break; 1424 + status &= ~STM32_MDMA_CISR_TCIF; 1425 + } 1423 1426 1424 - default: 1425 - dev_err(chan2dev(chan), "it %d unhandled (status=0x%04x)\n", 1426 - 1 << flag, status); 1427 + if (status) { 1428 + stm32_mdma_set_bits(dmadev, reg, status); 1429 + dev_err(chan2dev(chan), "DMA error: status=0x%08x\n", status); 1430 + if (!(ccr & STM32_MDMA_CCR_EN)) 1431 + dev_err(chan2dev(chan), "chan disabled by HW\n"); 1427 1432 } 1428 1433 1429 1434 spin_unlock(&chan->vchan.lock); 1430 1435 1431 - exit: 1432 1436 return IRQ_HANDLED; 1433 1437 } 1434 1438
+25
drivers/dma/sun6i-dma.c
··· 1174 1174 }; 1175 1175 1176 1176 /* 1177 + * TODO: Add support for more than 4g physical addressing. 1178 + * 1179 + * The A100 binding uses the number of dma channels from the 1180 + * device tree node. 1181 + */ 1182 + static struct sun6i_dma_config sun50i_a100_dma_cfg = { 1183 + .clock_autogate_enable = sun6i_enable_clock_autogate_h3, 1184 + .set_burst_length = sun6i_set_burst_length_h3, 1185 + .set_drq = sun6i_set_drq_h6, 1186 + .set_mode = sun6i_set_mode_h6, 1187 + .src_burst_lengths = BIT(1) | BIT(4) | BIT(8) | BIT(16), 1188 + .dst_burst_lengths = BIT(1) | BIT(4) | BIT(8) | BIT(16), 1189 + .src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | 1190 + BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | 1191 + BIT(DMA_SLAVE_BUSWIDTH_4_BYTES) | 1192 + BIT(DMA_SLAVE_BUSWIDTH_8_BYTES), 1193 + .dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | 1194 + BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | 1195 + BIT(DMA_SLAVE_BUSWIDTH_4_BYTES) | 1196 + BIT(DMA_SLAVE_BUSWIDTH_8_BYTES), 1197 + .has_mbus_clk = true, 1198 + }; 1199 + 1200 + /* 1177 1201 * The H6 binding uses the number of dma channels from the 1178 1202 * device tree node. 1179 1203 */ ··· 1249 1225 { .compatible = "allwinner,sun8i-h3-dma", .data = &sun8i_h3_dma_cfg }, 1250 1226 { .compatible = "allwinner,sun8i-v3s-dma", .data = &sun8i_v3s_dma_cfg }, 1251 1227 { .compatible = "allwinner,sun50i-a64-dma", .data = &sun50i_a64_dma_cfg }, 1228 + { .compatible = "allwinner,sun50i-a100-dma", .data = &sun50i_a100_dma_cfg }, 1252 1229 { .compatible = "allwinner,sun50i-h6-dma", .data = &sun50i_h6_dma_cfg }, 1253 1230 { /* sentinel */ } 1254 1231 };
+3 -4
drivers/dma/tegra210-adma.c
··· 408 408 { 409 409 struct tegra_adma_chan *tdc = dev_id; 410 410 unsigned long status; 411 - unsigned long flags; 412 411 413 - spin_lock_irqsave(&tdc->vc.lock, flags); 412 + spin_lock(&tdc->vc.lock); 414 413 415 414 status = tegra_adma_irq_clear(tdc); 416 415 if (status == 0 || !tdc->desc) { 417 - spin_unlock_irqrestore(&tdc->vc.lock, flags); 416 + spin_unlock(&tdc->vc.lock); 418 417 return IRQ_NONE; 419 418 } 420 419 421 420 vchan_cyclic_callback(&tdc->desc->vd); 422 421 423 - spin_unlock_irqrestore(&tdc->vc.lock, flags); 422 + spin_unlock(&tdc->vc.lock); 424 423 425 424 return IRQ_HANDLED; 426 425 }
+2 -1
drivers/dma/ti/Makefile
··· 7 7 obj-$(CONFIG_TI_K3_PSIL) += k3-psil.o \ 8 8 k3-psil-am654.o \ 9 9 k3-psil-j721e.o \ 10 - k3-psil-j7200.o 10 + k3-psil-j7200.o \ 11 + k3-psil-am64.o 11 12 obj-$(CONFIG_TI_DMA_CROSSBAR) += dma-crossbar.o
+3 -3
drivers/dma/ti/dma-crossbar.c
··· 122 122 return map; 123 123 } 124 124 125 - static const struct of_device_id ti_am335x_master_match[] = { 125 + static const struct of_device_id ti_am335x_master_match[] __maybe_unused = { 126 126 { .compatible = "ti,edma3-tpcc", }, 127 127 {}, 128 128 }; ··· 292 292 [TI_XBAR_SDMA_OFFSET] = 1, 293 293 }; 294 294 295 - static const struct of_device_id ti_dra7_master_match[] = { 295 + static const struct of_device_id ti_dra7_master_match[] __maybe_unused = { 296 296 { 297 297 .compatible = "ti,omap4430-sdma", 298 298 .data = &ti_dma_offset[TI_XBAR_SDMA_OFFSET], ··· 460 460 static struct platform_driver ti_dma_xbar_driver = { 461 461 .driver = { 462 462 .name = "ti-dma-crossbar", 463 - .of_match_table = of_match_ptr(ti_dma_xbar_match), 463 + .of_match_table = ti_dma_xbar_match, 464 464 }, 465 465 .probe = ti_dma_xbar_probe, 466 466 };
+158
drivers/dma/ti/k3-psil-am64.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (C) 2020 Texas Instruments Incorporated - https://www.ti.com 4 + * Author: Peter Ujfalusi <peter.ujfalusi@ti.com> 5 + */ 6 + 7 + #include <linux/kernel.h> 8 + 9 + #include "k3-psil-priv.h" 10 + 11 + #define PSIL_PDMA_XY_TR(x) \ 12 + { \ 13 + .thread_id = x, \ 14 + .ep_config = { \ 15 + .ep_type = PSIL_EP_PDMA_XY, \ 16 + .mapped_channel_id = -1, \ 17 + .default_flow_id = -1, \ 18 + }, \ 19 + } 20 + 21 + #define PSIL_PDMA_XY_PKT(x) \ 22 + { \ 23 + .thread_id = x, \ 24 + .ep_config = { \ 25 + .ep_type = PSIL_EP_PDMA_XY, \ 26 + .mapped_channel_id = -1, \ 27 + .default_flow_id = -1, \ 28 + .pkt_mode = 1, \ 29 + }, \ 30 + } 31 + 32 + #define PSIL_ETHERNET(x, ch, flow_base, flow_cnt) \ 33 + { \ 34 + .thread_id = x, \ 35 + .ep_config = { \ 36 + .ep_type = PSIL_EP_NATIVE, \ 37 + .pkt_mode = 1, \ 38 + .needs_epib = 1, \ 39 + .psd_size = 16, \ 40 + .mapped_channel_id = ch, \ 41 + .flow_start = flow_base, \ 42 + .flow_num = flow_cnt, \ 43 + .default_flow_id = flow_base, \ 44 + }, \ 45 + } 46 + 47 + #define PSIL_SAUL(x, ch, flow_base, flow_cnt, default_flow, tx) \ 48 + { \ 49 + .thread_id = x, \ 50 + .ep_config = { \ 51 + .ep_type = PSIL_EP_NATIVE, \ 52 + .pkt_mode = 1, \ 53 + .needs_epib = 1, \ 54 + .psd_size = 64, \ 55 + .mapped_channel_id = ch, \ 56 + .flow_start = flow_base, \ 57 + .flow_num = flow_cnt, \ 58 + .default_flow_id = default_flow, \ 59 + .notdpkt = tx, \ 60 + }, \ 61 + } 62 + 63 + /* PSI-L source thread IDs, used for RX (DMA_DEV_TO_MEM) */ 64 + static struct psil_ep am64_src_ep_map[] = { 65 + /* SAUL */ 66 + PSIL_SAUL(0x4000, 17, 32, 8, 32, 0), 67 + PSIL_SAUL(0x4001, 18, 32, 8, 33, 0), 68 + PSIL_SAUL(0x4002, 19, 40, 8, 40, 0), 69 + PSIL_SAUL(0x4003, 20, 40, 8, 41, 0), 70 + /* ICSS_G0 */ 71 + PSIL_ETHERNET(0x4100, 21, 48, 16), 72 + PSIL_ETHERNET(0x4101, 22, 64, 16), 73 + PSIL_ETHERNET(0x4102, 23, 80, 16), 74 + PSIL_ETHERNET(0x4103, 24, 96, 16), 75 + /* ICSS_G1 */ 76 + PSIL_ETHERNET(0x4200, 25, 112, 16), 77 + PSIL_ETHERNET(0x4201, 26, 128, 16), 78 + PSIL_ETHERNET(0x4202, 27, 144, 16), 79 + PSIL_ETHERNET(0x4203, 28, 160, 16), 80 + /* PDMA_MAIN0 - SPI0-3 */ 81 + PSIL_PDMA_XY_PKT(0x4300), 82 + PSIL_PDMA_XY_PKT(0x4301), 83 + PSIL_PDMA_XY_PKT(0x4302), 84 + PSIL_PDMA_XY_PKT(0x4303), 85 + PSIL_PDMA_XY_PKT(0x4304), 86 + PSIL_PDMA_XY_PKT(0x4305), 87 + PSIL_PDMA_XY_PKT(0x4306), 88 + PSIL_PDMA_XY_PKT(0x4307), 89 + PSIL_PDMA_XY_PKT(0x4308), 90 + PSIL_PDMA_XY_PKT(0x4309), 91 + PSIL_PDMA_XY_PKT(0x430a), 92 + PSIL_PDMA_XY_PKT(0x430b), 93 + PSIL_PDMA_XY_PKT(0x430c), 94 + PSIL_PDMA_XY_PKT(0x430d), 95 + PSIL_PDMA_XY_PKT(0x430e), 96 + PSIL_PDMA_XY_PKT(0x430f), 97 + /* PDMA_MAIN0 - USART0-1 */ 98 + PSIL_PDMA_XY_PKT(0x4310), 99 + PSIL_PDMA_XY_PKT(0x4311), 100 + /* PDMA_MAIN1 - SPI4 */ 101 + PSIL_PDMA_XY_PKT(0x4400), 102 + PSIL_PDMA_XY_PKT(0x4401), 103 + PSIL_PDMA_XY_PKT(0x4402), 104 + PSIL_PDMA_XY_PKT(0x4403), 105 + /* PDMA_MAIN1 - USART2-6 */ 106 + PSIL_PDMA_XY_PKT(0x4404), 107 + PSIL_PDMA_XY_PKT(0x4405), 108 + PSIL_PDMA_XY_PKT(0x4406), 109 + PSIL_PDMA_XY_PKT(0x4407), 110 + PSIL_PDMA_XY_PKT(0x4408), 111 + /* PDMA_MAIN1 - ADCs */ 112 + PSIL_PDMA_XY_TR(0x440f), 113 + PSIL_PDMA_XY_TR(0x4410), 114 + /* CPSW2 */ 115 + PSIL_ETHERNET(0x4500, 16, 16, 16), 116 + }; 117 + 118 + /* PSI-L destination thread IDs, used for TX (DMA_MEM_TO_DEV) */ 119 + static struct psil_ep am64_dst_ep_map[] = { 120 + /* SAUL */ 121 + PSIL_SAUL(0xc000, 24, 80, 8, 80, 1), 122 + PSIL_SAUL(0xc001, 25, 88, 8, 88, 1), 123 + /* ICSS_G0 */ 124 + PSIL_ETHERNET(0xc100, 26, 96, 1), 125 + PSIL_ETHERNET(0xc101, 27, 97, 1), 126 + PSIL_ETHERNET(0xc102, 28, 98, 1), 127 + PSIL_ETHERNET(0xc103, 29, 99, 1), 128 + PSIL_ETHERNET(0xc104, 30, 100, 1), 129 + PSIL_ETHERNET(0xc105, 31, 101, 1), 130 + PSIL_ETHERNET(0xc106, 32, 102, 1), 131 + PSIL_ETHERNET(0xc107, 33, 103, 1), 132 + /* ICSS_G1 */ 133 + PSIL_ETHERNET(0xc200, 34, 104, 1), 134 + PSIL_ETHERNET(0xc201, 35, 105, 1), 135 + PSIL_ETHERNET(0xc202, 36, 106, 1), 136 + PSIL_ETHERNET(0xc203, 37, 107, 1), 137 + PSIL_ETHERNET(0xc204, 38, 108, 1), 138 + PSIL_ETHERNET(0xc205, 39, 109, 1), 139 + PSIL_ETHERNET(0xc206, 40, 110, 1), 140 + PSIL_ETHERNET(0xc207, 41, 111, 1), 141 + /* CPSW2 */ 142 + PSIL_ETHERNET(0xc500, 16, 16, 8), 143 + PSIL_ETHERNET(0xc501, 17, 24, 8), 144 + PSIL_ETHERNET(0xc502, 18, 32, 8), 145 + PSIL_ETHERNET(0xc503, 19, 40, 8), 146 + PSIL_ETHERNET(0xc504, 20, 48, 8), 147 + PSIL_ETHERNET(0xc505, 21, 56, 8), 148 + PSIL_ETHERNET(0xc506, 22, 64, 8), 149 + PSIL_ETHERNET(0xc507, 23, 72, 8), 150 + }; 151 + 152 + struct psil_ep_map am64_ep_map = { 153 + .name = "am64", 154 + .src = am64_src_ep_map, 155 + .src_count = ARRAY_SIZE(am64_src_ep_map), 156 + .dst = am64_dst_ep_map, 157 + .dst_count = ARRAY_SIZE(am64_dst_ep_map), 158 + };
+1
drivers/dma/ti/k3-psil-priv.h
··· 40 40 extern struct psil_ep_map am654_ep_map; 41 41 extern struct psil_ep_map j721e_ep_map; 42 42 extern struct psil_ep_map j7200_ep_map; 43 + extern struct psil_ep_map am64_ep_map; 43 44 44 45 #endif /* K3_PSIL_PRIV_H_ */
+1
drivers/dma/ti/k3-psil.c
··· 20 20 { .family = "AM65X", .data = &am654_ep_map }, 21 21 { .family = "J721E", .data = &j721e_ep_map }, 22 22 { .family = "J7200", .data = &j7200_ep_map }, 23 + { .family = "AM64X", .data = &am64_ep_map }, 23 24 { /* sentinel */ } 24 25 }; 25 26
+314 -69
drivers/dma/ti/k3-udma-glue.c
··· 22 22 23 23 struct k3_udma_glue_common { 24 24 struct device *dev; 25 + struct device chan_dev; 25 26 struct udma_dev *udmax; 26 27 const struct udma_tisci_rm *tisci_rm; 27 28 struct k3_ringacc *ringacc; ··· 33 32 bool epib; 34 33 u32 psdata_size; 35 34 u32 swdata_size; 36 - u32 atype; 35 + u32 atype_asel; 36 + struct psil_endpoint_config *ep_config; 37 37 }; 38 38 39 39 struct k3_udma_glue_tx_channel { ··· 55 53 bool tx_filt_einfo; 56 54 bool tx_filt_pswords; 57 55 bool tx_supr_tdpkt; 56 + 57 + int udma_tflow_id; 58 58 }; 59 59 60 60 struct k3_udma_glue_rx_flow { ··· 85 81 u32 flows_ready; 86 82 }; 87 83 84 + static void k3_udma_chan_dev_release(struct device *dev) 85 + { 86 + /* The struct containing the device is devm managed */ 87 + } 88 + 89 + static struct class k3_udma_glue_devclass = { 90 + .name = "k3_udma_glue_chan", 91 + .dev_release = k3_udma_chan_dev_release, 92 + }; 93 + 88 94 #define K3_UDMAX_TDOWN_TIMEOUT_US 1000 89 95 90 96 static int of_k3_udma_glue_parse(struct device_node *udmax_np, 91 97 struct k3_udma_glue_common *common) 92 98 { 93 - common->ringacc = of_k3_ringacc_get_by_phandle(udmax_np, 94 - "ti,ringacc"); 95 - if (IS_ERR(common->ringacc)) 96 - return PTR_ERR(common->ringacc); 97 - 98 99 common->udmax = of_xudma_dev_get(udmax_np, NULL); 99 100 if (IS_ERR(common->udmax)) 100 101 return PTR_ERR(common->udmax); 101 102 103 + common->ringacc = xudma_get_ringacc(common->udmax); 102 104 common->tisci_rm = xudma_dev_get_tisci_rm(common->udmax); 103 105 104 106 return 0; ··· 114 104 const char *name, struct k3_udma_glue_common *common, 115 105 bool tx_chn) 116 106 { 117 - struct psil_endpoint_config *ep_config; 118 107 struct of_phandle_args dma_spec; 119 108 u32 thread_id; 120 109 int ret = 0; ··· 130 121 &dma_spec)) 131 122 return -ENOENT; 132 123 124 + ret = of_k3_udma_glue_parse(dma_spec.np, common); 125 + if (ret) 126 + goto out_put_spec; 127 + 133 128 thread_id = dma_spec.args[0]; 134 129 if (dma_spec.args_count == 2) { 135 - if (dma_spec.args[1] > 2) { 130 + if (dma_spec.args[1] > 2 && !xudma_is_pktdma(common->udmax)) { 136 131 dev_err(common->dev, "Invalid channel atype: %u\n", 137 132 dma_spec.args[1]); 138 133 ret = -EINVAL; 139 134 goto out_put_spec; 140 135 } 141 - common->atype = dma_spec.args[1]; 136 + if (dma_spec.args[1] > 15 && xudma_is_pktdma(common->udmax)) { 137 + dev_err(common->dev, "Invalid channel asel: %u\n", 138 + dma_spec.args[1]); 139 + ret = -EINVAL; 140 + goto out_put_spec; 141 + } 142 + 143 + common->atype_asel = dma_spec.args[1]; 142 144 } 143 145 144 146 if (tx_chn && !(thread_id & K3_PSIL_DST_THREAD_ID_OFFSET)) { ··· 163 143 } 164 144 165 145 /* get psil endpoint config */ 166 - ep_config = psil_get_ep_config(thread_id); 167 - if (IS_ERR(ep_config)) { 146 + common->ep_config = psil_get_ep_config(thread_id); 147 + if (IS_ERR(common->ep_config)) { 168 148 dev_err(common->dev, 169 149 "No configuration for psi-l thread 0x%04x\n", 170 150 thread_id); 171 - ret = PTR_ERR(ep_config); 151 + ret = PTR_ERR(common->ep_config); 172 152 goto out_put_spec; 173 153 } 174 154 175 - common->epib = ep_config->needs_epib; 176 - common->psdata_size = ep_config->psd_size; 155 + common->epib = common->ep_config->needs_epib; 156 + common->psdata_size = common->ep_config->psd_size; 177 157 178 158 if (tx_chn) 179 159 common->dst_thread = thread_id; 180 160 else 181 161 common->src_thread = thread_id; 182 - 183 - ret = of_k3_udma_glue_parse(dma_spec.np, common); 184 162 185 163 out_put_spec: 186 164 of_node_put(dma_spec.np); ··· 245 227 req.tx_supr_tdpkt = 1; 246 228 req.tx_fetch_size = tx_chn->common.hdesc_size >> 2; 247 229 req.txcq_qnum = k3_ringacc_get_ring_id(tx_chn->ringtxcq); 248 - req.tx_atype = tx_chn->common.atype; 230 + req.tx_atype = tx_chn->common.atype_asel; 249 231 250 232 return tisci_rm->tisci_udmap_ops->tx_ch_cfg(tisci_rm->tisci, &req); 251 233 } ··· 277 259 tx_chn->common.psdata_size, 278 260 tx_chn->common.swdata_size); 279 261 262 + if (xudma_is_pktdma(tx_chn->common.udmax)) 263 + tx_chn->udma_tchan_id = tx_chn->common.ep_config->mapped_channel_id; 264 + else 265 + tx_chn->udma_tchan_id = -1; 266 + 280 267 /* request and cfg UDMAP TX channel */ 281 - tx_chn->udma_tchanx = xudma_tchan_get(tx_chn->common.udmax, -1); 268 + tx_chn->udma_tchanx = xudma_tchan_get(tx_chn->common.udmax, 269 + tx_chn->udma_tchan_id); 282 270 if (IS_ERR(tx_chn->udma_tchanx)) { 283 271 ret = PTR_ERR(tx_chn->udma_tchanx); 284 272 dev_err(dev, "UDMAX tchanx get err %d\n", ret); ··· 292 268 } 293 269 tx_chn->udma_tchan_id = xudma_tchan_get_id(tx_chn->udma_tchanx); 294 270 271 + tx_chn->common.chan_dev.class = &k3_udma_glue_devclass; 272 + tx_chn->common.chan_dev.parent = xudma_get_device(tx_chn->common.udmax); 273 + dev_set_name(&tx_chn->common.chan_dev, "tchan%d-0x%04x", 274 + tx_chn->udma_tchan_id, tx_chn->common.dst_thread); 275 + ret = device_register(&tx_chn->common.chan_dev); 276 + if (ret) { 277 + dev_err(dev, "Channel Device registration failed %d\n", ret); 278 + tx_chn->common.chan_dev.parent = NULL; 279 + goto err; 280 + } 281 + 282 + if (xudma_is_pktdma(tx_chn->common.udmax)) { 283 + /* prepare the channel device as coherent */ 284 + tx_chn->common.chan_dev.dma_coherent = true; 285 + dma_coerce_mask_and_coherent(&tx_chn->common.chan_dev, 286 + DMA_BIT_MASK(48)); 287 + } 288 + 295 289 atomic_set(&tx_chn->free_pkts, cfg->txcq_cfg.size); 290 + 291 + if (xudma_is_pktdma(tx_chn->common.udmax)) 292 + tx_chn->udma_tflow_id = tx_chn->common.ep_config->default_flow_id; 293 + else 294 + tx_chn->udma_tflow_id = tx_chn->udma_tchan_id; 296 295 297 296 /* request and cfg rings */ 298 297 ret = k3_ringacc_request_rings_pair(tx_chn->common.ringacc, 299 - tx_chn->udma_tchan_id, -1, 298 + tx_chn->udma_tflow_id, -1, 300 299 &tx_chn->ringtx, 301 300 &tx_chn->ringtxcq); 302 301 if (ret) { 303 302 dev_err(dev, "Failed to get TX/TXCQ rings %d\n", ret); 304 303 goto err; 304 + } 305 + 306 + /* Set the dma_dev for the rings to be configured */ 307 + cfg->tx_cfg.dma_dev = k3_udma_glue_tx_get_dma_device(tx_chn); 308 + cfg->txcq_cfg.dma_dev = cfg->tx_cfg.dma_dev; 309 + 310 + /* Set the ASEL value for DMA rings of PKTDMA */ 311 + if (xudma_is_pktdma(tx_chn->common.udmax)) { 312 + cfg->tx_cfg.asel = tx_chn->common.atype_asel; 313 + cfg->txcq_cfg.asel = tx_chn->common.atype_asel; 305 314 } 306 315 307 316 ret = k3_ringacc_ring_cfg(tx_chn->ringtx, &cfg->tx_cfg); ··· 359 302 dev_err(dev, "Failed to cfg tchan %d\n", ret); 360 303 goto err; 361 304 } 362 - 363 - ret = xudma_navss_psil_pair(tx_chn->common.udmax, 364 - tx_chn->common.src_thread, 365 - tx_chn->common.dst_thread); 366 - if (ret) { 367 - dev_err(dev, "PSI-L request err %d\n", ret); 368 - goto err; 369 - } 370 - 371 - tx_chn->psil_paired = true; 372 - 373 - /* reset TX RT registers */ 374 - k3_udma_glue_disable_tx_chn(tx_chn); 375 305 376 306 k3_udma_glue_dump_tx_chn(tx_chn); 377 307 ··· 388 344 389 345 if (tx_chn->ringtx) 390 346 k3_ringacc_ring_free(tx_chn->ringtx); 347 + 348 + if (tx_chn->common.chan_dev.parent) { 349 + device_unregister(&tx_chn->common.chan_dev); 350 + tx_chn->common.chan_dev.parent = NULL; 351 + } 391 352 } 392 353 EXPORT_SYMBOL_GPL(k3_udma_glue_release_tx_chn); 393 354 ··· 427 378 428 379 int k3_udma_glue_enable_tx_chn(struct k3_udma_glue_tx_channel *tx_chn) 429 380 { 381 + int ret; 382 + 383 + ret = xudma_navss_psil_pair(tx_chn->common.udmax, 384 + tx_chn->common.src_thread, 385 + tx_chn->common.dst_thread); 386 + if (ret) { 387 + dev_err(tx_chn->common.dev, "PSI-L request err %d\n", ret); 388 + return ret; 389 + } 390 + 391 + tx_chn->psil_paired = true; 392 + 430 393 xudma_tchanrt_write(tx_chn->udma_tchanx, UDMA_CHAN_RT_PEER_RT_EN_REG, 431 394 UDMA_PEER_RT_EN_ENABLE); 432 395 ··· 459 398 xudma_tchanrt_write(tx_chn->udma_tchanx, 460 399 UDMA_CHAN_RT_PEER_RT_EN_REG, 0); 461 400 k3_udma_glue_dump_tx_rt_chn(tx_chn, "txchn dis2"); 401 + 402 + if (tx_chn->psil_paired) { 403 + xudma_navss_psil_unpair(tx_chn->common.udmax, 404 + tx_chn->common.src_thread, 405 + tx_chn->common.dst_thread); 406 + tx_chn->psil_paired = false; 407 + } 462 408 } 463 409 EXPORT_SYMBOL_GPL(k3_udma_glue_disable_tx_chn); 464 410 ··· 505 437 void *data, 506 438 void (*cleanup)(void *data, dma_addr_t desc_dma)) 507 439 { 440 + struct device *dev = tx_chn->common.dev; 508 441 dma_addr_t desc_dma; 509 442 int occ_tx, i, ret; 510 - 511 - /* reset TXCQ as it is not input for udma - expected to be empty */ 512 - if (tx_chn->ringtxcq) 513 - k3_ringacc_ring_reset(tx_chn->ringtxcq); 514 443 515 444 /* 516 445 * TXQ reset need to be special way as it is input for udma and its ··· 517 452 * 3) reset TXQ in a special way 518 453 */ 519 454 occ_tx = k3_ringacc_ring_get_occ(tx_chn->ringtx); 520 - dev_dbg(tx_chn->common.dev, "TX reset occ_tx %u\n", occ_tx); 455 + dev_dbg(dev, "TX reset occ_tx %u\n", occ_tx); 521 456 522 457 for (i = 0; i < occ_tx; i++) { 523 458 ret = k3_ringacc_ring_pop(tx_chn->ringtx, &desc_dma); 524 459 if (ret) { 525 - dev_err(tx_chn->common.dev, "TX reset pop %d\n", ret); 460 + if (ret != -ENODATA) 461 + dev_err(dev, "TX reset pop %d\n", ret); 526 462 break; 527 463 } 528 464 cleanup(data, desc_dma); 529 465 } 530 466 467 + /* reset TXCQ as it is not input for udma - expected to be empty */ 468 + k3_ringacc_ring_reset(tx_chn->ringtxcq); 531 469 k3_ringacc_ring_reset_dma(tx_chn->ringtx, occ_tx); 532 470 } 533 471 EXPORT_SYMBOL_GPL(k3_udma_glue_reset_tx_chn); ··· 549 481 550 482 int k3_udma_glue_tx_get_irq(struct k3_udma_glue_tx_channel *tx_chn) 551 483 { 552 - tx_chn->virq = k3_ringacc_get_ring_irq_num(tx_chn->ringtxcq); 484 + if (xudma_is_pktdma(tx_chn->common.udmax)) { 485 + tx_chn->virq = xudma_pktdma_tflow_get_irq(tx_chn->common.udmax, 486 + tx_chn->udma_tflow_id); 487 + } else { 488 + tx_chn->virq = k3_ringacc_get_ring_irq_num(tx_chn->ringtxcq); 489 + } 553 490 554 491 return tx_chn->virq; 555 492 } 556 493 EXPORT_SYMBOL_GPL(k3_udma_glue_tx_get_irq); 494 + 495 + struct device * 496 + k3_udma_glue_tx_get_dma_device(struct k3_udma_glue_tx_channel *tx_chn) 497 + { 498 + if (xudma_is_pktdma(tx_chn->common.udmax) && 499 + (tx_chn->common.atype_asel == 14 || tx_chn->common.atype_asel == 15)) 500 + return &tx_chn->common.chan_dev; 501 + 502 + return xudma_get_device(tx_chn->common.udmax); 503 + } 504 + EXPORT_SYMBOL_GPL(k3_udma_glue_tx_get_dma_device); 505 + 506 + void k3_udma_glue_tx_dma_to_cppi5_addr(struct k3_udma_glue_tx_channel *tx_chn, 507 + dma_addr_t *addr) 508 + { 509 + if (!xudma_is_pktdma(tx_chn->common.udmax) || 510 + !tx_chn->common.atype_asel) 511 + return; 512 + 513 + *addr |= (u64)tx_chn->common.atype_asel << K3_ADDRESS_ASEL_SHIFT; 514 + } 515 + EXPORT_SYMBOL_GPL(k3_udma_glue_tx_dma_to_cppi5_addr); 516 + 517 + void k3_udma_glue_tx_cppi5_to_dma_addr(struct k3_udma_glue_tx_channel *tx_chn, 518 + dma_addr_t *addr) 519 + { 520 + if (!xudma_is_pktdma(tx_chn->common.udmax) || 521 + !tx_chn->common.atype_asel) 522 + return; 523 + 524 + *addr &= (u64)GENMASK(K3_ADDRESS_ASEL_SHIFT - 1, 0); 525 + } 526 + EXPORT_SYMBOL_GPL(k3_udma_glue_tx_cppi5_to_dma_addr); 557 527 558 528 static int k3_udma_glue_cfg_rx_chn(struct k3_udma_glue_rx_channel *rx_chn) 559 529 { ··· 604 498 req.valid_params = TI_SCI_MSG_VALUE_RM_UDMAP_CH_FETCH_SIZE_VALID | 605 499 TI_SCI_MSG_VALUE_RM_UDMAP_CH_CQ_QNUM_VALID | 606 500 TI_SCI_MSG_VALUE_RM_UDMAP_CH_CHAN_TYPE_VALID | 607 - TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_START_VALID | 608 - TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_CNT_VALID | 609 501 TI_SCI_MSG_VALUE_RM_UDMAP_CH_ATYPE_VALID; 610 502 611 503 req.nav_id = tisci_rm->tisci_dev_id; ··· 615 511 * req.rxcq_qnum = k3_ringacc_get_ring_id(rx_chn->flows[0].ringrx); 616 512 */ 617 513 req.rxcq_qnum = 0xFFFF; 618 - if (rx_chn->flow_num && rx_chn->flow_id_base != rx_chn->udma_rchan_id) { 514 + if (!xudma_is_pktdma(rx_chn->common.udmax) && rx_chn->flow_num && 515 + rx_chn->flow_id_base != rx_chn->udma_rchan_id) { 619 516 /* Default flow + extra ones */ 517 + req.valid_params |= TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_START_VALID | 518 + TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_CNT_VALID; 620 519 req.flowid_start = rx_chn->flow_id_base; 621 520 req.flowid_cnt = rx_chn->flow_num; 622 521 } 623 522 req.rx_chan_type = TI_SCI_RM_UDMAP_CHAN_TYPE_PKT_PBRR; 624 - req.rx_atype = rx_chn->common.atype; 523 + req.rx_atype = rx_chn->common.atype_asel; 625 524 626 525 ret = tisci_rm->tisci_udmap_ops->rx_ch_cfg(tisci_rm->tisci, &req); 627 526 if (ret) ··· 678 571 goto err_rflow_put; 679 572 } 680 573 574 + if (xudma_is_pktdma(rx_chn->common.udmax)) { 575 + rx_ringfdq_id = flow->udma_rflow_id + 576 + xudma_get_rflow_ring_offset(rx_chn->common.udmax); 577 + rx_ring_id = 0; 578 + } else { 579 + rx_ring_id = flow_cfg->ring_rxq_id; 580 + rx_ringfdq_id = flow_cfg->ring_rxfdq0_id; 581 + } 582 + 681 583 /* request and cfg rings */ 682 584 ret = k3_ringacc_request_rings_pair(rx_chn->common.ringacc, 683 - flow_cfg->ring_rxfdq0_id, 684 - flow_cfg->ring_rxq_id, 585 + rx_ringfdq_id, rx_ring_id, 685 586 &flow->ringrxfdq, 686 587 &flow->ringrx); 687 588 if (ret) { 688 589 dev_err(dev, "Failed to get RX/RXFDQ rings %d\n", ret); 689 590 goto err_rflow_put; 591 + } 592 + 593 + /* Set the dma_dev for the rings to be configured */ 594 + flow_cfg->rx_cfg.dma_dev = k3_udma_glue_rx_get_dma_device(rx_chn); 595 + flow_cfg->rxfdq_cfg.dma_dev = flow_cfg->rx_cfg.dma_dev; 596 + 597 + /* Set the ASEL value for DMA rings of PKTDMA */ 598 + if (xudma_is_pktdma(rx_chn->common.udmax)) { 599 + flow_cfg->rx_cfg.asel = rx_chn->common.atype_asel; 600 + flow_cfg->rxfdq_cfg.asel = rx_chn->common.atype_asel; 690 601 } 691 602 692 603 ret = k3_ringacc_ring_cfg(flow->ringrx, &flow_cfg->rx_cfg); ··· 865 740 struct k3_udma_glue_rx_channel_cfg *cfg) 866 741 { 867 742 struct k3_udma_glue_rx_channel *rx_chn; 743 + struct psil_endpoint_config *ep_cfg; 868 744 int ret, i; 869 745 870 746 if (cfg->flow_id_num <= 0) ··· 893 767 rx_chn->common.psdata_size, 894 768 rx_chn->common.swdata_size); 895 769 770 + ep_cfg = rx_chn->common.ep_config; 771 + 772 + if (xudma_is_pktdma(rx_chn->common.udmax)) 773 + rx_chn->udma_rchan_id = ep_cfg->mapped_channel_id; 774 + else 775 + rx_chn->udma_rchan_id = -1; 776 + 896 777 /* request and cfg UDMAP RX channel */ 897 - rx_chn->udma_rchanx = xudma_rchan_get(rx_chn->common.udmax, -1); 778 + rx_chn->udma_rchanx = xudma_rchan_get(rx_chn->common.udmax, 779 + rx_chn->udma_rchan_id); 898 780 if (IS_ERR(rx_chn->udma_rchanx)) { 899 781 ret = PTR_ERR(rx_chn->udma_rchanx); 900 782 dev_err(dev, "UDMAX rchanx get err %d\n", ret); ··· 910 776 } 911 777 rx_chn->udma_rchan_id = xudma_rchan_get_id(rx_chn->udma_rchanx); 912 778 913 - rx_chn->flow_num = cfg->flow_id_num; 914 - rx_chn->flow_id_base = cfg->flow_id_base; 779 + rx_chn->common.chan_dev.class = &k3_udma_glue_devclass; 780 + rx_chn->common.chan_dev.parent = xudma_get_device(rx_chn->common.udmax); 781 + dev_set_name(&rx_chn->common.chan_dev, "rchan%d-0x%04x", 782 + rx_chn->udma_rchan_id, rx_chn->common.src_thread); 783 + ret = device_register(&rx_chn->common.chan_dev); 784 + if (ret) { 785 + dev_err(dev, "Channel Device registration failed %d\n", ret); 786 + rx_chn->common.chan_dev.parent = NULL; 787 + goto err; 788 + } 915 789 916 - /* Use RX channel id as flow id: target dev can't generate flow_id */ 917 - if (cfg->flow_id_use_rxchan_id) 918 - rx_chn->flow_id_base = rx_chn->udma_rchan_id; 790 + if (xudma_is_pktdma(rx_chn->common.udmax)) { 791 + /* prepare the channel device as coherent */ 792 + rx_chn->common.chan_dev.dma_coherent = true; 793 + dma_coerce_mask_and_coherent(&rx_chn->common.chan_dev, 794 + DMA_BIT_MASK(48)); 795 + } 796 + 797 + if (xudma_is_pktdma(rx_chn->common.udmax)) { 798 + int flow_start = cfg->flow_id_base; 799 + int flow_end; 800 + 801 + if (flow_start == -1) 802 + flow_start = ep_cfg->flow_start; 803 + 804 + flow_end = flow_start + cfg->flow_id_num - 1; 805 + if (flow_start < ep_cfg->flow_start || 806 + flow_end > (ep_cfg->flow_start + ep_cfg->flow_num - 1)) { 807 + dev_err(dev, "Invalid flow range requested\n"); 808 + ret = -EINVAL; 809 + goto err; 810 + } 811 + rx_chn->flow_id_base = flow_start; 812 + } else { 813 + rx_chn->flow_id_base = cfg->flow_id_base; 814 + 815 + /* Use RX channel id as flow id: target dev can't generate flow_id */ 816 + if (cfg->flow_id_use_rxchan_id) 817 + rx_chn->flow_id_base = rx_chn->udma_rchan_id; 818 + } 819 + 820 + rx_chn->flow_num = cfg->flow_id_num; 919 821 920 822 rx_chn->flows = devm_kcalloc(dev, rx_chn->flow_num, 921 823 sizeof(*rx_chn->flows), GFP_KERNEL); ··· 984 814 if (ret) 985 815 goto err; 986 816 } 987 - 988 - ret = xudma_navss_psil_pair(rx_chn->common.udmax, 989 - rx_chn->common.src_thread, 990 - rx_chn->common.dst_thread); 991 - if (ret) { 992 - dev_err(dev, "PSI-L request err %d\n", ret); 993 - goto err; 994 - } 995 - 996 - rx_chn->psil_paired = true; 997 - 998 - /* reset RX RT registers */ 999 - k3_udma_glue_disable_rx_chn(rx_chn); 1000 817 1001 818 k3_udma_glue_dump_rx_chn(rx_chn); 1002 819 ··· 1041 884 goto err; 1042 885 } 1043 886 887 + rx_chn->common.chan_dev.class = &k3_udma_glue_devclass; 888 + rx_chn->common.chan_dev.parent = xudma_get_device(rx_chn->common.udmax); 889 + dev_set_name(&rx_chn->common.chan_dev, "rchan_remote-0x%04x", 890 + rx_chn->common.src_thread); 891 + ret = device_register(&rx_chn->common.chan_dev); 892 + if (ret) { 893 + dev_err(dev, "Channel Device registration failed %d\n", ret); 894 + rx_chn->common.chan_dev.parent = NULL; 895 + goto err; 896 + } 897 + 898 + if (xudma_is_pktdma(rx_chn->common.udmax)) { 899 + /* prepare the channel device as coherent */ 900 + rx_chn->common.chan_dev.dma_coherent = true; 901 + dma_coerce_mask_and_coherent(&rx_chn->common.chan_dev, 902 + DMA_BIT_MASK(48)); 903 + } 904 + 1044 905 ret = k3_udma_glue_allocate_rx_flows(rx_chn, cfg); 1045 906 if (ret) 1046 907 goto err; ··· 1111 936 if (!IS_ERR_OR_NULL(rx_chn->udma_rchanx)) 1112 937 xudma_rchan_put(rx_chn->common.udmax, 1113 938 rx_chn->udma_rchanx); 939 + 940 + if (rx_chn->common.chan_dev.parent) { 941 + device_unregister(&rx_chn->common.chan_dev); 942 + rx_chn->common.chan_dev.parent = NULL; 943 + } 1114 944 } 1115 945 EXPORT_SYMBOL_GPL(k3_udma_glue_release_rx_chn); 1116 946 ··· 1232 1052 1233 1053 int k3_udma_glue_enable_rx_chn(struct k3_udma_glue_rx_channel *rx_chn) 1234 1054 { 1055 + int ret; 1056 + 1235 1057 if (rx_chn->remote) 1236 1058 return -EINVAL; 1237 1059 1238 1060 if (rx_chn->flows_ready < rx_chn->flow_num) 1239 1061 return -EINVAL; 1062 + 1063 + ret = xudma_navss_psil_pair(rx_chn->common.udmax, 1064 + rx_chn->common.src_thread, 1065 + rx_chn->common.dst_thread); 1066 + if (ret) { 1067 + dev_err(rx_chn->common.dev, "PSI-L request err %d\n", ret); 1068 + return ret; 1069 + } 1070 + 1071 + rx_chn->psil_paired = true; 1240 1072 1241 1073 xudma_rchanrt_write(rx_chn->udma_rchanx, UDMA_CHAN_RT_CTL_REG, 1242 1074 UDMA_CHAN_RT_CTL_EN); ··· 1270 1078 xudma_rchanrt_write(rx_chn->udma_rchanx, UDMA_CHAN_RT_CTL_REG, 0); 1271 1079 1272 1080 k3_udma_glue_dump_rx_rt_chn(rx_chn, "rxrt dis2"); 1081 + 1082 + if (rx_chn->psil_paired) { 1083 + xudma_navss_psil_unpair(rx_chn->common.udmax, 1084 + rx_chn->common.src_thread, 1085 + rx_chn->common.dst_thread); 1086 + rx_chn->psil_paired = false; 1087 + } 1273 1088 } 1274 1089 EXPORT_SYMBOL_GPL(k3_udma_glue_disable_rx_chn); 1275 1090 ··· 1327 1128 /* reset RXCQ as it is not input for udma - expected to be empty */ 1328 1129 occ_rx = k3_ringacc_ring_get_occ(flow->ringrx); 1329 1130 dev_dbg(dev, "RX reset flow %u occ_rx %u\n", flow_num, occ_rx); 1330 - if (flow->ringrx) 1331 - k3_ringacc_ring_reset(flow->ringrx); 1332 1131 1333 1132 /* Skip RX FDQ in case one FDQ is used for the set of flows */ 1334 1133 if (skip_fdq) 1335 - return; 1134 + goto do_reset; 1336 1135 1337 1136 /* 1338 1137 * RX FDQ reset need to be special way as it is input for udma and its ··· 1345 1148 for (i = 0; i < occ_rx; i++) { 1346 1149 ret = k3_ringacc_ring_pop(flow->ringrxfdq, &desc_dma); 1347 1150 if (ret) { 1348 - dev_err(dev, "RX reset pop %d\n", ret); 1151 + if (ret != -ENODATA) 1152 + dev_err(dev, "RX reset pop %d\n", ret); 1349 1153 break; 1350 1154 } 1351 1155 cleanup(data, desc_dma); 1352 1156 } 1353 1157 1354 1158 k3_ringacc_ring_reset_dma(flow->ringrxfdq, occ_rx); 1159 + 1160 + do_reset: 1161 + k3_ringacc_ring_reset(flow->ringrx); 1355 1162 } 1356 1163 EXPORT_SYMBOL_GPL(k3_udma_glue_reset_rx_chn); 1357 1164 ··· 1385 1184 1386 1185 flow = &rx_chn->flows[flow_num]; 1387 1186 1388 - flow->virq = k3_ringacc_get_ring_irq_num(flow->ringrx); 1187 + if (xudma_is_pktdma(rx_chn->common.udmax)) { 1188 + flow->virq = xudma_pktdma_rflow_get_irq(rx_chn->common.udmax, 1189 + flow->udma_rflow_id); 1190 + } else { 1191 + flow->virq = k3_ringacc_get_ring_irq_num(flow->ringrx); 1192 + } 1389 1193 1390 1194 return flow->virq; 1391 1195 } 1392 1196 EXPORT_SYMBOL_GPL(k3_udma_glue_rx_get_irq); 1197 + 1198 + struct device * 1199 + k3_udma_glue_rx_get_dma_device(struct k3_udma_glue_rx_channel *rx_chn) 1200 + { 1201 + if (xudma_is_pktdma(rx_chn->common.udmax) && 1202 + (rx_chn->common.atype_asel == 14 || rx_chn->common.atype_asel == 15)) 1203 + return &rx_chn->common.chan_dev; 1204 + 1205 + return xudma_get_device(rx_chn->common.udmax); 1206 + } 1207 + EXPORT_SYMBOL_GPL(k3_udma_glue_rx_get_dma_device); 1208 + 1209 + void k3_udma_glue_rx_dma_to_cppi5_addr(struct k3_udma_glue_rx_channel *rx_chn, 1210 + dma_addr_t *addr) 1211 + { 1212 + if (!xudma_is_pktdma(rx_chn->common.udmax) || 1213 + !rx_chn->common.atype_asel) 1214 + return; 1215 + 1216 + *addr |= (u64)rx_chn->common.atype_asel << K3_ADDRESS_ASEL_SHIFT; 1217 + } 1218 + EXPORT_SYMBOL_GPL(k3_udma_glue_rx_dma_to_cppi5_addr); 1219 + 1220 + void k3_udma_glue_rx_cppi5_to_dma_addr(struct k3_udma_glue_rx_channel *rx_chn, 1221 + dma_addr_t *addr) 1222 + { 1223 + if (!xudma_is_pktdma(rx_chn->common.udmax) || 1224 + !rx_chn->common.atype_asel) 1225 + return; 1226 + 1227 + *addr &= (u64)GENMASK(K3_ADDRESS_ASEL_SHIFT - 1, 0); 1228 + } 1229 + EXPORT_SYMBOL_GPL(k3_udma_glue_rx_cppi5_to_dma_addr); 1230 + 1231 + static int __init k3_udma_glue_class_init(void) 1232 + { 1233 + return class_register(&k3_udma_glue_devclass); 1234 + } 1235 + arch_initcall(k3_udma_glue_class_init);
+45
drivers/dma/ti/k3-udma-private.c
··· 50 50 } 51 51 EXPORT_SYMBOL(of_xudma_dev_get); 52 52 53 + struct device *xudma_get_device(struct udma_dev *ud) 54 + { 55 + return ud->dev; 56 + } 57 + EXPORT_SYMBOL(xudma_get_device); 58 + 59 + struct k3_ringacc *xudma_get_ringacc(struct udma_dev *ud) 60 + { 61 + return ud->ringacc; 62 + } 63 + EXPORT_SYMBOL(xudma_get_ringacc); 64 + 53 65 u32 xudma_dev_get_psil_base(struct udma_dev *ud) 54 66 { 55 67 return ud->psil_base; ··· 88 76 89 77 bool xudma_rflow_is_gp(struct udma_dev *ud, int id) 90 78 { 79 + if (!ud->rflow_gp_map) 80 + return false; 81 + 91 82 return !test_bit(id, ud->rflow_gp_map); 92 83 } 93 84 EXPORT_SYMBOL(xudma_rflow_is_gp); ··· 122 107 } 123 108 EXPORT_SYMBOL(xudma_rflow_put); 124 109 110 + int xudma_get_rflow_ring_offset(struct udma_dev *ud) 111 + { 112 + return ud->tflow_cnt; 113 + } 114 + EXPORT_SYMBOL(xudma_get_rflow_ring_offset); 115 + 125 116 #define XUDMA_GET_RESOURCE_ID(res) \ 126 117 int xudma_##res##_get_id(struct udma_##res *p) \ 127 118 { \ ··· 157 136 EXPORT_SYMBOL(xudma_##res##rt_write) 158 137 XUDMA_RT_IO_FUNCTIONS(tchan); 159 138 XUDMA_RT_IO_FUNCTIONS(rchan); 139 + 140 + int xudma_is_pktdma(struct udma_dev *ud) 141 + { 142 + return ud->match_data->type == DMA_TYPE_PKTDMA; 143 + } 144 + EXPORT_SYMBOL(xudma_is_pktdma); 145 + 146 + int xudma_pktdma_tflow_get_irq(struct udma_dev *ud, int udma_tflow_id) 147 + { 148 + const struct udma_oes_offsets *oes = &ud->soc_data->oes; 149 + 150 + return ti_sci_inta_msi_get_virq(ud->dev, udma_tflow_id + 151 + oes->pktdma_tchan_flow); 152 + } 153 + EXPORT_SYMBOL(xudma_pktdma_tflow_get_irq); 154 + 155 + int xudma_pktdma_rflow_get_irq(struct udma_dev *ud, int udma_rflow_id) 156 + { 157 + const struct udma_oes_offsets *oes = &ud->soc_data->oes; 158 + 159 + return ti_sci_inta_msi_get_virq(ud->dev, udma_rflow_id + 160 + oes->pktdma_rchan_flow); 161 + } 162 + EXPORT_SYMBOL(xudma_pktdma_rflow_get_irq);
+1785 -151
drivers/dma/ti/k3-udma.c
··· 26 26 #include <linux/soc/ti/k3-ringacc.h> 27 27 #include <linux/soc/ti/ti_sci_protocol.h> 28 28 #include <linux/soc/ti/ti_sci_inta_msi.h> 29 + #include <linux/dma/k3-event-router.h> 29 30 #include <linux/dma/ti-cppi5.h> 30 31 31 32 #include "../virt-dma.h" ··· 56 55 57 56 struct udma_chan; 58 57 58 + enum k3_dma_type { 59 + DMA_TYPE_UDMA = 0, 60 + DMA_TYPE_BCDMA, 61 + DMA_TYPE_PKTDMA, 62 + }; 63 + 59 64 enum udma_mmr { 60 65 MMR_GCFG = 0, 66 + MMR_BCHANRT, 61 67 MMR_RCHANRT, 62 68 MMR_TCHANRT, 63 69 MMR_LAST, 64 70 }; 65 71 66 - static const char * const mmr_names[] = { "gcfg", "rchanrt", "tchanrt" }; 72 + static const char * const mmr_names[] = { 73 + [MMR_GCFG] = "gcfg", 74 + [MMR_BCHANRT] = "bchanrt", 75 + [MMR_RCHANRT] = "rchanrt", 76 + [MMR_TCHANRT] = "tchanrt", 77 + }; 67 78 68 79 struct udma_tchan { 69 80 void __iomem *reg_rt; ··· 83 70 int id; 84 71 struct k3_ring *t_ring; /* Transmit ring */ 85 72 struct k3_ring *tc_ring; /* Transmit Completion ring */ 73 + int tflow_id; /* applicable only for PKTDMA */ 74 + 86 75 }; 76 + 77 + #define udma_bchan udma_tchan 87 78 88 79 struct udma_rflow { 89 80 int id; ··· 101 84 int id; 102 85 }; 103 86 87 + struct udma_oes_offsets { 88 + /* K3 UDMA Output Event Offset */ 89 + u32 udma_rchan; 90 + 91 + /* BCDMA Output Event Offsets */ 92 + u32 bcdma_bchan_data; 93 + u32 bcdma_bchan_ring; 94 + u32 bcdma_tchan_data; 95 + u32 bcdma_tchan_ring; 96 + u32 bcdma_rchan_data; 97 + u32 bcdma_rchan_ring; 98 + 99 + /* PKTDMA Output Event Offsets */ 100 + u32 pktdma_tchan_flow; 101 + u32 pktdma_rchan_flow; 102 + }; 103 + 104 104 #define UDMA_FLAG_PDMA_ACC32 BIT(0) 105 105 #define UDMA_FLAG_PDMA_BURST BIT(1) 106 + #define UDMA_FLAG_TDTYPE BIT(2) 106 107 107 108 struct udma_match_data { 109 + enum k3_dma_type type; 108 110 u32 psil_base; 109 111 bool enable_memcpy_support; 110 112 u32 flags; ··· 131 95 }; 132 96 133 97 struct udma_soc_data { 134 - u32 rchan_oes_offset; 98 + struct udma_oes_offsets oes; 99 + u32 bcdma_trigger_event_offset; 135 100 }; 136 101 137 102 struct udma_hwdesc { ··· 153 116 dma_addr_t buffer_paddr; 154 117 }; 155 118 119 + struct udma_tpl { 120 + u8 levels; 121 + u32 start_idx[3]; 122 + }; 123 + 156 124 struct udma_dev { 157 125 struct dma_device ddev; 158 126 struct device *dev; ··· 165 123 const struct udma_match_data *match_data; 166 124 const struct udma_soc_data *soc_data; 167 125 168 - u8 tpl_levels; 169 - u32 tpl_start_idx[3]; 126 + struct udma_tpl bchan_tpl; 127 + struct udma_tpl tchan_tpl; 128 + struct udma_tpl rchan_tpl; 170 129 171 130 size_t desc_align; /* alignment to use for descriptors */ 172 131 ··· 181 138 182 139 struct udma_rx_flush rx_flush; 183 140 141 + int bchan_cnt; 184 142 int tchan_cnt; 185 143 int echan_cnt; 186 144 int rchan_cnt; 187 145 int rflow_cnt; 146 + int tflow_cnt; 147 + unsigned long *bchan_map; 188 148 unsigned long *tchan_map; 189 149 unsigned long *rchan_map; 190 150 unsigned long *rflow_gp_map; 191 151 unsigned long *rflow_gp_map_allocated; 192 152 unsigned long *rflow_in_use; 153 + unsigned long *tflow_map; 193 154 155 + struct udma_bchan *bchans; 194 156 struct udma_tchan *tchans; 195 157 struct udma_rchan *rchans; 196 158 struct udma_rflow *rflows; ··· 203 155 struct udma_chan *channels; 204 156 u32 psil_base; 205 157 u32 atype; 158 + u32 asel; 206 159 }; 207 160 208 161 struct udma_desc { ··· 248 199 bool notdpkt; /* Suppress sending TDC packet */ 249 200 int remote_thread_id; 250 201 u32 atype; 202 + u32 asel; 251 203 u32 src_thread; 252 204 u32 dst_thread; 253 205 enum psil_endpoint_type ep_type; 254 206 bool enable_acc32; 255 207 bool enable_burst; 256 208 enum udma_tp_level channel_tpl; /* Channel Throughput Level */ 209 + 210 + u32 tr_trigger_type; 211 + 212 + /* PKDMA mapped channel */ 213 + int mapped_channel_id; 214 + /* PKTDMA default tflow or rflow for mapped channel */ 215 + int default_flow_id; 257 216 258 217 enum dma_transfer_direction dir; 259 218 }; ··· 270 213 struct virt_dma_chan vc; 271 214 struct dma_slave_config cfg; 272 215 struct udma_dev *ud; 216 + struct device *dma_dev; 273 217 struct udma_desc *desc; 274 218 struct udma_desc *terminated_desc; 275 219 struct udma_static_tr static_tr; 276 220 char *name; 277 221 222 + struct udma_bchan *bchan; 278 223 struct udma_tchan *tchan; 279 224 struct udma_rchan *rchan; 280 225 struct udma_rflow *rflow; ··· 412 353 src_thread, dst_thread); 413 354 } 414 355 356 + static void k3_configure_chan_coherency(struct dma_chan *chan, u32 asel) 357 + { 358 + struct device *chan_dev = &chan->dev->device; 359 + 360 + if (asel == 0) { 361 + /* No special handling for the channel */ 362 + chan->dev->chan_dma_dev = false; 363 + 364 + chan_dev->dma_coherent = false; 365 + chan_dev->dma_parms = NULL; 366 + } else if (asel == 14 || asel == 15) { 367 + chan->dev->chan_dma_dev = true; 368 + 369 + chan_dev->dma_coherent = true; 370 + dma_coerce_mask_and_coherent(chan_dev, DMA_BIT_MASK(48)); 371 + chan_dev->dma_parms = chan_dev->parent->dma_parms; 372 + } else { 373 + dev_warn(chan->device->dev, "Invalid ASEL value: %u\n", asel); 374 + 375 + chan_dev->dma_coherent = false; 376 + chan_dev->dma_parms = NULL; 377 + } 378 + } 379 + 415 380 static void udma_reset_uchan(struct udma_chan *uc) 416 381 { 417 382 memset(&uc->config, 0, sizeof(uc->config)); 418 383 uc->config.remote_thread_id = -1; 384 + uc->config.mapped_channel_id = -1; 385 + uc->config.default_flow_id = -1; 419 386 uc->state = UDMA_CHAN_IS_IDLE; 420 387 } 421 388 ··· 524 439 d->hwdesc[i].cppi5_desc_vaddr = NULL; 525 440 } 526 441 } else if (d->hwdesc[0].cppi5_desc_vaddr) { 527 - struct udma_dev *ud = uc->ud; 528 - 529 - dma_free_coherent(ud->dev, d->hwdesc[0].cppi5_desc_size, 442 + dma_free_coherent(uc->dma_dev, d->hwdesc[0].cppi5_desc_size, 530 443 d->hwdesc[0].cppi5_desc_vaddr, 531 444 d->hwdesc[0].cppi5_desc_paddr); 532 445 ··· 753 670 val = udma_tchanrt_read(uc, UDMA_CHAN_RT_PCNT_REG); 754 671 udma_tchanrt_write(uc, UDMA_CHAN_RT_PCNT_REG, val); 755 672 756 - val = udma_tchanrt_read(uc, UDMA_CHAN_RT_PEER_BCNT_REG); 757 - udma_tchanrt_write(uc, UDMA_CHAN_RT_PEER_BCNT_REG, val); 673 + if (!uc->bchan) { 674 + val = udma_tchanrt_read(uc, UDMA_CHAN_RT_PEER_BCNT_REG); 675 + udma_tchanrt_write(uc, UDMA_CHAN_RT_PEER_BCNT_REG, val); 676 + } 758 677 } 759 678 760 679 if (uc->rchan) { ··· 831 746 { 832 747 struct udma_chan_config *ucc = &uc->config; 833 748 834 - if (ucc->pkt_mode && (uc->cyclic || ucc->dir == DMA_DEV_TO_MEM)) { 749 + if (uc->ud->match_data->type == DMA_TYPE_UDMA && ucc->pkt_mode && 750 + (uc->cyclic || ucc->dir == DMA_DEV_TO_MEM)) { 835 751 int i; 836 752 837 - /* Push all descriptors to ring for packet mode cyclic or RX */ 753 + /* 754 + * UDMA only: Push all descriptors to ring for packet mode 755 + * cyclic or RX 756 + * PKTDMA supports pre-linked descriptor and cyclic is not 757 + * supported 758 + */ 838 759 for (i = 0; i < uc->desc->sglen; i++) 839 760 udma_push_to_ring(uc, i); 840 761 } else { ··· 1111 1020 { 1112 1021 struct udma_chan *uc = data; 1113 1022 struct udma_desc *d; 1114 - unsigned long flags; 1115 1023 dma_addr_t paddr = 0; 1116 1024 1117 1025 if (udma_pop_from_ring(uc, &paddr) || !paddr) 1118 1026 return IRQ_HANDLED; 1119 1027 1120 - spin_lock_irqsave(&uc->vc.lock, flags); 1028 + spin_lock(&uc->vc.lock); 1121 1029 1122 1030 /* Teardown completion message */ 1123 1031 if (cppi5_desc_is_tdcm(paddr)) { ··· 1167 1077 } 1168 1078 } 1169 1079 out: 1170 - spin_unlock_irqrestore(&uc->vc.lock, flags); 1080 + spin_unlock(&uc->vc.lock); 1171 1081 1172 1082 return IRQ_HANDLED; 1173 1083 } ··· 1176 1086 { 1177 1087 struct udma_chan *uc = data; 1178 1088 struct udma_desc *d; 1179 - unsigned long flags; 1180 1089 1181 - spin_lock_irqsave(&uc->vc.lock, flags); 1090 + spin_lock(&uc->vc.lock); 1182 1091 d = uc->desc; 1183 1092 if (d) { 1184 1093 d->tr_idx = (d->tr_idx + 1) % d->sglen; ··· 1192 1103 } 1193 1104 } 1194 1105 1195 - spin_unlock_irqrestore(&uc->vc.lock, flags); 1106 + spin_unlock(&uc->vc.lock); 1196 1107 1197 1108 return IRQ_HANDLED; 1198 1109 } ··· 1270 1181 if (test_bit(id, ud->rflow_in_use)) 1271 1182 return ERR_PTR(-ENOENT); 1272 1183 1273 - /* GP rflow has to be allocated first */ 1274 - if (!test_bit(id, ud->rflow_gp_map) && 1275 - !test_bit(id, ud->rflow_gp_map_allocated)) 1276 - return ERR_PTR(-EINVAL); 1184 + if (ud->rflow_gp_map) { 1185 + /* GP rflow has to be allocated first */ 1186 + if (!test_bit(id, ud->rflow_gp_map) && 1187 + !test_bit(id, ud->rflow_gp_map_allocated)) 1188 + return ERR_PTR(-EINVAL); 1189 + } 1277 1190 1278 1191 dev_dbg(ud->dev, "get rflow%d\n", id); 1279 1192 set_bit(id, ud->rflow_in_use); ··· 1306 1215 } else { \ 1307 1216 int start; \ 1308 1217 \ 1309 - if (tpl >= ud->tpl_levels) \ 1310 - tpl = ud->tpl_levels - 1; \ 1218 + if (tpl >= ud->res##_tpl.levels) \ 1219 + tpl = ud->res##_tpl.levels - 1; \ 1311 1220 \ 1312 - start = ud->tpl_start_idx[tpl]; \ 1221 + start = ud->res##_tpl.start_idx[tpl]; \ 1313 1222 \ 1314 1223 id = find_next_zero_bit(ud->res##_map, ud->res##_cnt, \ 1315 1224 start); \ ··· 1322 1231 return &ud->res##s[id]; \ 1323 1232 } 1324 1233 1234 + UDMA_RESERVE_RESOURCE(bchan); 1325 1235 UDMA_RESERVE_RESOURCE(tchan); 1326 1236 UDMA_RESERVE_RESOURCE(rchan); 1237 + 1238 + static int bcdma_get_bchan(struct udma_chan *uc) 1239 + { 1240 + struct udma_dev *ud = uc->ud; 1241 + enum udma_tp_level tpl; 1242 + 1243 + if (uc->bchan) { 1244 + dev_dbg(ud->dev, "chan%d: already have bchan%d allocated\n", 1245 + uc->id, uc->bchan->id); 1246 + return 0; 1247 + } 1248 + 1249 + /* 1250 + * Use normal channels for peripherals, and highest TPL channel for 1251 + * mem2mem 1252 + */ 1253 + if (uc->config.tr_trigger_type) 1254 + tpl = 0; 1255 + else 1256 + tpl = ud->bchan_tpl.levels - 1; 1257 + 1258 + uc->bchan = __udma_reserve_bchan(ud, tpl, -1); 1259 + if (IS_ERR(uc->bchan)) 1260 + return PTR_ERR(uc->bchan); 1261 + 1262 + uc->tchan = uc->bchan; 1263 + 1264 + return 0; 1265 + } 1327 1266 1328 1267 static int udma_get_tchan(struct udma_chan *uc) 1329 1268 { ··· 1365 1244 return 0; 1366 1245 } 1367 1246 1368 - uc->tchan = __udma_reserve_tchan(ud, uc->config.channel_tpl, -1); 1247 + /* 1248 + * mapped_channel_id is -1 for UDMA, BCDMA and PKTDMA unmapped channels. 1249 + * For PKTDMA mapped channels it is configured to a channel which must 1250 + * be used to service the peripheral. 1251 + */ 1252 + uc->tchan = __udma_reserve_tchan(ud, uc->config.channel_tpl, 1253 + uc->config.mapped_channel_id); 1254 + if (IS_ERR(uc->tchan)) 1255 + return PTR_ERR(uc->tchan); 1369 1256 1370 - return PTR_ERR_OR_ZERO(uc->tchan); 1257 + if (ud->tflow_cnt) { 1258 + int tflow_id; 1259 + 1260 + /* Only PKTDMA have support for tx flows */ 1261 + if (uc->config.default_flow_id >= 0) 1262 + tflow_id = uc->config.default_flow_id; 1263 + else 1264 + tflow_id = uc->tchan->id; 1265 + 1266 + if (test_bit(tflow_id, ud->tflow_map)) { 1267 + dev_err(ud->dev, "tflow%d is in use\n", tflow_id); 1268 + clear_bit(uc->tchan->id, ud->tchan_map); 1269 + uc->tchan = NULL; 1270 + return -ENOENT; 1271 + } 1272 + 1273 + uc->tchan->tflow_id = tflow_id; 1274 + set_bit(tflow_id, ud->tflow_map); 1275 + } else { 1276 + uc->tchan->tflow_id = -1; 1277 + } 1278 + 1279 + return 0; 1371 1280 } 1372 1281 1373 1282 static int udma_get_rchan(struct udma_chan *uc) ··· 1410 1259 return 0; 1411 1260 } 1412 1261 1413 - uc->rchan = __udma_reserve_rchan(ud, uc->config.channel_tpl, -1); 1262 + /* 1263 + * mapped_channel_id is -1 for UDMA, BCDMA and PKTDMA unmapped channels. 1264 + * For PKTDMA mapped channels it is configured to a channel which must 1265 + * be used to service the peripheral. 1266 + */ 1267 + uc->rchan = __udma_reserve_rchan(ud, uc->config.channel_tpl, 1268 + uc->config.mapped_channel_id); 1414 1269 1415 1270 return PTR_ERR_OR_ZERO(uc->rchan); 1416 1271 } ··· 1444 1287 1445 1288 /* Can be optimized, but let's have it like this for now */ 1446 1289 end = min(ud->tchan_cnt, ud->rchan_cnt); 1447 - /* Try to use the highest TPL channel pair for MEM_TO_MEM channels */ 1448 - chan_id = ud->tpl_start_idx[ud->tpl_levels - 1]; 1290 + /* 1291 + * Try to use the highest TPL channel pair for MEM_TO_MEM channels 1292 + * Note: in UDMAP the channel TPL is symmetric between tchan and rchan 1293 + */ 1294 + chan_id = ud->tchan_tpl.start_idx[ud->tchan_tpl.levels - 1]; 1449 1295 for (; chan_id < end; chan_id++) { 1450 1296 if (!test_bit(chan_id, ud->tchan_map) && 1451 1297 !test_bit(chan_id, ud->rchan_map)) ··· 1462 1302 set_bit(chan_id, ud->rchan_map); 1463 1303 uc->tchan = &ud->tchans[chan_id]; 1464 1304 uc->rchan = &ud->rchans[chan_id]; 1305 + 1306 + /* UDMA does not use tx flows */ 1307 + uc->tchan->tflow_id = -1; 1465 1308 1466 1309 return 0; 1467 1310 } ··· 1489 1326 return PTR_ERR_OR_ZERO(uc->rflow); 1490 1327 } 1491 1328 1329 + static void bcdma_put_bchan(struct udma_chan *uc) 1330 + { 1331 + struct udma_dev *ud = uc->ud; 1332 + 1333 + if (uc->bchan) { 1334 + dev_dbg(ud->dev, "chan%d: put bchan%d\n", uc->id, 1335 + uc->bchan->id); 1336 + clear_bit(uc->bchan->id, ud->bchan_map); 1337 + uc->bchan = NULL; 1338 + uc->tchan = NULL; 1339 + } 1340 + } 1341 + 1492 1342 static void udma_put_rchan(struct udma_chan *uc) 1493 1343 { 1494 1344 struct udma_dev *ud = uc->ud; ··· 1522 1346 dev_dbg(ud->dev, "chan%d: put tchan%d\n", uc->id, 1523 1347 uc->tchan->id); 1524 1348 clear_bit(uc->tchan->id, ud->tchan_map); 1349 + 1350 + if (uc->tchan->tflow_id >= 0) 1351 + clear_bit(uc->tchan->tflow_id, ud->tflow_map); 1352 + 1525 1353 uc->tchan = NULL; 1526 1354 } 1527 1355 } ··· 1540 1360 __udma_put_rflow(ud, uc->rflow); 1541 1361 uc->rflow = NULL; 1542 1362 } 1363 + } 1364 + 1365 + static void bcdma_free_bchan_resources(struct udma_chan *uc) 1366 + { 1367 + if (!uc->bchan) 1368 + return; 1369 + 1370 + k3_ringacc_ring_free(uc->bchan->tc_ring); 1371 + k3_ringacc_ring_free(uc->bchan->t_ring); 1372 + uc->bchan->tc_ring = NULL; 1373 + uc->bchan->t_ring = NULL; 1374 + k3_configure_chan_coherency(&uc->vc.chan, 0); 1375 + 1376 + bcdma_put_bchan(uc); 1377 + } 1378 + 1379 + static int bcdma_alloc_bchan_resources(struct udma_chan *uc) 1380 + { 1381 + struct k3_ring_cfg ring_cfg; 1382 + struct udma_dev *ud = uc->ud; 1383 + int ret; 1384 + 1385 + ret = bcdma_get_bchan(uc); 1386 + if (ret) 1387 + return ret; 1388 + 1389 + ret = k3_ringacc_request_rings_pair(ud->ringacc, uc->bchan->id, -1, 1390 + &uc->bchan->t_ring, 1391 + &uc->bchan->tc_ring); 1392 + if (ret) { 1393 + ret = -EBUSY; 1394 + goto err_ring; 1395 + } 1396 + 1397 + memset(&ring_cfg, 0, sizeof(ring_cfg)); 1398 + ring_cfg.size = K3_UDMA_DEFAULT_RING_SIZE; 1399 + ring_cfg.elm_size = K3_RINGACC_RING_ELSIZE_8; 1400 + ring_cfg.mode = K3_RINGACC_RING_MODE_RING; 1401 + 1402 + k3_configure_chan_coherency(&uc->vc.chan, ud->asel); 1403 + ring_cfg.asel = ud->asel; 1404 + ring_cfg.dma_dev = dmaengine_get_dma_device(&uc->vc.chan); 1405 + 1406 + ret = k3_ringacc_ring_cfg(uc->bchan->t_ring, &ring_cfg); 1407 + if (ret) 1408 + goto err_ringcfg; 1409 + 1410 + return 0; 1411 + 1412 + err_ringcfg: 1413 + k3_ringacc_ring_free(uc->bchan->tc_ring); 1414 + uc->bchan->tc_ring = NULL; 1415 + k3_ringacc_ring_free(uc->bchan->t_ring); 1416 + uc->bchan->t_ring = NULL; 1417 + k3_configure_chan_coherency(&uc->vc.chan, 0); 1418 + err_ring: 1419 + bcdma_put_bchan(uc); 1420 + 1421 + return ret; 1543 1422 } 1544 1423 1545 1424 static void udma_free_tx_resources(struct udma_chan *uc) ··· 1618 1379 { 1619 1380 struct k3_ring_cfg ring_cfg; 1620 1381 struct udma_dev *ud = uc->ud; 1621 - int ret; 1382 + struct udma_tchan *tchan; 1383 + int ring_idx, ret; 1622 1384 1623 1385 ret = udma_get_tchan(uc); 1624 1386 if (ret) 1625 1387 return ret; 1626 1388 1627 - ret = k3_ringacc_request_rings_pair(ud->ringacc, uc->tchan->id, -1, 1628 - &uc->tchan->t_ring, 1629 - &uc->tchan->tc_ring); 1389 + tchan = uc->tchan; 1390 + if (tchan->tflow_id >= 0) 1391 + ring_idx = tchan->tflow_id; 1392 + else 1393 + ring_idx = ud->bchan_cnt + tchan->id; 1394 + 1395 + ret = k3_ringacc_request_rings_pair(ud->ringacc, ring_idx, -1, 1396 + &tchan->t_ring, 1397 + &tchan->tc_ring); 1630 1398 if (ret) { 1631 1399 ret = -EBUSY; 1632 1400 goto err_ring; ··· 1642 1396 memset(&ring_cfg, 0, sizeof(ring_cfg)); 1643 1397 ring_cfg.size = K3_UDMA_DEFAULT_RING_SIZE; 1644 1398 ring_cfg.elm_size = K3_RINGACC_RING_ELSIZE_8; 1645 - ring_cfg.mode = K3_RINGACC_RING_MODE_MESSAGE; 1399 + if (ud->match_data->type == DMA_TYPE_UDMA) { 1400 + ring_cfg.mode = K3_RINGACC_RING_MODE_MESSAGE; 1401 + } else { 1402 + ring_cfg.mode = K3_RINGACC_RING_MODE_RING; 1646 1403 1647 - ret = k3_ringacc_ring_cfg(uc->tchan->t_ring, &ring_cfg); 1648 - ret |= k3_ringacc_ring_cfg(uc->tchan->tc_ring, &ring_cfg); 1404 + k3_configure_chan_coherency(&uc->vc.chan, uc->config.asel); 1405 + ring_cfg.asel = uc->config.asel; 1406 + ring_cfg.dma_dev = dmaengine_get_dma_device(&uc->vc.chan); 1407 + } 1408 + 1409 + ret = k3_ringacc_ring_cfg(tchan->t_ring, &ring_cfg); 1410 + ret |= k3_ringacc_ring_cfg(tchan->tc_ring, &ring_cfg); 1649 1411 1650 1412 if (ret) 1651 1413 goto err_ringcfg; ··· 1706 1452 if (uc->config.dir == DMA_MEM_TO_MEM) 1707 1453 return 0; 1708 1454 1709 - ret = udma_get_rflow(uc, uc->rchan->id); 1455 + if (uc->config.default_flow_id >= 0) 1456 + ret = udma_get_rflow(uc, uc->config.default_flow_id); 1457 + else 1458 + ret = udma_get_rflow(uc, uc->rchan->id); 1459 + 1710 1460 if (ret) { 1711 1461 ret = -EBUSY; 1712 1462 goto err_rflow; 1713 1463 } 1714 1464 1715 1465 rflow = uc->rflow; 1716 - fd_ring_id = ud->tchan_cnt + ud->echan_cnt + uc->rchan->id; 1466 + if (ud->tflow_cnt) 1467 + fd_ring_id = ud->tflow_cnt + rflow->id; 1468 + else 1469 + fd_ring_id = ud->bchan_cnt + ud->tchan_cnt + ud->echan_cnt + 1470 + uc->rchan->id; 1471 + 1717 1472 ret = k3_ringacc_request_rings_pair(ud->ringacc, fd_ring_id, -1, 1718 1473 &rflow->fd_ring, &rflow->r_ring); 1719 1474 if (ret) { ··· 1732 1469 1733 1470 memset(&ring_cfg, 0, sizeof(ring_cfg)); 1734 1471 1735 - if (uc->config.pkt_mode) 1736 - ring_cfg.size = SG_MAX_SEGMENTS; 1737 - else 1738 - ring_cfg.size = K3_UDMA_DEFAULT_RING_SIZE; 1739 - 1740 1472 ring_cfg.elm_size = K3_RINGACC_RING_ELSIZE_8; 1741 - ring_cfg.mode = K3_RINGACC_RING_MODE_MESSAGE; 1473 + if (ud->match_data->type == DMA_TYPE_UDMA) { 1474 + if (uc->config.pkt_mode) 1475 + ring_cfg.size = SG_MAX_SEGMENTS; 1476 + else 1477 + ring_cfg.size = K3_UDMA_DEFAULT_RING_SIZE; 1478 + 1479 + ring_cfg.mode = K3_RINGACC_RING_MODE_MESSAGE; 1480 + } else { 1481 + ring_cfg.size = K3_UDMA_DEFAULT_RING_SIZE; 1482 + ring_cfg.mode = K3_RINGACC_RING_MODE_RING; 1483 + 1484 + k3_configure_chan_coherency(&uc->vc.chan, uc->config.asel); 1485 + ring_cfg.asel = uc->config.asel; 1486 + ring_cfg.dma_dev = dmaengine_get_dma_device(&uc->vc.chan); 1487 + } 1742 1488 1743 1489 ret = k3_ringacc_ring_cfg(rflow->fd_ring, &ring_cfg); 1490 + 1744 1491 ring_cfg.size = K3_UDMA_DEFAULT_RING_SIZE; 1745 1492 ret |= k3_ringacc_ring_cfg(rflow->r_ring, &ring_cfg); 1746 1493 ··· 1772 1499 return ret; 1773 1500 } 1774 1501 1775 - #define TISCI_TCHAN_VALID_PARAMS ( \ 1502 + #define TISCI_BCDMA_BCHAN_VALID_PARAMS ( \ 1503 + TI_SCI_MSG_VALUE_RM_UDMAP_CH_PAUSE_ON_ERR_VALID | \ 1504 + TI_SCI_MSG_VALUE_RM_UDMAP_CH_EXTENDED_CH_TYPE_VALID) 1505 + 1506 + #define TISCI_BCDMA_TCHAN_VALID_PARAMS ( \ 1507 + TI_SCI_MSG_VALUE_RM_UDMAP_CH_PAUSE_ON_ERR_VALID | \ 1508 + TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_SUPR_TDPKT_VALID) 1509 + 1510 + #define TISCI_BCDMA_RCHAN_VALID_PARAMS ( \ 1511 + TI_SCI_MSG_VALUE_RM_UDMAP_CH_PAUSE_ON_ERR_VALID) 1512 + 1513 + #define TISCI_UDMA_TCHAN_VALID_PARAMS ( \ 1776 1514 TI_SCI_MSG_VALUE_RM_UDMAP_CH_PAUSE_ON_ERR_VALID | \ 1777 1515 TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_FILT_EINFO_VALID | \ 1778 1516 TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_FILT_PSWORDS_VALID | \ ··· 1793 1509 TI_SCI_MSG_VALUE_RM_UDMAP_CH_CQ_QNUM_VALID | \ 1794 1510 TI_SCI_MSG_VALUE_RM_UDMAP_CH_ATYPE_VALID) 1795 1511 1796 - #define TISCI_RCHAN_VALID_PARAMS ( \ 1512 + #define TISCI_UDMA_RCHAN_VALID_PARAMS ( \ 1797 1513 TI_SCI_MSG_VALUE_RM_UDMAP_CH_PAUSE_ON_ERR_VALID | \ 1798 1514 TI_SCI_MSG_VALUE_RM_UDMAP_CH_FETCH_SIZE_VALID | \ 1799 1515 TI_SCI_MSG_VALUE_RM_UDMAP_CH_CQ_QNUM_VALID | \ ··· 1818 1534 struct ti_sci_msg_rm_udmap_tx_ch_cfg req_tx = { 0 }; 1819 1535 struct ti_sci_msg_rm_udmap_rx_ch_cfg req_rx = { 0 }; 1820 1536 1821 - req_tx.valid_params = TISCI_TCHAN_VALID_PARAMS; 1537 + req_tx.valid_params = TISCI_UDMA_TCHAN_VALID_PARAMS; 1822 1538 req_tx.nav_id = tisci_rm->tisci_dev_id; 1823 1539 req_tx.index = tchan->id; 1824 1540 req_tx.tx_chan_type = TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_BCOPY_PBRR; ··· 1832 1548 return ret; 1833 1549 } 1834 1550 1835 - req_rx.valid_params = TISCI_RCHAN_VALID_PARAMS; 1551 + req_rx.valid_params = TISCI_UDMA_RCHAN_VALID_PARAMS; 1836 1552 req_rx.nav_id = tisci_rm->tisci_dev_id; 1837 1553 req_rx.index = rchan->id; 1838 1554 req_rx.rx_fetch_size = sizeof(struct cppi5_desc_hdr_t) >> 2; ··· 1843 1559 ret = tisci_ops->rx_ch_cfg(tisci_rm->tisci, &req_rx); 1844 1560 if (ret) 1845 1561 dev_err(ud->dev, "rchan%d alloc failed %d\n", rchan->id, ret); 1562 + 1563 + return ret; 1564 + } 1565 + 1566 + static int bcdma_tisci_m2m_channel_config(struct udma_chan *uc) 1567 + { 1568 + struct udma_dev *ud = uc->ud; 1569 + struct udma_tisci_rm *tisci_rm = &ud->tisci_rm; 1570 + const struct ti_sci_rm_udmap_ops *tisci_ops = tisci_rm->tisci_udmap_ops; 1571 + struct ti_sci_msg_rm_udmap_tx_ch_cfg req_tx = { 0 }; 1572 + struct udma_bchan *bchan = uc->bchan; 1573 + int ret = 0; 1574 + 1575 + req_tx.valid_params = TISCI_BCDMA_BCHAN_VALID_PARAMS; 1576 + req_tx.nav_id = tisci_rm->tisci_dev_id; 1577 + req_tx.extended_ch_type = TI_SCI_RM_BCDMA_EXTENDED_CH_TYPE_BCHAN; 1578 + req_tx.index = bchan->id; 1579 + 1580 + ret = tisci_ops->tx_ch_cfg(tisci_rm->tisci, &req_tx); 1581 + if (ret) 1582 + dev_err(ud->dev, "bchan%d cfg failed %d\n", bchan->id, ret); 1846 1583 1847 1584 return ret; 1848 1585 } ··· 1888 1583 fetch_size = sizeof(struct cppi5_desc_hdr_t); 1889 1584 } 1890 1585 1891 - req_tx.valid_params = TISCI_TCHAN_VALID_PARAMS; 1586 + req_tx.valid_params = TISCI_UDMA_TCHAN_VALID_PARAMS; 1892 1587 req_tx.nav_id = tisci_rm->tisci_dev_id; 1893 1588 req_tx.index = tchan->id; 1894 1589 req_tx.tx_chan_type = mode; ··· 1896 1591 req_tx.tx_fetch_size = fetch_size >> 2; 1897 1592 req_tx.txcq_qnum = tc_ring; 1898 1593 req_tx.tx_atype = uc->config.atype; 1594 + if (uc->config.ep_type == PSIL_EP_PDMA_XY && 1595 + ud->match_data->flags & UDMA_FLAG_TDTYPE) { 1596 + /* wait for peer to complete the teardown for PDMAs */ 1597 + req_tx.valid_params |= 1598 + TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_TDTYPE_VALID; 1599 + req_tx.tx_tdtype = 1; 1600 + } 1899 1601 1900 1602 ret = tisci_ops->tx_ch_cfg(tisci_rm->tisci, &req_tx); 1901 1603 if (ret) ··· 1910 1598 1911 1599 return ret; 1912 1600 } 1601 + 1602 + static int bcdma_tisci_tx_channel_config(struct udma_chan *uc) 1603 + { 1604 + struct udma_dev *ud = uc->ud; 1605 + struct udma_tisci_rm *tisci_rm = &ud->tisci_rm; 1606 + const struct ti_sci_rm_udmap_ops *tisci_ops = tisci_rm->tisci_udmap_ops; 1607 + struct udma_tchan *tchan = uc->tchan; 1608 + struct ti_sci_msg_rm_udmap_tx_ch_cfg req_tx = { 0 }; 1609 + int ret = 0; 1610 + 1611 + req_tx.valid_params = TISCI_BCDMA_TCHAN_VALID_PARAMS; 1612 + req_tx.nav_id = tisci_rm->tisci_dev_id; 1613 + req_tx.index = tchan->id; 1614 + req_tx.tx_supr_tdpkt = uc->config.notdpkt; 1615 + if (ud->match_data->flags & UDMA_FLAG_TDTYPE) { 1616 + /* wait for peer to complete the teardown for PDMAs */ 1617 + req_tx.valid_params |= 1618 + TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_TDTYPE_VALID; 1619 + req_tx.tx_tdtype = 1; 1620 + } 1621 + 1622 + ret = tisci_ops->tx_ch_cfg(tisci_rm->tisci, &req_tx); 1623 + if (ret) 1624 + dev_err(ud->dev, "tchan%d cfg failed %d\n", tchan->id, ret); 1625 + 1626 + return ret; 1627 + } 1628 + 1629 + #define pktdma_tisci_tx_channel_config bcdma_tisci_tx_channel_config 1913 1630 1914 1631 static int udma_tisci_rx_channel_config(struct udma_chan *uc) 1915 1632 { ··· 1962 1621 fetch_size = sizeof(struct cppi5_desc_hdr_t); 1963 1622 } 1964 1623 1965 - req_rx.valid_params = TISCI_RCHAN_VALID_PARAMS; 1624 + req_rx.valid_params = TISCI_UDMA_RCHAN_VALID_PARAMS; 1966 1625 req_rx.nav_id = tisci_rm->tisci_dev_id; 1967 1626 req_rx.index = rchan->id; 1968 1627 req_rx.rx_fetch_size = fetch_size >> 2; ··· 2021 1680 return 0; 2022 1681 } 2023 1682 1683 + static int bcdma_tisci_rx_channel_config(struct udma_chan *uc) 1684 + { 1685 + struct udma_dev *ud = uc->ud; 1686 + struct udma_tisci_rm *tisci_rm = &ud->tisci_rm; 1687 + const struct ti_sci_rm_udmap_ops *tisci_ops = tisci_rm->tisci_udmap_ops; 1688 + struct udma_rchan *rchan = uc->rchan; 1689 + struct ti_sci_msg_rm_udmap_rx_ch_cfg req_rx = { 0 }; 1690 + int ret = 0; 1691 + 1692 + req_rx.valid_params = TISCI_BCDMA_RCHAN_VALID_PARAMS; 1693 + req_rx.nav_id = tisci_rm->tisci_dev_id; 1694 + req_rx.index = rchan->id; 1695 + 1696 + ret = tisci_ops->rx_ch_cfg(tisci_rm->tisci, &req_rx); 1697 + if (ret) 1698 + dev_err(ud->dev, "rchan%d cfg failed %d\n", rchan->id, ret); 1699 + 1700 + return ret; 1701 + } 1702 + 1703 + static int pktdma_tisci_rx_channel_config(struct udma_chan *uc) 1704 + { 1705 + struct udma_dev *ud = uc->ud; 1706 + struct udma_tisci_rm *tisci_rm = &ud->tisci_rm; 1707 + const struct ti_sci_rm_udmap_ops *tisci_ops = tisci_rm->tisci_udmap_ops; 1708 + struct ti_sci_msg_rm_udmap_rx_ch_cfg req_rx = { 0 }; 1709 + struct ti_sci_msg_rm_udmap_flow_cfg flow_req = { 0 }; 1710 + int ret = 0; 1711 + 1712 + req_rx.valid_params = TISCI_BCDMA_RCHAN_VALID_PARAMS; 1713 + req_rx.nav_id = tisci_rm->tisci_dev_id; 1714 + req_rx.index = uc->rchan->id; 1715 + 1716 + ret = tisci_ops->rx_ch_cfg(tisci_rm->tisci, &req_rx); 1717 + if (ret) { 1718 + dev_err(ud->dev, "rchan%d cfg failed %d\n", uc->rchan->id, ret); 1719 + return ret; 1720 + } 1721 + 1722 + flow_req.valid_params = 1723 + TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_EINFO_PRESENT_VALID | 1724 + TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_PSINFO_PRESENT_VALID | 1725 + TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_ERROR_HANDLING_VALID; 1726 + 1727 + flow_req.nav_id = tisci_rm->tisci_dev_id; 1728 + flow_req.flow_index = uc->rflow->id; 1729 + 1730 + if (uc->config.needs_epib) 1731 + flow_req.rx_einfo_present = 1; 1732 + else 1733 + flow_req.rx_einfo_present = 0; 1734 + if (uc->config.psd_size) 1735 + flow_req.rx_psinfo_present = 1; 1736 + else 1737 + flow_req.rx_psinfo_present = 0; 1738 + flow_req.rx_error_handling = 1; 1739 + 1740 + ret = tisci_ops->rx_flow_cfg(tisci_rm->tisci, &flow_req); 1741 + 1742 + if (ret) 1743 + dev_err(ud->dev, "flow%d config failed: %d\n", uc->rflow->id, 1744 + ret); 1745 + 1746 + return ret; 1747 + } 1748 + 2024 1749 static int udma_alloc_chan_resources(struct dma_chan *chan) 2025 1750 { 2026 1751 struct udma_chan *uc = to_udma_chan(chan); ··· 2095 1688 struct k3_ring *irq_ring; 2096 1689 u32 irq_udma_idx; 2097 1690 int ret; 1691 + 1692 + uc->dma_dev = ud->dev; 2098 1693 2099 1694 if (uc->config.pkt_mode || uc->config.dir == DMA_MEM_TO_MEM) { 2100 1695 uc->use_dma_pool = true; ··· 2193 1784 K3_PSIL_DST_THREAD_ID_OFFSET; 2194 1785 2195 1786 irq_ring = uc->rflow->r_ring; 2196 - irq_udma_idx = soc_data->rchan_oes_offset + uc->rchan->id; 1787 + irq_udma_idx = soc_data->oes.udma_rchan + uc->rchan->id; 2197 1788 2198 1789 ret = udma_tisci_rx_channel_config(uc); 2199 1790 break; ··· 2289 1880 dma_pool_destroy(uc->hdesc_pool); 2290 1881 uc->use_dma_pool = false; 2291 1882 } 1883 + 1884 + return ret; 1885 + } 1886 + 1887 + static int bcdma_alloc_chan_resources(struct dma_chan *chan) 1888 + { 1889 + struct udma_chan *uc = to_udma_chan(chan); 1890 + struct udma_dev *ud = to_udma_dev(chan->device); 1891 + const struct udma_oes_offsets *oes = &ud->soc_data->oes; 1892 + u32 irq_udma_idx, irq_ring_idx; 1893 + int ret; 1894 + 1895 + /* Only TR mode is supported */ 1896 + uc->config.pkt_mode = false; 1897 + 1898 + /* 1899 + * Make sure that the completion is in a known state: 1900 + * No teardown, the channel is idle 1901 + */ 1902 + reinit_completion(&uc->teardown_completed); 1903 + complete_all(&uc->teardown_completed); 1904 + uc->state = UDMA_CHAN_IS_IDLE; 1905 + 1906 + switch (uc->config.dir) { 1907 + case DMA_MEM_TO_MEM: 1908 + /* Non synchronized - mem to mem type of transfer */ 1909 + dev_dbg(uc->ud->dev, "%s: chan%d as MEM-to-MEM\n", __func__, 1910 + uc->id); 1911 + 1912 + ret = bcdma_alloc_bchan_resources(uc); 1913 + if (ret) 1914 + return ret; 1915 + 1916 + irq_ring_idx = uc->bchan->id + oes->bcdma_bchan_ring; 1917 + irq_udma_idx = uc->bchan->id + oes->bcdma_bchan_data; 1918 + 1919 + ret = bcdma_tisci_m2m_channel_config(uc); 1920 + break; 1921 + case DMA_MEM_TO_DEV: 1922 + /* Slave transfer synchronized - mem to dev (TX) trasnfer */ 1923 + dev_dbg(uc->ud->dev, "%s: chan%d as MEM-to-DEV\n", __func__, 1924 + uc->id); 1925 + 1926 + ret = udma_alloc_tx_resources(uc); 1927 + if (ret) { 1928 + uc->config.remote_thread_id = -1; 1929 + return ret; 1930 + } 1931 + 1932 + uc->config.src_thread = ud->psil_base + uc->tchan->id; 1933 + uc->config.dst_thread = uc->config.remote_thread_id; 1934 + uc->config.dst_thread |= K3_PSIL_DST_THREAD_ID_OFFSET; 1935 + 1936 + irq_ring_idx = uc->tchan->id + oes->bcdma_tchan_ring; 1937 + irq_udma_idx = uc->tchan->id + oes->bcdma_tchan_data; 1938 + 1939 + ret = bcdma_tisci_tx_channel_config(uc); 1940 + break; 1941 + case DMA_DEV_TO_MEM: 1942 + /* Slave transfer synchronized - dev to mem (RX) trasnfer */ 1943 + dev_dbg(uc->ud->dev, "%s: chan%d as DEV-to-MEM\n", __func__, 1944 + uc->id); 1945 + 1946 + ret = udma_alloc_rx_resources(uc); 1947 + if (ret) { 1948 + uc->config.remote_thread_id = -1; 1949 + return ret; 1950 + } 1951 + 1952 + uc->config.src_thread = uc->config.remote_thread_id; 1953 + uc->config.dst_thread = (ud->psil_base + uc->rchan->id) | 1954 + K3_PSIL_DST_THREAD_ID_OFFSET; 1955 + 1956 + irq_ring_idx = uc->rchan->id + oes->bcdma_rchan_ring; 1957 + irq_udma_idx = uc->rchan->id + oes->bcdma_rchan_data; 1958 + 1959 + ret = bcdma_tisci_rx_channel_config(uc); 1960 + break; 1961 + default: 1962 + /* Can not happen */ 1963 + dev_err(uc->ud->dev, "%s: chan%d invalid direction (%u)\n", 1964 + __func__, uc->id, uc->config.dir); 1965 + return -EINVAL; 1966 + } 1967 + 1968 + /* check if the channel configuration was successful */ 1969 + if (ret) 1970 + goto err_res_free; 1971 + 1972 + if (udma_is_chan_running(uc)) { 1973 + dev_warn(ud->dev, "chan%d: is running!\n", uc->id); 1974 + udma_reset_chan(uc, false); 1975 + if (udma_is_chan_running(uc)) { 1976 + dev_err(ud->dev, "chan%d: won't stop!\n", uc->id); 1977 + ret = -EBUSY; 1978 + goto err_res_free; 1979 + } 1980 + } 1981 + 1982 + uc->dma_dev = dmaengine_get_dma_device(chan); 1983 + if (uc->config.dir == DMA_MEM_TO_MEM && !uc->config.tr_trigger_type) { 1984 + uc->config.hdesc_size = cppi5_trdesc_calc_size( 1985 + sizeof(struct cppi5_tr_type15_t), 2); 1986 + 1987 + uc->hdesc_pool = dma_pool_create(uc->name, ud->ddev.dev, 1988 + uc->config.hdesc_size, 1989 + ud->desc_align, 1990 + 0); 1991 + if (!uc->hdesc_pool) { 1992 + dev_err(ud->ddev.dev, 1993 + "Descriptor pool allocation failed\n"); 1994 + uc->use_dma_pool = false; 1995 + return -ENOMEM; 1996 + } 1997 + 1998 + uc->use_dma_pool = true; 1999 + } else if (uc->config.dir != DMA_MEM_TO_MEM) { 2000 + /* PSI-L pairing */ 2001 + ret = navss_psil_pair(ud, uc->config.src_thread, 2002 + uc->config.dst_thread); 2003 + if (ret) { 2004 + dev_err(ud->dev, 2005 + "PSI-L pairing failed: 0x%04x -> 0x%04x\n", 2006 + uc->config.src_thread, uc->config.dst_thread); 2007 + goto err_res_free; 2008 + } 2009 + 2010 + uc->psil_paired = true; 2011 + } 2012 + 2013 + uc->irq_num_ring = ti_sci_inta_msi_get_virq(ud->dev, irq_ring_idx); 2014 + if (uc->irq_num_ring <= 0) { 2015 + dev_err(ud->dev, "Failed to get ring irq (index: %u)\n", 2016 + irq_ring_idx); 2017 + ret = -EINVAL; 2018 + goto err_psi_free; 2019 + } 2020 + 2021 + ret = request_irq(uc->irq_num_ring, udma_ring_irq_handler, 2022 + IRQF_TRIGGER_HIGH, uc->name, uc); 2023 + if (ret) { 2024 + dev_err(ud->dev, "chan%d: ring irq request failed\n", uc->id); 2025 + goto err_irq_free; 2026 + } 2027 + 2028 + /* Event from BCDMA (TR events) only needed for slave channels */ 2029 + if (is_slave_direction(uc->config.dir)) { 2030 + uc->irq_num_udma = ti_sci_inta_msi_get_virq(ud->dev, 2031 + irq_udma_idx); 2032 + if (uc->irq_num_udma <= 0) { 2033 + dev_err(ud->dev, "Failed to get bcdma irq (index: %u)\n", 2034 + irq_udma_idx); 2035 + free_irq(uc->irq_num_ring, uc); 2036 + ret = -EINVAL; 2037 + goto err_irq_free; 2038 + } 2039 + 2040 + ret = request_irq(uc->irq_num_udma, udma_udma_irq_handler, 0, 2041 + uc->name, uc); 2042 + if (ret) { 2043 + dev_err(ud->dev, "chan%d: BCDMA irq request failed\n", 2044 + uc->id); 2045 + free_irq(uc->irq_num_ring, uc); 2046 + goto err_irq_free; 2047 + } 2048 + } else { 2049 + uc->irq_num_udma = 0; 2050 + } 2051 + 2052 + udma_reset_rings(uc); 2053 + 2054 + INIT_DELAYED_WORK_ONSTACK(&uc->tx_drain.work, 2055 + udma_check_tx_completion); 2056 + return 0; 2057 + 2058 + err_irq_free: 2059 + uc->irq_num_ring = 0; 2060 + uc->irq_num_udma = 0; 2061 + err_psi_free: 2062 + if (uc->psil_paired) 2063 + navss_psil_unpair(ud, uc->config.src_thread, 2064 + uc->config.dst_thread); 2065 + uc->psil_paired = false; 2066 + err_res_free: 2067 + bcdma_free_bchan_resources(uc); 2068 + udma_free_tx_resources(uc); 2069 + udma_free_rx_resources(uc); 2070 + 2071 + udma_reset_uchan(uc); 2072 + 2073 + if (uc->use_dma_pool) { 2074 + dma_pool_destroy(uc->hdesc_pool); 2075 + uc->use_dma_pool = false; 2076 + } 2077 + 2078 + return ret; 2079 + } 2080 + 2081 + static int bcdma_router_config(struct dma_chan *chan) 2082 + { 2083 + struct k3_event_route_data *router_data = chan->route_data; 2084 + struct udma_chan *uc = to_udma_chan(chan); 2085 + u32 trigger_event; 2086 + 2087 + if (!uc->bchan) 2088 + return -EINVAL; 2089 + 2090 + if (uc->config.tr_trigger_type != 1 && uc->config.tr_trigger_type != 2) 2091 + return -EINVAL; 2092 + 2093 + trigger_event = uc->ud->soc_data->bcdma_trigger_event_offset; 2094 + trigger_event += (uc->bchan->id * 2) + uc->config.tr_trigger_type - 1; 2095 + 2096 + return router_data->set_event(router_data->priv, trigger_event); 2097 + } 2098 + 2099 + static int pktdma_alloc_chan_resources(struct dma_chan *chan) 2100 + { 2101 + struct udma_chan *uc = to_udma_chan(chan); 2102 + struct udma_dev *ud = to_udma_dev(chan->device); 2103 + const struct udma_oes_offsets *oes = &ud->soc_data->oes; 2104 + u32 irq_ring_idx; 2105 + int ret; 2106 + 2107 + /* 2108 + * Make sure that the completion is in a known state: 2109 + * No teardown, the channel is idle 2110 + */ 2111 + reinit_completion(&uc->teardown_completed); 2112 + complete_all(&uc->teardown_completed); 2113 + uc->state = UDMA_CHAN_IS_IDLE; 2114 + 2115 + switch (uc->config.dir) { 2116 + case DMA_MEM_TO_DEV: 2117 + /* Slave transfer synchronized - mem to dev (TX) trasnfer */ 2118 + dev_dbg(uc->ud->dev, "%s: chan%d as MEM-to-DEV\n", __func__, 2119 + uc->id); 2120 + 2121 + ret = udma_alloc_tx_resources(uc); 2122 + if (ret) { 2123 + uc->config.remote_thread_id = -1; 2124 + return ret; 2125 + } 2126 + 2127 + uc->config.src_thread = ud->psil_base + uc->tchan->id; 2128 + uc->config.dst_thread = uc->config.remote_thread_id; 2129 + uc->config.dst_thread |= K3_PSIL_DST_THREAD_ID_OFFSET; 2130 + 2131 + irq_ring_idx = uc->tchan->tflow_id + oes->pktdma_tchan_flow; 2132 + 2133 + ret = pktdma_tisci_tx_channel_config(uc); 2134 + break; 2135 + case DMA_DEV_TO_MEM: 2136 + /* Slave transfer synchronized - dev to mem (RX) trasnfer */ 2137 + dev_dbg(uc->ud->dev, "%s: chan%d as DEV-to-MEM\n", __func__, 2138 + uc->id); 2139 + 2140 + ret = udma_alloc_rx_resources(uc); 2141 + if (ret) { 2142 + uc->config.remote_thread_id = -1; 2143 + return ret; 2144 + } 2145 + 2146 + uc->config.src_thread = uc->config.remote_thread_id; 2147 + uc->config.dst_thread = (ud->psil_base + uc->rchan->id) | 2148 + K3_PSIL_DST_THREAD_ID_OFFSET; 2149 + 2150 + irq_ring_idx = uc->rflow->id + oes->pktdma_rchan_flow; 2151 + 2152 + ret = pktdma_tisci_rx_channel_config(uc); 2153 + break; 2154 + default: 2155 + /* Can not happen */ 2156 + dev_err(uc->ud->dev, "%s: chan%d invalid direction (%u)\n", 2157 + __func__, uc->id, uc->config.dir); 2158 + return -EINVAL; 2159 + } 2160 + 2161 + /* check if the channel configuration was successful */ 2162 + if (ret) 2163 + goto err_res_free; 2164 + 2165 + if (udma_is_chan_running(uc)) { 2166 + dev_warn(ud->dev, "chan%d: is running!\n", uc->id); 2167 + udma_reset_chan(uc, false); 2168 + if (udma_is_chan_running(uc)) { 2169 + dev_err(ud->dev, "chan%d: won't stop!\n", uc->id); 2170 + ret = -EBUSY; 2171 + goto err_res_free; 2172 + } 2173 + } 2174 + 2175 + uc->dma_dev = dmaengine_get_dma_device(chan); 2176 + uc->hdesc_pool = dma_pool_create(uc->name, uc->dma_dev, 2177 + uc->config.hdesc_size, ud->desc_align, 2178 + 0); 2179 + if (!uc->hdesc_pool) { 2180 + dev_err(ud->ddev.dev, 2181 + "Descriptor pool allocation failed\n"); 2182 + uc->use_dma_pool = false; 2183 + ret = -ENOMEM; 2184 + goto err_res_free; 2185 + } 2186 + 2187 + uc->use_dma_pool = true; 2188 + 2189 + /* PSI-L pairing */ 2190 + ret = navss_psil_pair(ud, uc->config.src_thread, uc->config.dst_thread); 2191 + if (ret) { 2192 + dev_err(ud->dev, "PSI-L pairing failed: 0x%04x -> 0x%04x\n", 2193 + uc->config.src_thread, uc->config.dst_thread); 2194 + goto err_res_free; 2195 + } 2196 + 2197 + uc->psil_paired = true; 2198 + 2199 + uc->irq_num_ring = ti_sci_inta_msi_get_virq(ud->dev, irq_ring_idx); 2200 + if (uc->irq_num_ring <= 0) { 2201 + dev_err(ud->dev, "Failed to get ring irq (index: %u)\n", 2202 + irq_ring_idx); 2203 + ret = -EINVAL; 2204 + goto err_psi_free; 2205 + } 2206 + 2207 + ret = request_irq(uc->irq_num_ring, udma_ring_irq_handler, 2208 + IRQF_TRIGGER_HIGH, uc->name, uc); 2209 + if (ret) { 2210 + dev_err(ud->dev, "chan%d: ring irq request failed\n", uc->id); 2211 + goto err_irq_free; 2212 + } 2213 + 2214 + uc->irq_num_udma = 0; 2215 + 2216 + udma_reset_rings(uc); 2217 + 2218 + INIT_DELAYED_WORK_ONSTACK(&uc->tx_drain.work, 2219 + udma_check_tx_completion); 2220 + 2221 + if (uc->tchan) 2222 + dev_dbg(ud->dev, 2223 + "chan%d: tchan%d, tflow%d, Remote thread: 0x%04x\n", 2224 + uc->id, uc->tchan->id, uc->tchan->tflow_id, 2225 + uc->config.remote_thread_id); 2226 + else if (uc->rchan) 2227 + dev_dbg(ud->dev, 2228 + "chan%d: rchan%d, rflow%d, Remote thread: 0x%04x\n", 2229 + uc->id, uc->rchan->id, uc->rflow->id, 2230 + uc->config.remote_thread_id); 2231 + return 0; 2232 + 2233 + err_irq_free: 2234 + uc->irq_num_ring = 0; 2235 + err_psi_free: 2236 + navss_psil_unpair(ud, uc->config.src_thread, uc->config.dst_thread); 2237 + uc->psil_paired = false; 2238 + err_res_free: 2239 + udma_free_tx_resources(uc); 2240 + udma_free_rx_resources(uc); 2241 + 2242 + udma_reset_uchan(uc); 2243 + 2244 + dma_pool_destroy(uc->hdesc_pool); 2245 + uc->use_dma_pool = false; 2292 2246 2293 2247 return ret; 2294 2248 } ··· 2800 2028 size_t tr_size; 2801 2029 int num_tr = 0; 2802 2030 int tr_idx = 0; 2031 + u64 asel; 2803 2032 2804 2033 /* estimate the number of TRs we will need */ 2805 2034 for_each_sg(sgl, sgent, sglen, i) { ··· 2817 2044 return NULL; 2818 2045 2819 2046 d->sglen = sglen; 2047 + 2048 + if (uc->ud->match_data->type == DMA_TYPE_UDMA) 2049 + asel = 0; 2050 + else 2051 + asel = (u64)uc->config.asel << K3_ADDRESS_ASEL_SHIFT; 2820 2052 2821 2053 tr_req = d->hwdesc[0].tr_req_base; 2822 2054 for_each_sg(sgl, sgent, sglen, i) { ··· 2841 2063 false, CPPI5_TR_EVENT_SIZE_COMPLETION, 0); 2842 2064 cppi5_tr_csf_set(&tr_req[tr_idx].flags, CPPI5_TR_CSF_SUPR_EVT); 2843 2065 2066 + sg_addr |= asel; 2844 2067 tr_req[tr_idx].addr = sg_addr; 2845 2068 tr_req[tr_idx].icnt0 = tr0_cnt0; 2846 2069 tr_req[tr_idx].icnt1 = tr0_cnt1; ··· 2863 2084 } 2864 2085 2865 2086 d->residue += sg_dma_len(sgent); 2087 + } 2088 + 2089 + cppi5_tr_csf_set(&tr_req[tr_idx - 1].flags, 2090 + CPPI5_TR_CSF_SUPR_EVT | CPPI5_TR_CSF_EOP); 2091 + 2092 + return d; 2093 + } 2094 + 2095 + static struct udma_desc * 2096 + udma_prep_slave_sg_triggered_tr(struct udma_chan *uc, struct scatterlist *sgl, 2097 + unsigned int sglen, 2098 + enum dma_transfer_direction dir, 2099 + unsigned long tx_flags, void *context) 2100 + { 2101 + struct scatterlist *sgent; 2102 + struct cppi5_tr_type15_t *tr_req = NULL; 2103 + enum dma_slave_buswidth dev_width; 2104 + u16 tr_cnt0, tr_cnt1; 2105 + dma_addr_t dev_addr; 2106 + struct udma_desc *d; 2107 + unsigned int i; 2108 + size_t tr_size, sg_len; 2109 + int num_tr = 0; 2110 + int tr_idx = 0; 2111 + u32 burst, trigger_size, port_window; 2112 + u64 asel; 2113 + 2114 + if (dir == DMA_DEV_TO_MEM) { 2115 + dev_addr = uc->cfg.src_addr; 2116 + dev_width = uc->cfg.src_addr_width; 2117 + burst = uc->cfg.src_maxburst; 2118 + port_window = uc->cfg.src_port_window_size; 2119 + } else if (dir == DMA_MEM_TO_DEV) { 2120 + dev_addr = uc->cfg.dst_addr; 2121 + dev_width = uc->cfg.dst_addr_width; 2122 + burst = uc->cfg.dst_maxburst; 2123 + port_window = uc->cfg.dst_port_window_size; 2124 + } else { 2125 + dev_err(uc->ud->dev, "%s: bad direction?\n", __func__); 2126 + return NULL; 2127 + } 2128 + 2129 + if (!burst) 2130 + burst = 1; 2131 + 2132 + if (port_window) { 2133 + if (port_window != burst) { 2134 + dev_err(uc->ud->dev, 2135 + "The burst must be equal to port_window\n"); 2136 + return NULL; 2137 + } 2138 + 2139 + tr_cnt0 = dev_width * port_window; 2140 + tr_cnt1 = 1; 2141 + } else { 2142 + tr_cnt0 = dev_width; 2143 + tr_cnt1 = burst; 2144 + } 2145 + trigger_size = tr_cnt0 * tr_cnt1; 2146 + 2147 + /* estimate the number of TRs we will need */ 2148 + for_each_sg(sgl, sgent, sglen, i) { 2149 + sg_len = sg_dma_len(sgent); 2150 + 2151 + if (sg_len % trigger_size) { 2152 + dev_err(uc->ud->dev, 2153 + "Not aligned SG entry (%zu for %u)\n", sg_len, 2154 + trigger_size); 2155 + return NULL; 2156 + } 2157 + 2158 + if (sg_len / trigger_size < SZ_64K) 2159 + num_tr++; 2160 + else 2161 + num_tr += 2; 2162 + } 2163 + 2164 + /* Now allocate and setup the descriptor. */ 2165 + tr_size = sizeof(struct cppi5_tr_type15_t); 2166 + d = udma_alloc_tr_desc(uc, tr_size, num_tr, dir); 2167 + if (!d) 2168 + return NULL; 2169 + 2170 + d->sglen = sglen; 2171 + 2172 + if (uc->ud->match_data->type == DMA_TYPE_UDMA) { 2173 + asel = 0; 2174 + } else { 2175 + asel = (u64)uc->config.asel << K3_ADDRESS_ASEL_SHIFT; 2176 + dev_addr |= asel; 2177 + } 2178 + 2179 + tr_req = d->hwdesc[0].tr_req_base; 2180 + for_each_sg(sgl, sgent, sglen, i) { 2181 + u16 tr0_cnt2, tr0_cnt3, tr1_cnt2; 2182 + dma_addr_t sg_addr = sg_dma_address(sgent); 2183 + 2184 + sg_len = sg_dma_len(sgent); 2185 + num_tr = udma_get_tr_counters(sg_len / trigger_size, 0, 2186 + &tr0_cnt2, &tr0_cnt3, &tr1_cnt2); 2187 + if (num_tr < 0) { 2188 + dev_err(uc->ud->dev, "size %zu is not supported\n", 2189 + sg_len); 2190 + udma_free_hwdesc(uc, d); 2191 + kfree(d); 2192 + return NULL; 2193 + } 2194 + 2195 + cppi5_tr_init(&tr_req[tr_idx].flags, CPPI5_TR_TYPE15, false, 2196 + true, CPPI5_TR_EVENT_SIZE_COMPLETION, 0); 2197 + cppi5_tr_csf_set(&tr_req[tr_idx].flags, CPPI5_TR_CSF_SUPR_EVT); 2198 + cppi5_tr_set_trigger(&tr_req[tr_idx].flags, 2199 + uc->config.tr_trigger_type, 2200 + CPPI5_TR_TRIGGER_TYPE_ICNT2_DEC, 0, 0); 2201 + 2202 + sg_addr |= asel; 2203 + if (dir == DMA_DEV_TO_MEM) { 2204 + tr_req[tr_idx].addr = dev_addr; 2205 + tr_req[tr_idx].icnt0 = tr_cnt0; 2206 + tr_req[tr_idx].icnt1 = tr_cnt1; 2207 + tr_req[tr_idx].icnt2 = tr0_cnt2; 2208 + tr_req[tr_idx].icnt3 = tr0_cnt3; 2209 + tr_req[tr_idx].dim1 = (-1) * tr_cnt0; 2210 + 2211 + tr_req[tr_idx].daddr = sg_addr; 2212 + tr_req[tr_idx].dicnt0 = tr_cnt0; 2213 + tr_req[tr_idx].dicnt1 = tr_cnt1; 2214 + tr_req[tr_idx].dicnt2 = tr0_cnt2; 2215 + tr_req[tr_idx].dicnt3 = tr0_cnt3; 2216 + tr_req[tr_idx].ddim1 = tr_cnt0; 2217 + tr_req[tr_idx].ddim2 = trigger_size; 2218 + tr_req[tr_idx].ddim3 = trigger_size * tr0_cnt2; 2219 + } else { 2220 + tr_req[tr_idx].addr = sg_addr; 2221 + tr_req[tr_idx].icnt0 = tr_cnt0; 2222 + tr_req[tr_idx].icnt1 = tr_cnt1; 2223 + tr_req[tr_idx].icnt2 = tr0_cnt2; 2224 + tr_req[tr_idx].icnt3 = tr0_cnt3; 2225 + tr_req[tr_idx].dim1 = tr_cnt0; 2226 + tr_req[tr_idx].dim2 = trigger_size; 2227 + tr_req[tr_idx].dim3 = trigger_size * tr0_cnt2; 2228 + 2229 + tr_req[tr_idx].daddr = dev_addr; 2230 + tr_req[tr_idx].dicnt0 = tr_cnt0; 2231 + tr_req[tr_idx].dicnt1 = tr_cnt1; 2232 + tr_req[tr_idx].dicnt2 = tr0_cnt2; 2233 + tr_req[tr_idx].dicnt3 = tr0_cnt3; 2234 + tr_req[tr_idx].ddim1 = (-1) * tr_cnt0; 2235 + } 2236 + 2237 + tr_idx++; 2238 + 2239 + if (num_tr == 2) { 2240 + cppi5_tr_init(&tr_req[tr_idx].flags, CPPI5_TR_TYPE15, 2241 + false, true, 2242 + CPPI5_TR_EVENT_SIZE_COMPLETION, 0); 2243 + cppi5_tr_csf_set(&tr_req[tr_idx].flags, 2244 + CPPI5_TR_CSF_SUPR_EVT); 2245 + cppi5_tr_set_trigger(&tr_req[tr_idx].flags, 2246 + uc->config.tr_trigger_type, 2247 + CPPI5_TR_TRIGGER_TYPE_ICNT2_DEC, 2248 + 0, 0); 2249 + 2250 + sg_addr += trigger_size * tr0_cnt2 * tr0_cnt3; 2251 + if (dir == DMA_DEV_TO_MEM) { 2252 + tr_req[tr_idx].addr = dev_addr; 2253 + tr_req[tr_idx].icnt0 = tr_cnt0; 2254 + tr_req[tr_idx].icnt1 = tr_cnt1; 2255 + tr_req[tr_idx].icnt2 = tr1_cnt2; 2256 + tr_req[tr_idx].icnt3 = 1; 2257 + tr_req[tr_idx].dim1 = (-1) * tr_cnt0; 2258 + 2259 + tr_req[tr_idx].daddr = sg_addr; 2260 + tr_req[tr_idx].dicnt0 = tr_cnt0; 2261 + tr_req[tr_idx].dicnt1 = tr_cnt1; 2262 + tr_req[tr_idx].dicnt2 = tr1_cnt2; 2263 + tr_req[tr_idx].dicnt3 = 1; 2264 + tr_req[tr_idx].ddim1 = tr_cnt0; 2265 + tr_req[tr_idx].ddim2 = trigger_size; 2266 + } else { 2267 + tr_req[tr_idx].addr = sg_addr; 2268 + tr_req[tr_idx].icnt0 = tr_cnt0; 2269 + tr_req[tr_idx].icnt1 = tr_cnt1; 2270 + tr_req[tr_idx].icnt2 = tr1_cnt2; 2271 + tr_req[tr_idx].icnt3 = 1; 2272 + tr_req[tr_idx].dim1 = tr_cnt0; 2273 + tr_req[tr_idx].dim2 = trigger_size; 2274 + 2275 + tr_req[tr_idx].daddr = dev_addr; 2276 + tr_req[tr_idx].dicnt0 = tr_cnt0; 2277 + tr_req[tr_idx].dicnt1 = tr_cnt1; 2278 + tr_req[tr_idx].dicnt2 = tr1_cnt2; 2279 + tr_req[tr_idx].dicnt3 = 1; 2280 + tr_req[tr_idx].ddim1 = (-1) * tr_cnt0; 2281 + } 2282 + tr_idx++; 2283 + } 2284 + 2285 + d->residue += sg_len; 2866 2286 } 2867 2287 2868 2288 cppi5_tr_csf_set(&tr_req[tr_idx - 1].flags, ··· 3134 2156 struct udma_desc *d; 3135 2157 u32 ring_id; 3136 2158 unsigned int i; 2159 + u64 asel; 3137 2160 3138 2161 d = kzalloc(struct_size(d, hwdesc, sglen), GFP_NOWAIT); 3139 2162 if (!d) ··· 3147 2168 ring_id = k3_ringacc_get_ring_id(uc->rflow->r_ring); 3148 2169 else 3149 2170 ring_id = k3_ringacc_get_ring_id(uc->tchan->tc_ring); 2171 + 2172 + if (uc->ud->match_data->type == DMA_TYPE_UDMA) 2173 + asel = 0; 2174 + else 2175 + asel = (u64)uc->config.asel << K3_ADDRESS_ASEL_SHIFT; 3150 2176 3151 2177 for_each_sg(sgl, sgent, sglen, i) { 3152 2178 struct udma_hwdesc *hwdesc = &d->hwdesc[i]; ··· 3187 2203 } 3188 2204 3189 2205 /* attach the sg buffer to the descriptor */ 2206 + sg_addr |= asel; 3190 2207 cppi5_hdesc_attach_buf(desc, sg_addr, sg_len, sg_addr, sg_len); 3191 2208 3192 2209 /* Attach link as host buffer descriptor */ 3193 2210 if (h_desc) 3194 2211 cppi5_hdesc_link_hbdesc(h_desc, 3195 - hwdesc->cppi5_desc_paddr); 2212 + hwdesc->cppi5_desc_paddr | asel); 3196 2213 3197 - if (dir == DMA_MEM_TO_DEV) 2214 + if (uc->ud->match_data->type == DMA_TYPE_PKTDMA || 2215 + dir == DMA_MEM_TO_DEV) 3198 2216 h_desc = desc; 3199 2217 } 3200 2218 ··· 3319 2333 struct udma_desc *d; 3320 2334 u32 burst; 3321 2335 3322 - if (dir != uc->config.dir) { 2336 + if (dir != uc->config.dir && 2337 + (uc->config.dir == DMA_MEM_TO_MEM && !uc->config.tr_trigger_type)) { 3323 2338 dev_err(chan->device->dev, 3324 2339 "%s: chan%d is for %s, not supporting %s\n", 3325 2340 __func__, uc->id, ··· 3346 2359 if (uc->config.pkt_mode) 3347 2360 d = udma_prep_slave_sg_pkt(uc, sgl, sglen, dir, tx_flags, 3348 2361 context); 3349 - else 2362 + else if (is_slave_direction(uc->config.dir)) 3350 2363 d = udma_prep_slave_sg_tr(uc, sgl, sglen, dir, tx_flags, 3351 2364 context); 2365 + else 2366 + d = udma_prep_slave_sg_triggered_tr(uc, sgl, sglen, dir, 2367 + tx_flags, context); 3352 2368 3353 2369 if (!d) 3354 2370 return NULL; ··· 3405 2415 return NULL; 3406 2416 3407 2417 tr_req = d->hwdesc[0].tr_req_base; 3408 - period_addr = buf_addr; 2418 + if (uc->ud->match_data->type == DMA_TYPE_UDMA) 2419 + period_addr = buf_addr; 2420 + else 2421 + period_addr = buf_addr | 2422 + ((u64)uc->config.asel << K3_ADDRESS_ASEL_SHIFT); 2423 + 3409 2424 for (i = 0; i < periods; i++) { 3410 2425 int tr_idx = i * num_tr; 3411 2426 ··· 3474 2479 ring_id = k3_ringacc_get_ring_id(uc->rflow->r_ring); 3475 2480 else 3476 2481 ring_id = k3_ringacc_get_ring_id(uc->tchan->tc_ring); 2482 + 2483 + if (uc->ud->match_data->type != DMA_TYPE_UDMA) 2484 + buf_addr |= (u64)uc->config.asel << K3_ADDRESS_ASEL_SHIFT; 3477 2485 3478 2486 for (i = 0; i < periods; i++) { 3479 2487 struct udma_hwdesc *hwdesc = &d->hwdesc[i]; ··· 3618 2620 d->desc_idx = 0; 3619 2621 d->tr_idx = 0; 3620 2622 d->residue = len; 2623 + 2624 + if (uc->ud->match_data->type != DMA_TYPE_UDMA) { 2625 + src |= (u64)uc->ud->asel << K3_ADDRESS_ASEL_SHIFT; 2626 + dest |= (u64)uc->ud->asel << K3_ADDRESS_ASEL_SHIFT; 2627 + } 3621 2628 3622 2629 tr_req = d->hwdesc[0].tr_req_base; 3623 2630 ··· 3981 2978 vchan_free_chan_resources(&uc->vc); 3982 2979 tasklet_kill(&uc->vc.task); 3983 2980 2981 + bcdma_free_bchan_resources(uc); 3984 2982 udma_free_tx_resources(uc); 3985 2983 udma_free_rx_resources(uc); 3986 2984 udma_reset_uchan(uc); ··· 3993 2989 } 3994 2990 3995 2991 static struct platform_driver udma_driver; 2992 + static struct platform_driver bcdma_driver; 2993 + static struct platform_driver pktdma_driver; 3996 2994 3997 2995 struct udma_filter_param { 3998 2996 int remote_thread_id; 3999 2997 u32 atype; 2998 + u32 asel; 2999 + u32 tr_trigger_type; 4000 3000 }; 4001 3001 4002 3002 static bool udma_dma_filter_fn(struct dma_chan *chan, void *param) ··· 4011 3003 struct udma_chan *uc; 4012 3004 struct udma_dev *ud; 4013 3005 4014 - if (chan->device->dev->driver != &udma_driver.driver) 3006 + if (chan->device->dev->driver != &udma_driver.driver && 3007 + chan->device->dev->driver != &bcdma_driver.driver && 3008 + chan->device->dev->driver != &pktdma_driver.driver) 4015 3009 return false; 4016 3010 4017 3011 uc = to_udma_chan(chan); ··· 4027 3017 return false; 4028 3018 } 4029 3019 3020 + if (filter_param->asel > 15) { 3021 + dev_err(ud->dev, "Invalid channel asel: %u\n", 3022 + filter_param->asel); 3023 + return false; 3024 + } 3025 + 4030 3026 ucc->remote_thread_id = filter_param->remote_thread_id; 4031 3027 ucc->atype = filter_param->atype; 3028 + ucc->asel = filter_param->asel; 3029 + ucc->tr_trigger_type = filter_param->tr_trigger_type; 4032 3030 4033 - if (ucc->remote_thread_id & K3_PSIL_DST_THREAD_ID_OFFSET) 3031 + if (ucc->tr_trigger_type) { 3032 + ucc->dir = DMA_MEM_TO_MEM; 3033 + goto triggered_bchan; 3034 + } else if (ucc->remote_thread_id & K3_PSIL_DST_THREAD_ID_OFFSET) { 4034 3035 ucc->dir = DMA_MEM_TO_DEV; 4035 - else 3036 + } else { 4036 3037 ucc->dir = DMA_DEV_TO_MEM; 3038 + } 4037 3039 4038 3040 ep_config = psil_get_ep_config(ucc->remote_thread_id); 4039 3041 if (IS_ERR(ep_config)) { ··· 4054 3032 ucc->dir = DMA_MEM_TO_MEM; 4055 3033 ucc->remote_thread_id = -1; 4056 3034 ucc->atype = 0; 3035 + ucc->asel = 0; 3036 + return false; 3037 + } 3038 + 3039 + if (ud->match_data->type == DMA_TYPE_BCDMA && 3040 + ep_config->pkt_mode) { 3041 + dev_err(ud->dev, 3042 + "Only TR mode is supported (psi-l thread 0x%04x)\n", 3043 + ucc->remote_thread_id); 3044 + ucc->dir = DMA_MEM_TO_MEM; 3045 + ucc->remote_thread_id = -1; 3046 + ucc->atype = 0; 3047 + ucc->asel = 0; 4057 3048 return false; 4058 3049 } 4059 3050 ··· 4074 3039 ucc->channel_tpl = ep_config->channel_tpl; 4075 3040 ucc->notdpkt = ep_config->notdpkt; 4076 3041 ucc->ep_type = ep_config->ep_type; 3042 + 3043 + if (ud->match_data->type == DMA_TYPE_PKTDMA && 3044 + ep_config->mapped_channel_id >= 0) { 3045 + ucc->mapped_channel_id = ep_config->mapped_channel_id; 3046 + ucc->default_flow_id = ep_config->default_flow_id; 3047 + } else { 3048 + ucc->mapped_channel_id = -1; 3049 + ucc->default_flow_id = -1; 3050 + } 4077 3051 4078 3052 if (ucc->ep_type != PSIL_EP_NATIVE) { 4079 3053 const struct udma_match_data *match_data = ud->match_data; ··· 4107 3063 ucc->remote_thread_id, dmaengine_get_direction_text(ucc->dir)); 4108 3064 4109 3065 return true; 3066 + 3067 + triggered_bchan: 3068 + dev_dbg(ud->dev, "chan%d: triggered channel (type: %u)\n", uc->id, 3069 + ucc->tr_trigger_type); 3070 + 3071 + return true; 3072 + 4110 3073 } 4111 3074 4112 3075 static struct dma_chan *udma_of_xlate(struct of_phandle_args *dma_spec, ··· 4124 3073 struct udma_filter_param filter_param; 4125 3074 struct dma_chan *chan; 4126 3075 4127 - if (dma_spec->args_count != 1 && dma_spec->args_count != 2) 4128 - return NULL; 3076 + if (ud->match_data->type == DMA_TYPE_BCDMA) { 3077 + if (dma_spec->args_count != 3) 3078 + return NULL; 4129 3079 4130 - filter_param.remote_thread_id = dma_spec->args[0]; 4131 - if (dma_spec->args_count == 2) 4132 - filter_param.atype = dma_spec->args[1]; 4133 - else 3080 + filter_param.tr_trigger_type = dma_spec->args[0]; 3081 + filter_param.remote_thread_id = dma_spec->args[1]; 3082 + filter_param.asel = dma_spec->args[2]; 4134 3083 filter_param.atype = 0; 3084 + } else { 3085 + if (dma_spec->args_count != 1 && dma_spec->args_count != 2) 3086 + return NULL; 3087 + 3088 + filter_param.remote_thread_id = dma_spec->args[0]; 3089 + filter_param.tr_trigger_type = 0; 3090 + if (dma_spec->args_count == 2) { 3091 + if (ud->match_data->type == DMA_TYPE_UDMA) { 3092 + filter_param.atype = dma_spec->args[1]; 3093 + filter_param.asel = 0; 3094 + } else { 3095 + filter_param.atype = 0; 3096 + filter_param.asel = dma_spec->args[1]; 3097 + } 3098 + } else { 3099 + filter_param.atype = 0; 3100 + filter_param.asel = 0; 3101 + } 3102 + } 4135 3103 4136 3104 chan = __dma_request_channel(&mask, udma_dma_filter_fn, &filter_param, 4137 3105 ofdma->of_node); ··· 4163 3093 } 4164 3094 4165 3095 static struct udma_match_data am654_main_data = { 3096 + .type = DMA_TYPE_UDMA, 4166 3097 .psil_base = 0x1000, 4167 3098 .enable_memcpy_support = true, 4168 3099 .statictr_z_mask = GENMASK(11, 0), 4169 3100 }; 4170 3101 4171 3102 static struct udma_match_data am654_mcu_data = { 3103 + .type = DMA_TYPE_UDMA, 4172 3104 .psil_base = 0x6000, 4173 3105 .enable_memcpy_support = false, 4174 3106 .statictr_z_mask = GENMASK(11, 0), 4175 3107 }; 4176 3108 4177 3109 static struct udma_match_data j721e_main_data = { 3110 + .type = DMA_TYPE_UDMA, 4178 3111 .psil_base = 0x1000, 4179 3112 .enable_memcpy_support = true, 4180 - .flags = UDMA_FLAG_PDMA_ACC32 | UDMA_FLAG_PDMA_BURST, 3113 + .flags = UDMA_FLAG_PDMA_ACC32 | UDMA_FLAG_PDMA_BURST | UDMA_FLAG_TDTYPE, 4181 3114 .statictr_z_mask = GENMASK(23, 0), 4182 3115 }; 4183 3116 4184 3117 static struct udma_match_data j721e_mcu_data = { 3118 + .type = DMA_TYPE_UDMA, 4185 3119 .psil_base = 0x6000, 4186 3120 .enable_memcpy_support = false, /* MEM_TO_MEM is slow via MCU UDMA */ 4187 - .flags = UDMA_FLAG_PDMA_ACC32 | UDMA_FLAG_PDMA_BURST, 3121 + .flags = UDMA_FLAG_PDMA_ACC32 | UDMA_FLAG_PDMA_BURST | UDMA_FLAG_TDTYPE, 3122 + .statictr_z_mask = GENMASK(23, 0), 3123 + }; 3124 + 3125 + static struct udma_match_data am64_bcdma_data = { 3126 + .type = DMA_TYPE_BCDMA, 3127 + .psil_base = 0x2000, /* for tchan and rchan, not applicable to bchan */ 3128 + .enable_memcpy_support = true, /* Supported via bchan */ 3129 + .flags = UDMA_FLAG_PDMA_ACC32 | UDMA_FLAG_PDMA_BURST | UDMA_FLAG_TDTYPE, 3130 + .statictr_z_mask = GENMASK(23, 0), 3131 + }; 3132 + 3133 + static struct udma_match_data am64_pktdma_data = { 3134 + .type = DMA_TYPE_PKTDMA, 3135 + .psil_base = 0x1000, 3136 + .enable_memcpy_support = false, /* PKTDMA does not support MEM_TO_MEM */ 3137 + .flags = UDMA_FLAG_PDMA_ACC32 | UDMA_FLAG_PDMA_BURST | UDMA_FLAG_TDTYPE, 4188 3138 .statictr_z_mask = GENMASK(23, 0), 4189 3139 }; 4190 3140 ··· 4226 3136 { /* Sentinel */ }, 4227 3137 }; 4228 3138 3139 + static const struct of_device_id bcdma_of_match[] = { 3140 + { 3141 + .compatible = "ti,am64-dmss-bcdma", 3142 + .data = &am64_bcdma_data, 3143 + }, 3144 + { /* Sentinel */ }, 3145 + }; 3146 + 3147 + static const struct of_device_id pktdma_of_match[] = { 3148 + { 3149 + .compatible = "ti,am64-dmss-pktdma", 3150 + .data = &am64_pktdma_data, 3151 + }, 3152 + { /* Sentinel */ }, 3153 + }; 3154 + 4229 3155 static struct udma_soc_data am654_soc_data = { 4230 - .rchan_oes_offset = 0x200, 3156 + .oes = { 3157 + .udma_rchan = 0x200, 3158 + }, 4231 3159 }; 4232 3160 4233 3161 static struct udma_soc_data j721e_soc_data = { 4234 - .rchan_oes_offset = 0x400, 3162 + .oes = { 3163 + .udma_rchan = 0x400, 3164 + }, 4235 3165 }; 4236 3166 4237 3167 static struct udma_soc_data j7200_soc_data = { 4238 - .rchan_oes_offset = 0x80, 3168 + .oes = { 3169 + .udma_rchan = 0x80, 3170 + }, 3171 + }; 3172 + 3173 + static struct udma_soc_data am64_soc_data = { 3174 + .oes = { 3175 + .bcdma_bchan_data = 0x2200, 3176 + .bcdma_bchan_ring = 0x2400, 3177 + .bcdma_tchan_data = 0x2800, 3178 + .bcdma_tchan_ring = 0x2a00, 3179 + .bcdma_rchan_data = 0x2e00, 3180 + .bcdma_rchan_ring = 0x3000, 3181 + .pktdma_tchan_flow = 0x1200, 3182 + .pktdma_rchan_flow = 0x1600, 3183 + }, 3184 + .bcdma_trigger_event_offset = 0xc400, 4239 3185 }; 4240 3186 4241 3187 static const struct soc_device_attribute k3_soc_devices[] = { 4242 3188 { .family = "AM65X", .data = &am654_soc_data }, 4243 3189 { .family = "J721E", .data = &j721e_soc_data }, 4244 3190 { .family = "J7200", .data = &j7200_soc_data }, 3191 + { .family = "AM64X", .data = &am64_soc_data }, 4245 3192 { /* sentinel */ } 4246 3193 }; 4247 3194 4248 3195 static int udma_get_mmrs(struct platform_device *pdev, struct udma_dev *ud) 4249 3196 { 3197 + u32 cap2, cap3, cap4; 4250 3198 int i; 4251 3199 4252 - for (i = 0; i < MMR_LAST; i++) { 3200 + ud->mmrs[MMR_GCFG] = devm_platform_ioremap_resource_byname(pdev, mmr_names[MMR_GCFG]); 3201 + if (IS_ERR(ud->mmrs[MMR_GCFG])) 3202 + return PTR_ERR(ud->mmrs[MMR_GCFG]); 3203 + 3204 + cap2 = udma_read(ud->mmrs[MMR_GCFG], 0x28); 3205 + cap3 = udma_read(ud->mmrs[MMR_GCFG], 0x2c); 3206 + 3207 + switch (ud->match_data->type) { 3208 + case DMA_TYPE_UDMA: 3209 + ud->rflow_cnt = UDMA_CAP3_RFLOW_CNT(cap3); 3210 + ud->tchan_cnt = UDMA_CAP2_TCHAN_CNT(cap2); 3211 + ud->echan_cnt = UDMA_CAP2_ECHAN_CNT(cap2); 3212 + ud->rchan_cnt = UDMA_CAP2_RCHAN_CNT(cap2); 3213 + break; 3214 + case DMA_TYPE_BCDMA: 3215 + ud->bchan_cnt = BCDMA_CAP2_BCHAN_CNT(cap2); 3216 + ud->tchan_cnt = BCDMA_CAP2_TCHAN_CNT(cap2); 3217 + ud->rchan_cnt = BCDMA_CAP2_RCHAN_CNT(cap2); 3218 + break; 3219 + case DMA_TYPE_PKTDMA: 3220 + cap4 = udma_read(ud->mmrs[MMR_GCFG], 0x30); 3221 + ud->tchan_cnt = UDMA_CAP2_TCHAN_CNT(cap2); 3222 + ud->rchan_cnt = UDMA_CAP2_RCHAN_CNT(cap2); 3223 + ud->rflow_cnt = UDMA_CAP3_RFLOW_CNT(cap3); 3224 + ud->tflow_cnt = PKTDMA_CAP4_TFLOW_CNT(cap4); 3225 + break; 3226 + default: 3227 + return -EINVAL; 3228 + } 3229 + 3230 + for (i = 1; i < MMR_LAST; i++) { 3231 + if (i == MMR_BCHANRT && ud->bchan_cnt == 0) 3232 + continue; 3233 + if (i == MMR_TCHANRT && ud->tchan_cnt == 0) 3234 + continue; 3235 + if (i == MMR_RCHANRT && ud->rchan_cnt == 0) 3236 + continue; 3237 + 4253 3238 ud->mmrs[i] = devm_platform_ioremap_resource_byname(pdev, mmr_names[i]); 4254 3239 if (IS_ERR(ud->mmrs[i])) 4255 3240 return PTR_ERR(ud->mmrs[i]); ··· 4333 3168 return 0; 4334 3169 } 4335 3170 3171 + static void udma_mark_resource_ranges(struct udma_dev *ud, unsigned long *map, 3172 + struct ti_sci_resource_desc *rm_desc, 3173 + char *name) 3174 + { 3175 + bitmap_clear(map, rm_desc->start, rm_desc->num); 3176 + bitmap_clear(map, rm_desc->start_sec, rm_desc->num_sec); 3177 + dev_dbg(ud->dev, "ti_sci resource range for %s: %d:%d | %d:%d\n", name, 3178 + rm_desc->start, rm_desc->num, rm_desc->start_sec, 3179 + rm_desc->num_sec); 3180 + } 3181 + 3182 + static const char * const range_names[] = { 3183 + [RM_RANGE_BCHAN] = "ti,sci-rm-range-bchan", 3184 + [RM_RANGE_TCHAN] = "ti,sci-rm-range-tchan", 3185 + [RM_RANGE_RCHAN] = "ti,sci-rm-range-rchan", 3186 + [RM_RANGE_RFLOW] = "ti,sci-rm-range-rflow", 3187 + [RM_RANGE_TFLOW] = "ti,sci-rm-range-tflow", 3188 + }; 3189 + 4336 3190 static int udma_setup_resources(struct udma_dev *ud) 4337 3191 { 3192 + int ret, i, j; 4338 3193 struct device *dev = ud->dev; 4339 - int ch_count, ret, i, j; 4340 - u32 cap2, cap3; 4341 - struct ti_sci_resource_desc *rm_desc; 4342 3194 struct ti_sci_resource *rm_res, irq_res; 4343 3195 struct udma_tisci_rm *tisci_rm = &ud->tisci_rm; 4344 - static const char * const range_names[] = { "ti,sci-rm-range-tchan", 4345 - "ti,sci-rm-range-rchan", 4346 - "ti,sci-rm-range-rflow" }; 4347 - 4348 - cap2 = udma_read(ud->mmrs[MMR_GCFG], UDMA_CAP_REG(2)); 4349 - cap3 = udma_read(ud->mmrs[MMR_GCFG], UDMA_CAP_REG(3)); 4350 - 4351 - ud->rflow_cnt = UDMA_CAP3_RFLOW_CNT(cap3); 4352 - ud->tchan_cnt = UDMA_CAP2_TCHAN_CNT(cap2); 4353 - ud->echan_cnt = UDMA_CAP2_ECHAN_CNT(cap2); 4354 - ud->rchan_cnt = UDMA_CAP2_RCHAN_CNT(cap2); 4355 - ch_count = ud->tchan_cnt + ud->rchan_cnt; 3196 + u32 cap3; 4356 3197 4357 3198 /* Set up the throughput level start indexes */ 3199 + cap3 = udma_read(ud->mmrs[MMR_GCFG], 0x2c); 4358 3200 if (of_device_is_compatible(dev->of_node, 4359 3201 "ti,am654-navss-main-udmap")) { 4360 - ud->tpl_levels = 2; 4361 - ud->tpl_start_idx[0] = 8; 3202 + ud->tchan_tpl.levels = 2; 3203 + ud->tchan_tpl.start_idx[0] = 8; 4362 3204 } else if (of_device_is_compatible(dev->of_node, 4363 3205 "ti,am654-navss-mcu-udmap")) { 4364 - ud->tpl_levels = 2; 4365 - ud->tpl_start_idx[0] = 2; 3206 + ud->tchan_tpl.levels = 2; 3207 + ud->tchan_tpl.start_idx[0] = 2; 4366 3208 } else if (UDMA_CAP3_UCHAN_CNT(cap3)) { 4367 - ud->tpl_levels = 3; 4368 - ud->tpl_start_idx[1] = UDMA_CAP3_UCHAN_CNT(cap3); 4369 - ud->tpl_start_idx[0] = ud->tpl_start_idx[1] + 4370 - UDMA_CAP3_HCHAN_CNT(cap3); 3209 + ud->tchan_tpl.levels = 3; 3210 + ud->tchan_tpl.start_idx[1] = UDMA_CAP3_UCHAN_CNT(cap3); 3211 + ud->tchan_tpl.start_idx[0] = UDMA_CAP3_HCHAN_CNT(cap3); 4371 3212 } else if (UDMA_CAP3_HCHAN_CNT(cap3)) { 4372 - ud->tpl_levels = 2; 4373 - ud->tpl_start_idx[0] = UDMA_CAP3_HCHAN_CNT(cap3); 3213 + ud->tchan_tpl.levels = 2; 3214 + ud->tchan_tpl.start_idx[0] = UDMA_CAP3_HCHAN_CNT(cap3); 4374 3215 } else { 4375 - ud->tpl_levels = 1; 3216 + ud->tchan_tpl.levels = 1; 4376 3217 } 3218 + 3219 + ud->rchan_tpl.levels = ud->tchan_tpl.levels; 3220 + ud->rchan_tpl.start_idx[0] = ud->tchan_tpl.start_idx[0]; 3221 + ud->rchan_tpl.start_idx[1] = ud->tchan_tpl.start_idx[1]; 4377 3222 4378 3223 ud->tchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->tchan_cnt), 4379 3224 sizeof(unsigned long), GFP_KERNEL); ··· 4422 3247 bitmap_set(ud->rflow_gp_map, 0, ud->rflow_cnt); 4423 3248 4424 3249 /* Get resource ranges from tisci */ 4425 - for (i = 0; i < RM_RANGE_LAST; i++) 3250 + for (i = 0; i < RM_RANGE_LAST; i++) { 3251 + if (i == RM_RANGE_BCHAN || i == RM_RANGE_TFLOW) 3252 + continue; 3253 + 4426 3254 tisci_rm->rm_ranges[i] = 4427 3255 devm_ti_sci_get_of_resource(tisci_rm->tisci, dev, 4428 3256 tisci_rm->tisci_dev_id, 4429 3257 (char *)range_names[i]); 3258 + } 4430 3259 4431 3260 /* tchan ranges */ 4432 3261 rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN]; ··· 4438 3259 bitmap_zero(ud->tchan_map, ud->tchan_cnt); 4439 3260 } else { 4440 3261 bitmap_fill(ud->tchan_map, ud->tchan_cnt); 4441 - for (i = 0; i < rm_res->sets; i++) { 4442 - rm_desc = &rm_res->desc[i]; 4443 - bitmap_clear(ud->tchan_map, rm_desc->start, 4444 - rm_desc->num); 4445 - dev_dbg(dev, "ti-sci-res: tchan: %d:%d\n", 4446 - rm_desc->start, rm_desc->num); 4447 - } 3262 + for (i = 0; i < rm_res->sets; i++) 3263 + udma_mark_resource_ranges(ud, ud->tchan_map, 3264 + &rm_res->desc[i], "tchan"); 4448 3265 } 4449 3266 irq_res.sets = rm_res->sets; 4450 3267 ··· 4450 3275 bitmap_zero(ud->rchan_map, ud->rchan_cnt); 4451 3276 } else { 4452 3277 bitmap_fill(ud->rchan_map, ud->rchan_cnt); 4453 - for (i = 0; i < rm_res->sets; i++) { 4454 - rm_desc = &rm_res->desc[i]; 4455 - bitmap_clear(ud->rchan_map, rm_desc->start, 4456 - rm_desc->num); 4457 - dev_dbg(dev, "ti-sci-res: rchan: %d:%d\n", 4458 - rm_desc->start, rm_desc->num); 4459 - } 3278 + for (i = 0; i < rm_res->sets; i++) 3279 + udma_mark_resource_ranges(ud, ud->rchan_map, 3280 + &rm_res->desc[i], "rchan"); 4460 3281 } 4461 3282 4462 3283 irq_res.sets += rm_res->sets; ··· 4461 3290 for (i = 0; i < rm_res->sets; i++) { 4462 3291 irq_res.desc[i].start = rm_res->desc[i].start; 4463 3292 irq_res.desc[i].num = rm_res->desc[i].num; 3293 + irq_res.desc[i].start_sec = rm_res->desc[i].start_sec; 3294 + irq_res.desc[i].num_sec = rm_res->desc[i].num_sec; 4464 3295 } 4465 3296 rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN]; 4466 3297 for (j = 0; j < rm_res->sets; j++, i++) { 4467 - irq_res.desc[i].start = rm_res->desc[j].start + 4468 - ud->soc_data->rchan_oes_offset; 4469 - irq_res.desc[i].num = rm_res->desc[j].num; 3298 + if (rm_res->desc[j].num) { 3299 + irq_res.desc[i].start = rm_res->desc[j].start + 3300 + ud->soc_data->oes.udma_rchan; 3301 + irq_res.desc[i].num = rm_res->desc[j].num; 3302 + } 3303 + if (rm_res->desc[j].num_sec) { 3304 + irq_res.desc[i].start_sec = rm_res->desc[j].start_sec + 3305 + ud->soc_data->oes.udma_rchan; 3306 + irq_res.desc[i].num_sec = rm_res->desc[j].num_sec; 3307 + } 4470 3308 } 4471 3309 ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res); 4472 3310 kfree(irq_res.desc); ··· 4491 3311 bitmap_clear(ud->rflow_gp_map, ud->rchan_cnt, 4492 3312 ud->rflow_cnt - ud->rchan_cnt); 4493 3313 } else { 3314 + for (i = 0; i < rm_res->sets; i++) 3315 + udma_mark_resource_ranges(ud, ud->rflow_gp_map, 3316 + &rm_res->desc[i], "gp-rflow"); 3317 + } 3318 + 3319 + return 0; 3320 + } 3321 + 3322 + static int bcdma_setup_resources(struct udma_dev *ud) 3323 + { 3324 + int ret, i, j; 3325 + struct device *dev = ud->dev; 3326 + struct ti_sci_resource *rm_res, irq_res; 3327 + struct udma_tisci_rm *tisci_rm = &ud->tisci_rm; 3328 + const struct udma_oes_offsets *oes = &ud->soc_data->oes; 3329 + u32 cap; 3330 + 3331 + /* Set up the throughput level start indexes */ 3332 + cap = udma_read(ud->mmrs[MMR_GCFG], 0x2c); 3333 + if (BCDMA_CAP3_UBCHAN_CNT(cap)) { 3334 + ud->bchan_tpl.levels = 3; 3335 + ud->bchan_tpl.start_idx[1] = BCDMA_CAP3_UBCHAN_CNT(cap); 3336 + ud->bchan_tpl.start_idx[0] = BCDMA_CAP3_HBCHAN_CNT(cap); 3337 + } else if (BCDMA_CAP3_HBCHAN_CNT(cap)) { 3338 + ud->bchan_tpl.levels = 2; 3339 + ud->bchan_tpl.start_idx[0] = BCDMA_CAP3_HBCHAN_CNT(cap); 3340 + } else { 3341 + ud->bchan_tpl.levels = 1; 3342 + } 3343 + 3344 + cap = udma_read(ud->mmrs[MMR_GCFG], 0x30); 3345 + if (BCDMA_CAP4_URCHAN_CNT(cap)) { 3346 + ud->rchan_tpl.levels = 3; 3347 + ud->rchan_tpl.start_idx[1] = BCDMA_CAP4_URCHAN_CNT(cap); 3348 + ud->rchan_tpl.start_idx[0] = BCDMA_CAP4_HRCHAN_CNT(cap); 3349 + } else if (BCDMA_CAP4_HRCHAN_CNT(cap)) { 3350 + ud->rchan_tpl.levels = 2; 3351 + ud->rchan_tpl.start_idx[0] = BCDMA_CAP4_HRCHAN_CNT(cap); 3352 + } else { 3353 + ud->rchan_tpl.levels = 1; 3354 + } 3355 + 3356 + if (BCDMA_CAP4_UTCHAN_CNT(cap)) { 3357 + ud->tchan_tpl.levels = 3; 3358 + ud->tchan_tpl.start_idx[1] = BCDMA_CAP4_UTCHAN_CNT(cap); 3359 + ud->tchan_tpl.start_idx[0] = BCDMA_CAP4_HTCHAN_CNT(cap); 3360 + } else if (BCDMA_CAP4_HTCHAN_CNT(cap)) { 3361 + ud->tchan_tpl.levels = 2; 3362 + ud->tchan_tpl.start_idx[0] = BCDMA_CAP4_HTCHAN_CNT(cap); 3363 + } else { 3364 + ud->tchan_tpl.levels = 1; 3365 + } 3366 + 3367 + ud->bchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->bchan_cnt), 3368 + sizeof(unsigned long), GFP_KERNEL); 3369 + ud->bchans = devm_kcalloc(dev, ud->bchan_cnt, sizeof(*ud->bchans), 3370 + GFP_KERNEL); 3371 + ud->tchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->tchan_cnt), 3372 + sizeof(unsigned long), GFP_KERNEL); 3373 + ud->tchans = devm_kcalloc(dev, ud->tchan_cnt, sizeof(*ud->tchans), 3374 + GFP_KERNEL); 3375 + ud->rchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->rchan_cnt), 3376 + sizeof(unsigned long), GFP_KERNEL); 3377 + ud->rchans = devm_kcalloc(dev, ud->rchan_cnt, sizeof(*ud->rchans), 3378 + GFP_KERNEL); 3379 + /* BCDMA do not really have flows, but the driver expect it */ 3380 + ud->rflow_in_use = devm_kcalloc(dev, BITS_TO_LONGS(ud->rchan_cnt), 3381 + sizeof(unsigned long), 3382 + GFP_KERNEL); 3383 + ud->rflows = devm_kcalloc(dev, ud->rchan_cnt, sizeof(*ud->rflows), 3384 + GFP_KERNEL); 3385 + 3386 + if (!ud->bchan_map || !ud->tchan_map || !ud->rchan_map || 3387 + !ud->rflow_in_use || !ud->bchans || !ud->tchans || !ud->rchans || 3388 + !ud->rflows) 3389 + return -ENOMEM; 3390 + 3391 + /* Get resource ranges from tisci */ 3392 + for (i = 0; i < RM_RANGE_LAST; i++) { 3393 + if (i == RM_RANGE_RFLOW || i == RM_RANGE_TFLOW) 3394 + continue; 3395 + if (i == RM_RANGE_BCHAN && ud->bchan_cnt == 0) 3396 + continue; 3397 + if (i == RM_RANGE_TCHAN && ud->tchan_cnt == 0) 3398 + continue; 3399 + if (i == RM_RANGE_RCHAN && ud->rchan_cnt == 0) 3400 + continue; 3401 + 3402 + tisci_rm->rm_ranges[i] = 3403 + devm_ti_sci_get_of_resource(tisci_rm->tisci, dev, 3404 + tisci_rm->tisci_dev_id, 3405 + (char *)range_names[i]); 3406 + } 3407 + 3408 + irq_res.sets = 0; 3409 + 3410 + /* bchan ranges */ 3411 + if (ud->bchan_cnt) { 3412 + rm_res = tisci_rm->rm_ranges[RM_RANGE_BCHAN]; 3413 + if (IS_ERR(rm_res)) { 3414 + bitmap_zero(ud->bchan_map, ud->bchan_cnt); 3415 + } else { 3416 + bitmap_fill(ud->bchan_map, ud->bchan_cnt); 3417 + for (i = 0; i < rm_res->sets; i++) 3418 + udma_mark_resource_ranges(ud, ud->bchan_map, 3419 + &rm_res->desc[i], 3420 + "bchan"); 3421 + } 3422 + irq_res.sets += rm_res->sets; 3423 + } 3424 + 3425 + /* tchan ranges */ 3426 + if (ud->tchan_cnt) { 3427 + rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN]; 3428 + if (IS_ERR(rm_res)) { 3429 + bitmap_zero(ud->tchan_map, ud->tchan_cnt); 3430 + } else { 3431 + bitmap_fill(ud->tchan_map, ud->tchan_cnt); 3432 + for (i = 0; i < rm_res->sets; i++) 3433 + udma_mark_resource_ranges(ud, ud->tchan_map, 3434 + &rm_res->desc[i], 3435 + "tchan"); 3436 + } 3437 + irq_res.sets += rm_res->sets * 2; 3438 + } 3439 + 3440 + /* rchan ranges */ 3441 + if (ud->rchan_cnt) { 3442 + rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN]; 3443 + if (IS_ERR(rm_res)) { 3444 + bitmap_zero(ud->rchan_map, ud->rchan_cnt); 3445 + } else { 3446 + bitmap_fill(ud->rchan_map, ud->rchan_cnt); 3447 + for (i = 0; i < rm_res->sets; i++) 3448 + udma_mark_resource_ranges(ud, ud->rchan_map, 3449 + &rm_res->desc[i], 3450 + "rchan"); 3451 + } 3452 + irq_res.sets += rm_res->sets * 2; 3453 + } 3454 + 3455 + irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL); 3456 + if (ud->bchan_cnt) { 3457 + rm_res = tisci_rm->rm_ranges[RM_RANGE_BCHAN]; 4494 3458 for (i = 0; i < rm_res->sets; i++) { 4495 - rm_desc = &rm_res->desc[i]; 4496 - bitmap_clear(ud->rflow_gp_map, rm_desc->start, 4497 - rm_desc->num); 4498 - dev_dbg(dev, "ti-sci-res: rflow: %d:%d\n", 4499 - rm_desc->start, rm_desc->num); 3459 + irq_res.desc[i].start = rm_res->desc[i].start + 3460 + oes->bcdma_bchan_ring; 3461 + irq_res.desc[i].num = rm_res->desc[i].num; 3462 + } 3463 + } 3464 + if (ud->tchan_cnt) { 3465 + rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN]; 3466 + for (j = 0; j < rm_res->sets; j++, i += 2) { 3467 + irq_res.desc[i].start = rm_res->desc[j].start + 3468 + oes->bcdma_tchan_data; 3469 + irq_res.desc[i].num = rm_res->desc[j].num; 3470 + 3471 + irq_res.desc[i + 1].start = rm_res->desc[j].start + 3472 + oes->bcdma_tchan_ring; 3473 + irq_res.desc[i + 1].num = rm_res->desc[j].num; 3474 + } 3475 + } 3476 + if (ud->rchan_cnt) { 3477 + rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN]; 3478 + for (j = 0; j < rm_res->sets; j++, i += 2) { 3479 + irq_res.desc[i].start = rm_res->desc[j].start + 3480 + oes->bcdma_rchan_data; 3481 + irq_res.desc[i].num = rm_res->desc[j].num; 3482 + 3483 + irq_res.desc[i + 1].start = rm_res->desc[j].start + 3484 + oes->bcdma_rchan_ring; 3485 + irq_res.desc[i + 1].num = rm_res->desc[j].num; 4500 3486 } 4501 3487 } 4502 3488 3489 + ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res); 3490 + kfree(irq_res.desc); 3491 + if (ret) { 3492 + dev_err(ud->dev, "Failed to allocate MSI interrupts\n"); 3493 + return ret; 3494 + } 3495 + 3496 + return 0; 3497 + } 3498 + 3499 + static int pktdma_setup_resources(struct udma_dev *ud) 3500 + { 3501 + int ret, i, j; 3502 + struct device *dev = ud->dev; 3503 + struct ti_sci_resource *rm_res, irq_res; 3504 + struct udma_tisci_rm *tisci_rm = &ud->tisci_rm; 3505 + const struct udma_oes_offsets *oes = &ud->soc_data->oes; 3506 + u32 cap3; 3507 + 3508 + /* Set up the throughput level start indexes */ 3509 + cap3 = udma_read(ud->mmrs[MMR_GCFG], 0x2c); 3510 + if (UDMA_CAP3_UCHAN_CNT(cap3)) { 3511 + ud->tchan_tpl.levels = 3; 3512 + ud->tchan_tpl.start_idx[1] = UDMA_CAP3_UCHAN_CNT(cap3); 3513 + ud->tchan_tpl.start_idx[0] = UDMA_CAP3_HCHAN_CNT(cap3); 3514 + } else if (UDMA_CAP3_HCHAN_CNT(cap3)) { 3515 + ud->tchan_tpl.levels = 2; 3516 + ud->tchan_tpl.start_idx[0] = UDMA_CAP3_HCHAN_CNT(cap3); 3517 + } else { 3518 + ud->tchan_tpl.levels = 1; 3519 + } 3520 + 3521 + ud->tchan_tpl.levels = ud->tchan_tpl.levels; 3522 + ud->tchan_tpl.start_idx[0] = ud->tchan_tpl.start_idx[0]; 3523 + ud->tchan_tpl.start_idx[1] = ud->tchan_tpl.start_idx[1]; 3524 + 3525 + ud->tchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->tchan_cnt), 3526 + sizeof(unsigned long), GFP_KERNEL); 3527 + ud->tchans = devm_kcalloc(dev, ud->tchan_cnt, sizeof(*ud->tchans), 3528 + GFP_KERNEL); 3529 + ud->rchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->rchan_cnt), 3530 + sizeof(unsigned long), GFP_KERNEL); 3531 + ud->rchans = devm_kcalloc(dev, ud->rchan_cnt, sizeof(*ud->rchans), 3532 + GFP_KERNEL); 3533 + ud->rflow_in_use = devm_kcalloc(dev, BITS_TO_LONGS(ud->rflow_cnt), 3534 + sizeof(unsigned long), 3535 + GFP_KERNEL); 3536 + ud->rflows = devm_kcalloc(dev, ud->rflow_cnt, sizeof(*ud->rflows), 3537 + GFP_KERNEL); 3538 + ud->tflow_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->tflow_cnt), 3539 + sizeof(unsigned long), GFP_KERNEL); 3540 + 3541 + if (!ud->tchan_map || !ud->rchan_map || !ud->tflow_map || !ud->tchans || 3542 + !ud->rchans || !ud->rflows || !ud->rflow_in_use) 3543 + return -ENOMEM; 3544 + 3545 + /* Get resource ranges from tisci */ 3546 + for (i = 0; i < RM_RANGE_LAST; i++) { 3547 + if (i == RM_RANGE_BCHAN) 3548 + continue; 3549 + 3550 + tisci_rm->rm_ranges[i] = 3551 + devm_ti_sci_get_of_resource(tisci_rm->tisci, dev, 3552 + tisci_rm->tisci_dev_id, 3553 + (char *)range_names[i]); 3554 + } 3555 + 3556 + /* tchan ranges */ 3557 + rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN]; 3558 + if (IS_ERR(rm_res)) { 3559 + bitmap_zero(ud->tchan_map, ud->tchan_cnt); 3560 + } else { 3561 + bitmap_fill(ud->tchan_map, ud->tchan_cnt); 3562 + for (i = 0; i < rm_res->sets; i++) 3563 + udma_mark_resource_ranges(ud, ud->tchan_map, 3564 + &rm_res->desc[i], "tchan"); 3565 + } 3566 + 3567 + /* rchan ranges */ 3568 + rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN]; 3569 + if (IS_ERR(rm_res)) { 3570 + bitmap_zero(ud->rchan_map, ud->rchan_cnt); 3571 + } else { 3572 + bitmap_fill(ud->rchan_map, ud->rchan_cnt); 3573 + for (i = 0; i < rm_res->sets; i++) 3574 + udma_mark_resource_ranges(ud, ud->rchan_map, 3575 + &rm_res->desc[i], "rchan"); 3576 + } 3577 + 3578 + /* rflow ranges */ 3579 + rm_res = tisci_rm->rm_ranges[RM_RANGE_RFLOW]; 3580 + if (IS_ERR(rm_res)) { 3581 + /* all rflows are assigned exclusively to Linux */ 3582 + bitmap_zero(ud->rflow_in_use, ud->rflow_cnt); 3583 + } else { 3584 + bitmap_fill(ud->rflow_in_use, ud->rflow_cnt); 3585 + for (i = 0; i < rm_res->sets; i++) 3586 + udma_mark_resource_ranges(ud, ud->rflow_in_use, 3587 + &rm_res->desc[i], "rflow"); 3588 + } 3589 + irq_res.sets = rm_res->sets; 3590 + 3591 + /* tflow ranges */ 3592 + rm_res = tisci_rm->rm_ranges[RM_RANGE_TFLOW]; 3593 + if (IS_ERR(rm_res)) { 3594 + /* all tflows are assigned exclusively to Linux */ 3595 + bitmap_zero(ud->tflow_map, ud->tflow_cnt); 3596 + } else { 3597 + bitmap_fill(ud->tflow_map, ud->tflow_cnt); 3598 + for (i = 0; i < rm_res->sets; i++) 3599 + udma_mark_resource_ranges(ud, ud->tflow_map, 3600 + &rm_res->desc[i], "tflow"); 3601 + } 3602 + irq_res.sets += rm_res->sets; 3603 + 3604 + irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL); 3605 + rm_res = tisci_rm->rm_ranges[RM_RANGE_TFLOW]; 3606 + for (i = 0; i < rm_res->sets; i++) { 3607 + irq_res.desc[i].start = rm_res->desc[i].start + 3608 + oes->pktdma_tchan_flow; 3609 + irq_res.desc[i].num = rm_res->desc[i].num; 3610 + } 3611 + rm_res = tisci_rm->rm_ranges[RM_RANGE_RFLOW]; 3612 + for (j = 0; j < rm_res->sets; j++, i++) { 3613 + irq_res.desc[i].start = rm_res->desc[j].start + 3614 + oes->pktdma_rchan_flow; 3615 + irq_res.desc[i].num = rm_res->desc[j].num; 3616 + } 3617 + ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res); 3618 + kfree(irq_res.desc); 3619 + if (ret) { 3620 + dev_err(ud->dev, "Failed to allocate MSI interrupts\n"); 3621 + return ret; 3622 + } 3623 + 3624 + return 0; 3625 + } 3626 + 3627 + static int setup_resources(struct udma_dev *ud) 3628 + { 3629 + struct device *dev = ud->dev; 3630 + int ch_count, ret; 3631 + 3632 + switch (ud->match_data->type) { 3633 + case DMA_TYPE_UDMA: 3634 + ret = udma_setup_resources(ud); 3635 + break; 3636 + case DMA_TYPE_BCDMA: 3637 + ret = bcdma_setup_resources(ud); 3638 + break; 3639 + case DMA_TYPE_PKTDMA: 3640 + ret = pktdma_setup_resources(ud); 3641 + break; 3642 + default: 3643 + return -EINVAL; 3644 + } 3645 + 3646 + if (ret) 3647 + return ret; 3648 + 3649 + ch_count = ud->bchan_cnt + ud->tchan_cnt + ud->rchan_cnt; 3650 + if (ud->bchan_cnt) 3651 + ch_count -= bitmap_weight(ud->bchan_map, ud->bchan_cnt); 4503 3652 ch_count -= bitmap_weight(ud->tchan_map, ud->tchan_cnt); 4504 3653 ch_count -= bitmap_weight(ud->rchan_map, ud->rchan_cnt); 4505 3654 if (!ch_count) ··· 4839 3330 if (!ud->channels) 4840 3331 return -ENOMEM; 4841 3332 4842 - dev_info(dev, "Channels: %d (tchan: %u, rchan: %u, gp-rflow: %u)\n", 4843 - ch_count, 4844 - ud->tchan_cnt - bitmap_weight(ud->tchan_map, ud->tchan_cnt), 4845 - ud->rchan_cnt - bitmap_weight(ud->rchan_map, ud->rchan_cnt), 4846 - ud->rflow_cnt - bitmap_weight(ud->rflow_gp_map, 4847 - ud->rflow_cnt)); 3333 + switch (ud->match_data->type) { 3334 + case DMA_TYPE_UDMA: 3335 + dev_info(dev, 3336 + "Channels: %d (tchan: %u, rchan: %u, gp-rflow: %u)\n", 3337 + ch_count, 3338 + ud->tchan_cnt - bitmap_weight(ud->tchan_map, 3339 + ud->tchan_cnt), 3340 + ud->rchan_cnt - bitmap_weight(ud->rchan_map, 3341 + ud->rchan_cnt), 3342 + ud->rflow_cnt - bitmap_weight(ud->rflow_gp_map, 3343 + ud->rflow_cnt)); 3344 + break; 3345 + case DMA_TYPE_BCDMA: 3346 + dev_info(dev, 3347 + "Channels: %d (bchan: %u, tchan: %u, rchan: %u)\n", 3348 + ch_count, 3349 + ud->bchan_cnt - bitmap_weight(ud->bchan_map, 3350 + ud->bchan_cnt), 3351 + ud->tchan_cnt - bitmap_weight(ud->tchan_map, 3352 + ud->tchan_cnt), 3353 + ud->rchan_cnt - bitmap_weight(ud->rchan_map, 3354 + ud->rchan_cnt)); 3355 + break; 3356 + case DMA_TYPE_PKTDMA: 3357 + dev_info(dev, 3358 + "Channels: %d (tchan: %u, rchan: %u)\n", 3359 + ch_count, 3360 + ud->tchan_cnt - bitmap_weight(ud->tchan_map, 3361 + ud->tchan_cnt), 3362 + ud->rchan_cnt - bitmap_weight(ud->rchan_map, 3363 + ud->rchan_cnt)); 3364 + default: 3365 + break; 3366 + } 4848 3367 4849 3368 return ch_count; 4850 3369 } ··· 4981 3444 4982 3445 seq_printf(s, " %-13s| %s", dma_chan_name(chan), 4983 3446 chan->dbg_client_name ?: "in-use"); 4984 - seq_printf(s, " (%s, ", dmaengine_get_direction_text(uc->config.dir)); 3447 + if (ucc->tr_trigger_type) 3448 + seq_puts(s, " (triggered, "); 3449 + else 3450 + seq_printf(s, " (%s, ", 3451 + dmaengine_get_direction_text(uc->config.dir)); 4985 3452 4986 3453 switch (uc->config.dir) { 4987 3454 case DMA_MEM_TO_MEM: 3455 + if (uc->ud->match_data->type == DMA_TYPE_BCDMA) { 3456 + seq_printf(s, "bchan%d)\n", uc->bchan->id); 3457 + return; 3458 + } 3459 + 4988 3460 seq_printf(s, "chan%d pair [0x%04x -> 0x%04x], ", uc->tchan->id, 4989 3461 ucc->src_thread, ucc->dst_thread); 4990 3462 break; 4991 3463 case DMA_DEV_TO_MEM: 4992 3464 seq_printf(s, "rchan%d [0x%04x -> 0x%04x], ", uc->rchan->id, 4993 3465 ucc->src_thread, ucc->dst_thread); 3466 + if (uc->ud->match_data->type == DMA_TYPE_PKTDMA) 3467 + seq_printf(s, "rflow%d, ", uc->rflow->id); 4994 3468 break; 4995 3469 case DMA_MEM_TO_DEV: 4996 3470 seq_printf(s, "tchan%d [0x%04x -> 0x%04x], ", uc->tchan->id, 4997 3471 ucc->src_thread, ucc->dst_thread); 3472 + if (uc->ud->match_data->type == DMA_TYPE_PKTDMA) 3473 + seq_printf(s, "tflow%d, ", uc->tchan->tflow_id); 4998 3474 break; 4999 3475 default: 5000 3476 seq_printf(s, ")\n"); ··· 5069 3519 if (!ud) 5070 3520 return -ENOMEM; 5071 3521 3522 + match = of_match_node(udma_of_match, dev->of_node); 3523 + if (!match) 3524 + match = of_match_node(bcdma_of_match, dev->of_node); 3525 + if (!match) { 3526 + match = of_match_node(pktdma_of_match, dev->of_node); 3527 + if (!match) { 3528 + dev_err(dev, "No compatible match found\n"); 3529 + return -ENODEV; 3530 + } 3531 + } 3532 + ud->match_data = match->data; 3533 + 3534 + soc = soc_device_match(k3_soc_devices); 3535 + if (!soc) { 3536 + dev_err(dev, "No compatible SoC found\n"); 3537 + return -ENODEV; 3538 + } 3539 + ud->soc_data = soc->data; 3540 + 5072 3541 ret = udma_get_mmrs(pdev, ud); 5073 3542 if (ret) 5074 3543 return ret; ··· 5111 3542 return ret; 5112 3543 } 5113 3544 5114 - ret = of_property_read_u32(dev->of_node, "ti,udma-atype", &ud->atype); 5115 - if (!ret && ud->atype > 2) { 5116 - dev_err(dev, "Invalid atype: %u\n", ud->atype); 5117 - return -EINVAL; 3545 + if (ud->match_data->type == DMA_TYPE_UDMA) { 3546 + ret = of_property_read_u32(dev->of_node, "ti,udma-atype", 3547 + &ud->atype); 3548 + if (!ret && ud->atype > 2) { 3549 + dev_err(dev, "Invalid atype: %u\n", ud->atype); 3550 + return -EINVAL; 3551 + } 3552 + } else { 3553 + ret = of_property_read_u32(dev->of_node, "ti,asel", 3554 + &ud->asel); 3555 + if (!ret && ud->asel > 15) { 3556 + dev_err(dev, "Invalid asel: %u\n", ud->asel); 3557 + return -EINVAL; 3558 + } 5118 3559 } 5119 3560 5120 3561 ud->tisci_rm.tisci_udmap_ops = &ud->tisci_rm.tisci->ops.rm_udmap_ops; 5121 3562 ud->tisci_rm.tisci_psil_ops = &ud->tisci_rm.tisci->ops.rm_psil_ops; 5122 3563 5123 - ud->ringacc = of_k3_ringacc_get_by_phandle(dev->of_node, "ti,ringacc"); 3564 + if (ud->match_data->type == DMA_TYPE_UDMA) { 3565 + ud->ringacc = of_k3_ringacc_get_by_phandle(dev->of_node, "ti,ringacc"); 3566 + } else { 3567 + struct k3_ringacc_init_data ring_init_data; 3568 + 3569 + ring_init_data.tisci = ud->tisci_rm.tisci; 3570 + ring_init_data.tisci_dev_id = ud->tisci_rm.tisci_dev_id; 3571 + if (ud->match_data->type == DMA_TYPE_BCDMA) { 3572 + ring_init_data.num_rings = ud->bchan_cnt + 3573 + ud->tchan_cnt + 3574 + ud->rchan_cnt; 3575 + } else { 3576 + ring_init_data.num_rings = ud->rflow_cnt + 3577 + ud->tflow_cnt; 3578 + } 3579 + 3580 + ud->ringacc = k3_ringacc_dmarings_init(pdev, &ring_init_data); 3581 + } 3582 + 5124 3583 if (IS_ERR(ud->ringacc)) 5125 3584 return PTR_ERR(ud->ringacc); 5126 3585 ··· 5159 3562 return -EPROBE_DEFER; 5160 3563 } 5161 3564 5162 - match = of_match_node(udma_of_match, dev->of_node); 5163 - if (!match) { 5164 - dev_err(dev, "No compatible match found\n"); 5165 - return -ENODEV; 5166 - } 5167 - ud->match_data = match->data; 5168 - 5169 - soc = soc_device_match(k3_soc_devices); 5170 - if (!soc) { 5171 - dev_err(dev, "No compatible SoC found\n"); 5172 - return -ENODEV; 5173 - } 5174 - ud->soc_data = soc->data; 5175 - 5176 3565 dma_cap_set(DMA_SLAVE, ud->ddev.cap_mask); 5177 - dma_cap_set(DMA_CYCLIC, ud->ddev.cap_mask); 3566 + /* cyclic operation is not supported via PKTDMA */ 3567 + if (ud->match_data->type != DMA_TYPE_PKTDMA) { 3568 + dma_cap_set(DMA_CYCLIC, ud->ddev.cap_mask); 3569 + ud->ddev.device_prep_dma_cyclic = udma_prep_dma_cyclic; 3570 + } 5178 3571 5179 - ud->ddev.device_alloc_chan_resources = udma_alloc_chan_resources; 5180 3572 ud->ddev.device_config = udma_slave_config; 5181 3573 ud->ddev.device_prep_slave_sg = udma_prep_slave_sg; 5182 - ud->ddev.device_prep_dma_cyclic = udma_prep_dma_cyclic; 5183 3574 ud->ddev.device_issue_pending = udma_issue_pending; 5184 3575 ud->ddev.device_tx_status = udma_tx_status; 5185 3576 ud->ddev.device_pause = udma_pause; ··· 5178 3593 ud->ddev.dbg_summary_show = udma_dbg_summary_show; 5179 3594 #endif 5180 3595 3596 + switch (ud->match_data->type) { 3597 + case DMA_TYPE_UDMA: 3598 + ud->ddev.device_alloc_chan_resources = 3599 + udma_alloc_chan_resources; 3600 + break; 3601 + case DMA_TYPE_BCDMA: 3602 + ud->ddev.device_alloc_chan_resources = 3603 + bcdma_alloc_chan_resources; 3604 + ud->ddev.device_router_config = bcdma_router_config; 3605 + break; 3606 + case DMA_TYPE_PKTDMA: 3607 + ud->ddev.device_alloc_chan_resources = 3608 + pktdma_alloc_chan_resources; 3609 + break; 3610 + default: 3611 + return -EINVAL; 3612 + } 5181 3613 ud->ddev.device_free_chan_resources = udma_free_chan_resources; 3614 + 5182 3615 ud->ddev.src_addr_widths = TI_UDMAC_BUSWIDTHS; 5183 3616 ud->ddev.dst_addr_widths = TI_UDMAC_BUSWIDTHS; 5184 3617 ud->ddev.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); ··· 5204 3601 ud->ddev.copy_align = DMAENGINE_ALIGN_8_BYTES; 5205 3602 ud->ddev.desc_metadata_modes = DESC_METADATA_CLIENT | 5206 3603 DESC_METADATA_ENGINE; 5207 - if (ud->match_data->enable_memcpy_support) { 3604 + if (ud->match_data->enable_memcpy_support && 3605 + !(ud->match_data->type == DMA_TYPE_BCDMA && ud->bchan_cnt == 0)) { 5208 3606 dma_cap_set(DMA_MEMCPY, ud->ddev.cap_mask); 5209 3607 ud->ddev.device_prep_dma_memcpy = udma_prep_dma_memcpy; 5210 3608 ud->ddev.directions |= BIT(DMA_MEM_TO_MEM); ··· 5218 3614 INIT_LIST_HEAD(&ud->ddev.channels); 5219 3615 INIT_LIST_HEAD(&ud->desc_to_purge); 5220 3616 5221 - ch_count = udma_setup_resources(ud); 3617 + ch_count = setup_resources(ud); 5222 3618 if (ch_count <= 0) 5223 3619 return ch_count; 5224 3620 ··· 5232 3628 ret = udma_setup_rx_flush(ud); 5233 3629 if (ret) 5234 3630 return ret; 3631 + 3632 + for (i = 0; i < ud->bchan_cnt; i++) { 3633 + struct udma_bchan *bchan = &ud->bchans[i]; 3634 + 3635 + bchan->id = i; 3636 + bchan->reg_rt = ud->mmrs[MMR_BCHANRT] + i * 0x1000; 3637 + } 5235 3638 5236 3639 for (i = 0; i < ud->tchan_cnt; i++) { 5237 3640 struct udma_tchan *tchan = &ud->tchans[i]; ··· 5266 3655 uc->ud = ud; 5267 3656 uc->vc.desc_free = udma_desc_free; 5268 3657 uc->id = i; 3658 + uc->bchan = NULL; 5269 3659 uc->tchan = NULL; 5270 3660 uc->rchan = NULL; 5271 3661 uc->config.remote_thread_id = -1; 3662 + uc->config.mapped_channel_id = -1; 3663 + uc->config.default_flow_id = -1; 5272 3664 uc->config.dir = DMA_MEM_TO_MEM; 5273 3665 uc->name = devm_kasprintf(dev, GFP_KERNEL, "%s chan%d", 5274 3666 dev_name(dev), i); ··· 5309 3695 .probe = udma_probe, 5310 3696 }; 5311 3697 builtin_platform_driver(udma_driver); 3698 + 3699 + static struct platform_driver bcdma_driver = { 3700 + .driver = { 3701 + .name = "ti-bcdma", 3702 + .of_match_table = bcdma_of_match, 3703 + .suppress_bind_attrs = true, 3704 + }, 3705 + .probe = udma_probe, 3706 + }; 3707 + builtin_platform_driver(bcdma_driver); 3708 + 3709 + static struct platform_driver pktdma_driver = { 3710 + .driver = { 3711 + .name = "ti-pktdma", 3712 + .of_match_table = pktdma_of_match, 3713 + .suppress_bind_attrs = true, 3714 + }, 3715 + .probe = udma_probe, 3716 + }; 3717 + builtin_platform_driver(pktdma_driver); 5312 3718 5313 3719 /* Private interfaces to UDMA */ 5314 3720 #include "k3-udma-private.c"
+26 -2
drivers/dma/ti/k3-udma.h
··· 18 18 #define UDMA_RX_FLOW_ID_FW_OES_REG 0x80 19 19 #define UDMA_RX_FLOW_ID_FW_STATUS_REG 0x88 20 20 21 - /* TCHANRT/RCHANRT registers */ 21 + /* BCHANRT/TCHANRT/RCHANRT registers */ 22 22 #define UDMA_CHAN_RT_CTL_REG 0x0 23 23 #define UDMA_CHAN_RT_SWTRIG_REG 0x8 24 24 #define UDMA_CHAN_RT_STDATA_REG 0x80 ··· 44 44 #define UDMA_CAP3_RFLOW_CNT(val) ((val) & 0x3fff) 45 45 #define UDMA_CAP3_HCHAN_CNT(val) (((val) >> 14) & 0x1ff) 46 46 #define UDMA_CAP3_UCHAN_CNT(val) (((val) >> 23) & 0x1ff) 47 + 48 + #define BCDMA_CAP2_BCHAN_CNT(val) ((val) & 0x1ff) 49 + #define BCDMA_CAP2_TCHAN_CNT(val) (((val) >> 9) & 0x1ff) 50 + #define BCDMA_CAP2_RCHAN_CNT(val) (((val) >> 18) & 0x1ff) 51 + #define BCDMA_CAP3_HBCHAN_CNT(val) (((val) >> 14) & 0x1ff) 52 + #define BCDMA_CAP3_UBCHAN_CNT(val) (((val) >> 23) & 0x1ff) 53 + #define BCDMA_CAP4_HRCHAN_CNT(val) ((val) & 0xff) 54 + #define BCDMA_CAP4_URCHAN_CNT(val) (((val) >> 8) & 0xff) 55 + #define BCDMA_CAP4_HTCHAN_CNT(val) (((val) >> 16) & 0xff) 56 + #define BCDMA_CAP4_UTCHAN_CNT(val) (((val) >> 24) & 0xff) 57 + 58 + #define PKTDMA_CAP4_TFLOW_CNT(val) ((val) & 0x3fff) 47 59 48 60 /* UDMA_CHAN_RT_CTL_REG */ 49 61 #define UDMA_CHAN_RT_CTL_EN BIT(31) ··· 94 82 */ 95 83 #define PDMA_STATIC_TR_Z(x, mask) ((x) & (mask)) 96 84 85 + /* Address Space Select */ 86 + #define K3_ADDRESS_ASEL_SHIFT 48 87 + 97 88 struct udma_dev; 98 89 struct udma_tchan; 99 90 struct udma_rchan; 100 91 struct udma_rflow; 101 92 102 93 enum udma_rm_range { 103 - RM_RANGE_TCHAN = 0, 94 + RM_RANGE_BCHAN = 0, 95 + RM_RANGE_TCHAN, 104 96 RM_RANGE_RCHAN, 105 97 RM_RANGE_RFLOW, 98 + RM_RANGE_TFLOW, 106 99 RM_RANGE_LAST, 107 100 }; 108 101 ··· 129 112 u32 dst_thread); 130 113 131 114 struct udma_dev *of_xudma_dev_get(struct device_node *np, const char *property); 115 + struct device *xudma_get_device(struct udma_dev *ud); 116 + struct k3_ringacc *xudma_get_ringacc(struct udma_dev *ud); 132 117 void xudma_dev_put(struct udma_dev *ud); 133 118 u32 xudma_dev_get_psil_base(struct udma_dev *ud); 134 119 struct udma_tisci_rm *xudma_dev_get_tisci_rm(struct udma_dev *ud); ··· 155 136 u32 xudma_rchanrt_read(struct udma_rchan *rchan, int reg); 156 137 void xudma_rchanrt_write(struct udma_rchan *rchan, int reg, u32 val); 157 138 bool xudma_rflow_is_gp(struct udma_dev *ud, int id); 139 + int xudma_get_rflow_ring_offset(struct udma_dev *ud); 158 140 141 + int xudma_is_pktdma(struct udma_dev *ud); 142 + 143 + int xudma_pktdma_tflow_get_irq(struct udma_dev *ud, int udma_tflow_id); 144 + int xudma_pktdma_rflow_get_irq(struct udma_dev *ud, int udma_rflow_id); 159 145 #endif /* K3_UDMA_H_ */
+318 -7
drivers/soc/ti/k3-ringacc.c
··· 11 11 #include <linux/of.h> 12 12 #include <linux/platform_device.h> 13 13 #include <linux/sys_soc.h> 14 + #include <linux/dma/ti-cppi5.h> 14 15 #include <linux/soc/ti/k3-ringacc.h> 15 16 #include <linux/soc/ti/ti_sci_protocol.h> 16 17 #include <linux/soc/ti/ti_sci_inta_msi.h> ··· 22 21 static DEFINE_MUTEX(k3_ringacc_list_lock); 23 22 24 23 #define K3_RINGACC_CFG_RING_SIZE_ELCNT_MASK GENMASK(19, 0) 24 + #define K3_DMARING_CFG_RING_SIZE_ELCNT_MASK GENMASK(15, 0) 25 25 26 26 /** 27 27 * struct k3_ring_rt_regs - The RA realtime Control/Status Registers region ··· 45 43 u32 hwindx; 46 44 }; 47 45 48 - #define K3_RINGACC_RT_REGS_STEP 0x1000 46 + #define K3_RINGACC_RT_REGS_STEP 0x1000 47 + #define K3_DMARING_RT_REGS_STEP 0x2000 48 + #define K3_DMARING_RT_REGS_REVERSE_OFS 0x1000 49 + #define K3_RINGACC_RT_OCC_MASK GENMASK(20, 0) 50 + #define K3_DMARING_RT_OCC_TDOWN_COMPLETE BIT(31) 51 + #define K3_DMARING_RT_DB_ENTRY_MASK GENMASK(7, 0) 52 + #define K3_DMARING_RT_DB_TDOWN_ACK BIT(31) 49 53 50 54 /** 51 55 * struct k3_ring_fifo_regs - The Ring Accelerator Queues Registers region ··· 130 122 u32 occ; 131 123 u32 windex; 132 124 u32 rindex; 125 + u32 tdown_complete:1; 133 126 }; 134 127 135 128 /** ··· 152 143 * @use_count: Use count for shared rings 153 144 * @proxy_id: RA Ring Proxy Id (only if @K3_RINGACC_RING_USE_PROXY) 154 145 * @dma_dev: device to be used for DMA API (allocation, mapping) 146 + * @asel: Address Space Select value for physical addresses 155 147 */ 156 148 struct k3_ring { 157 149 struct k3_ring_rt_regs __iomem *rt; ··· 167 157 u32 flags; 168 158 #define K3_RING_FLAG_BUSY BIT(1) 169 159 #define K3_RING_FLAG_SHARED BIT(2) 160 + #define K3_RING_FLAG_REVERSE BIT(3) 170 161 struct k3_ring_state state; 171 162 u32 ring_id; 172 163 struct k3_ringacc *parent; 173 164 u32 use_count; 174 165 int proxy_id; 175 166 struct device *dma_dev; 167 + u32 asel; 168 + #define K3_ADDRESS_ASEL_SHIFT 48 176 169 }; 177 170 178 171 struct k3_ringacc_ops { ··· 201 188 * @tisci_ring_ops: ti-sci rings ops 202 189 * @tisci_dev_id: ti-sci device id 203 190 * @ops: SoC specific ringacc operation 191 + * @dma_rings: indicate DMA ring (dual ring within BCDMA/PKTDMA) 204 192 */ 205 193 struct k3_ringacc { 206 194 struct device *dev; ··· 224 210 u32 tisci_dev_id; 225 211 226 212 const struct k3_ringacc_ops *ops; 213 + bool dma_rings; 227 214 }; 228 215 229 216 /** ··· 235 220 struct k3_ringacc_soc_data { 236 221 unsigned dma_ring_reset_quirk:1; 237 222 }; 223 + 224 + static int k3_ringacc_ring_read_occ(struct k3_ring *ring) 225 + { 226 + return readl(&ring->rt->occ) & K3_RINGACC_RT_OCC_MASK; 227 + } 228 + 229 + static void k3_ringacc_ring_update_occ(struct k3_ring *ring) 230 + { 231 + u32 val; 232 + 233 + val = readl(&ring->rt->occ); 234 + 235 + ring->state.occ = val & K3_RINGACC_RT_OCC_MASK; 236 + ring->state.tdown_complete = !!(val & K3_DMARING_RT_OCC_TDOWN_COMPLETE); 237 + } 238 238 239 239 static long k3_ringacc_ring_get_fifo_pos(struct k3_ring *ring) 240 240 { ··· 264 234 265 235 static int k3_ringacc_ring_push_mem(struct k3_ring *ring, void *elem); 266 236 static int k3_ringacc_ring_pop_mem(struct k3_ring *ring, void *elem); 237 + static int k3_dmaring_fwd_pop(struct k3_ring *ring, void *elem); 238 + static int k3_dmaring_reverse_pop(struct k3_ring *ring, void *elem); 267 239 268 240 static struct k3_ring_ops k3_ring_mode_ring_ops = { 269 241 .push_tail = k3_ringacc_ring_push_mem, 270 242 .pop_head = k3_ringacc_ring_pop_mem, 243 + }; 244 + 245 + static struct k3_ring_ops k3_dmaring_fwd_ops = { 246 + .push_tail = k3_ringacc_ring_push_mem, 247 + .pop_head = k3_dmaring_fwd_pop, 248 + }; 249 + 250 + static struct k3_ring_ops k3_dmaring_reverse_ops = { 251 + /* Reverse side of the DMA ring can only be popped by SW */ 252 + .pop_head = k3_dmaring_reverse_pop, 271 253 }; 272 254 273 255 static int k3_ringacc_ring_push_io(struct k3_ring *ring, void *elem); ··· 384 342 } 385 343 EXPORT_SYMBOL_GPL(k3_ringacc_request_ring); 386 344 345 + static int k3_dmaring_request_dual_ring(struct k3_ringacc *ringacc, int fwd_id, 346 + struct k3_ring **fwd_ring, 347 + struct k3_ring **compl_ring) 348 + { 349 + int ret = 0; 350 + 351 + /* 352 + * DMA rings must be requested by ID, completion ring is the reverse 353 + * side of the forward ring 354 + */ 355 + if (fwd_id < 0) 356 + return -EINVAL; 357 + 358 + mutex_lock(&ringacc->req_lock); 359 + 360 + if (test_bit(fwd_id, ringacc->rings_inuse)) { 361 + ret = -EBUSY; 362 + goto error; 363 + } 364 + 365 + *fwd_ring = &ringacc->rings[fwd_id]; 366 + *compl_ring = &ringacc->rings[fwd_id + ringacc->num_rings]; 367 + set_bit(fwd_id, ringacc->rings_inuse); 368 + ringacc->rings[fwd_id].use_count++; 369 + dev_dbg(ringacc->dev, "Giving ring#%d\n", fwd_id); 370 + 371 + mutex_unlock(&ringacc->req_lock); 372 + return 0; 373 + 374 + error: 375 + mutex_unlock(&ringacc->req_lock); 376 + return ret; 377 + } 378 + 387 379 int k3_ringacc_request_rings_pair(struct k3_ringacc *ringacc, 388 380 int fwd_id, int compl_id, 389 381 struct k3_ring **fwd_ring, ··· 427 351 428 352 if (!fwd_ring || !compl_ring) 429 353 return -EINVAL; 354 + 355 + if (ringacc->dma_rings) 356 + return k3_dmaring_request_dual_ring(ringacc, fwd_id, 357 + fwd_ring, compl_ring); 430 358 431 359 *fwd_ring = k3_ringacc_request_ring(ringacc, fwd_id, 0); 432 360 if (!(*fwd_ring)) ··· 501 421 goto reset; 502 422 503 423 if (!occ) 504 - occ = readl(&ring->rt->occ); 424 + occ = k3_ringacc_ring_read_occ(ring); 505 425 506 426 if (occ) { 507 427 u32 db_ring_cnt, db_ring_cnt_cur; ··· 576 496 577 497 ringacc = ring->parent; 578 498 499 + /* 500 + * DMA rings: rings shared memory and configuration, only forward ring 501 + * is configured and reverse ring considered as slave. 502 + */ 503 + if (ringacc->dma_rings && (ring->flags & K3_RING_FLAG_REVERSE)) 504 + return 0; 505 + 579 506 dev_dbg(ring->parent->dev, "flags: 0x%08x\n", ring->flags); 580 507 581 508 if (!test_bit(ring->ring_id, ringacc->rings_inuse)) ··· 604 517 ring->flags = 0; 605 518 ring->ops = NULL; 606 519 ring->dma_dev = NULL; 520 + ring->asel = 0; 521 + 607 522 if (ring->proxy_id != K3_RINGACC_PROXY_NOT_USED) { 608 523 clear_bit(ring->proxy_id, ringacc->proxy_inuse); 609 524 ring->proxy = NULL; ··· 670 581 ring_cfg.count = ring->size; 671 582 ring_cfg.mode = ring->mode; 672 583 ring_cfg.size = ring->elm_size; 584 + ring_cfg.asel = ring->asel; 673 585 674 586 ret = ringacc->tisci_ring_ops->set_cfg(ringacc->tisci, &ring_cfg); 675 587 if (ret) 676 588 dev_err(ringacc->dev, "TISCI config ring fail (%d) ring_idx %d\n", 677 589 ret, ring->ring_id); 678 590 591 + return ret; 592 + } 593 + 594 + static int k3_dmaring_cfg(struct k3_ring *ring, struct k3_ring_cfg *cfg) 595 + { 596 + struct k3_ringacc *ringacc; 597 + struct k3_ring *reverse_ring; 598 + int ret = 0; 599 + 600 + if (cfg->elm_size != K3_RINGACC_RING_ELSIZE_8 || 601 + cfg->mode != K3_RINGACC_RING_MODE_RING || 602 + cfg->size & ~K3_DMARING_CFG_RING_SIZE_ELCNT_MASK) 603 + return -EINVAL; 604 + 605 + ringacc = ring->parent; 606 + 607 + /* 608 + * DMA rings: rings shared memory and configuration, only forward ring 609 + * is configured and reverse ring considered as slave. 610 + */ 611 + if (ringacc->dma_rings && (ring->flags & K3_RING_FLAG_REVERSE)) 612 + return 0; 613 + 614 + if (!test_bit(ring->ring_id, ringacc->rings_inuse)) 615 + return -EINVAL; 616 + 617 + ring->size = cfg->size; 618 + ring->elm_size = cfg->elm_size; 619 + ring->mode = cfg->mode; 620 + ring->asel = cfg->asel; 621 + ring->dma_dev = cfg->dma_dev; 622 + if (!ring->dma_dev) { 623 + dev_warn(ringacc->dev, "dma_dev is not provided for ring%d\n", 624 + ring->ring_id); 625 + ring->dma_dev = ringacc->dev; 626 + } 627 + 628 + memset(&ring->state, 0, sizeof(ring->state)); 629 + 630 + ring->ops = &k3_dmaring_fwd_ops; 631 + 632 + ring->ring_mem_virt = dma_alloc_coherent(ring->dma_dev, 633 + ring->size * (4 << ring->elm_size), 634 + &ring->ring_mem_dma, GFP_KERNEL); 635 + if (!ring->ring_mem_virt) { 636 + dev_err(ringacc->dev, "Failed to alloc ring mem\n"); 637 + ret = -ENOMEM; 638 + goto err_free_ops; 639 + } 640 + 641 + ret = k3_ringacc_ring_cfg_sci(ring); 642 + if (ret) 643 + goto err_free_mem; 644 + 645 + ring->flags |= K3_RING_FLAG_BUSY; 646 + 647 + k3_ringacc_ring_dump(ring); 648 + 649 + /* DMA rings: configure reverse ring */ 650 + reverse_ring = &ringacc->rings[ring->ring_id + ringacc->num_rings]; 651 + reverse_ring->size = cfg->size; 652 + reverse_ring->elm_size = cfg->elm_size; 653 + reverse_ring->mode = cfg->mode; 654 + reverse_ring->asel = cfg->asel; 655 + memset(&reverse_ring->state, 0, sizeof(reverse_ring->state)); 656 + reverse_ring->ops = &k3_dmaring_reverse_ops; 657 + 658 + reverse_ring->ring_mem_virt = ring->ring_mem_virt; 659 + reverse_ring->ring_mem_dma = ring->ring_mem_dma; 660 + reverse_ring->flags |= K3_RING_FLAG_BUSY; 661 + k3_ringacc_ring_dump(reverse_ring); 662 + 663 + return 0; 664 + 665 + err_free_mem: 666 + dma_free_coherent(ring->dma_dev, 667 + ring->size * (4 << ring->elm_size), 668 + ring->ring_mem_virt, 669 + ring->ring_mem_dma); 670 + err_free_ops: 671 + ring->ops = NULL; 672 + ring->proxy = NULL; 673 + ring->dma_dev = NULL; 674 + ring->asel = 0; 679 675 return ret; 680 676 } 681 677 ··· 771 597 772 598 if (!ring || !cfg) 773 599 return -EINVAL; 600 + 774 601 ringacc = ring->parent; 602 + 603 + if (ringacc->dma_rings) 604 + return k3_dmaring_cfg(ring, cfg); 775 605 776 606 if (cfg->elm_size > K3_RINGACC_RING_ELSIZE_256 || 777 607 cfg->mode >= K3_RINGACC_RING_MODE_INVALID || ··· 883 705 return -EINVAL; 884 706 885 707 if (!ring->state.free) 886 - ring->state.free = ring->size - readl(&ring->rt->occ); 708 + ring->state.free = ring->size - k3_ringacc_ring_read_occ(ring); 887 709 888 710 return ring->state.free; 889 711 } ··· 894 716 if (!ring || !(ring->flags & K3_RING_FLAG_BUSY)) 895 717 return -EINVAL; 896 718 897 - return readl(&ring->rt->occ); 719 + return k3_ringacc_ring_read_occ(ring); 898 720 } 899 721 EXPORT_SYMBOL_GPL(k3_ringacc_ring_get_occ); 900 722 ··· 1070 892 K3_RINGACC_ACCESS_MODE_POP_HEAD); 1071 893 } 1072 894 895 + /* 896 + * The element is 48 bits of address + ASEL bits in the ring. 897 + * ASEL is used by the DMAs and should be removed for the kernel as it is not 898 + * part of the physical memory address. 899 + */ 900 + static void k3_dmaring_remove_asel_from_elem(u64 *elem) 901 + { 902 + *elem &= GENMASK_ULL(K3_ADDRESS_ASEL_SHIFT - 1, 0); 903 + } 904 + 905 + static int k3_dmaring_fwd_pop(struct k3_ring *ring, void *elem) 906 + { 907 + void *elem_ptr; 908 + u32 elem_idx; 909 + 910 + /* 911 + * DMA rings: forward ring is always tied DMA channel and HW does not 912 + * maintain any state data required for POP operation and its unknown 913 + * how much elements were consumed by HW. So, to actually 914 + * do POP, the read pointer has to be recalculated every time. 915 + */ 916 + ring->state.occ = k3_ringacc_ring_read_occ(ring); 917 + if (ring->state.windex >= ring->state.occ) 918 + elem_idx = ring->state.windex - ring->state.occ; 919 + else 920 + elem_idx = ring->size - (ring->state.occ - ring->state.windex); 921 + 922 + elem_ptr = k3_ringacc_get_elm_addr(ring, elem_idx); 923 + memcpy(elem, elem_ptr, (4 << ring->elm_size)); 924 + k3_dmaring_remove_asel_from_elem(elem); 925 + 926 + ring->state.occ--; 927 + writel(-1, &ring->rt->db); 928 + 929 + dev_dbg(ring->parent->dev, "%s: occ%d Windex%d Rindex%d pos_ptr%px\n", 930 + __func__, ring->state.occ, ring->state.windex, elem_idx, 931 + elem_ptr); 932 + return 0; 933 + } 934 + 935 + static int k3_dmaring_reverse_pop(struct k3_ring *ring, void *elem) 936 + { 937 + void *elem_ptr; 938 + 939 + elem_ptr = k3_ringacc_get_elm_addr(ring, ring->state.rindex); 940 + 941 + if (ring->state.occ) { 942 + memcpy(elem, elem_ptr, (4 << ring->elm_size)); 943 + k3_dmaring_remove_asel_from_elem(elem); 944 + 945 + ring->state.rindex = (ring->state.rindex + 1) % ring->size; 946 + ring->state.occ--; 947 + writel(-1 & K3_DMARING_RT_DB_ENTRY_MASK, &ring->rt->db); 948 + } else if (ring->state.tdown_complete) { 949 + dma_addr_t *value = elem; 950 + 951 + *value = CPPI5_TDCM_MARKER; 952 + writel(K3_DMARING_RT_DB_TDOWN_ACK, &ring->rt->db); 953 + ring->state.tdown_complete = false; 954 + } 955 + 956 + dev_dbg(ring->parent->dev, "%s: occ%d index%d pos_ptr%px\n", 957 + __func__, ring->state.occ, ring->state.rindex, elem_ptr); 958 + return 0; 959 + } 960 + 1073 961 static int k3_ringacc_ring_push_mem(struct k3_ring *ring, void *elem) 1074 962 { 1075 963 void *elem_ptr; ··· 1143 899 elem_ptr = k3_ringacc_get_elm_addr(ring, ring->state.windex); 1144 900 1145 901 memcpy(elem_ptr, elem, (4 << ring->elm_size)); 902 + if (ring->parent->dma_rings) { 903 + u64 *addr = elem_ptr; 904 + 905 + *addr |= ((u64)ring->asel << K3_ADDRESS_ASEL_SHIFT); 906 + } 1146 907 1147 908 ring->state.windex = (ring->state.windex + 1) % ring->size; 1148 909 ring->state.free--; ··· 1224 975 return -EINVAL; 1225 976 1226 977 if (!ring->state.occ) 1227 - ring->state.occ = k3_ringacc_ring_get_occ(ring); 978 + k3_ringacc_ring_update_occ(ring); 1228 979 1229 980 dev_dbg(ring->parent->dev, "ring_pop: occ%d index%d\n", ring->state.occ, 1230 981 ring->state.rindex); 1231 982 1232 - if (!ring->state.occ) 983 + if (!ring->state.occ && !ring->state.tdown_complete) 1233 984 return -ENODATA; 1234 985 1235 986 if (ring->ops && ring->ops->pop_head) ··· 1247 998 return -EINVAL; 1248 999 1249 1000 if (!ring->state.occ) 1250 - ring->state.occ = k3_ringacc_ring_get_occ(ring); 1001 + k3_ringacc_ring_update_occ(ring); 1251 1002 1252 1003 dev_dbg(ring->parent->dev, "ring_pop_tail: occ%d index%d\n", 1253 1004 ring->state.occ, ring->state.rindex); ··· 1451 1202 { .compatible = "ti,am654-navss-ringacc", .data = &k3_ringacc_data, }, 1452 1203 {}, 1453 1204 }; 1205 + 1206 + struct k3_ringacc *k3_ringacc_dmarings_init(struct platform_device *pdev, 1207 + struct k3_ringacc_init_data *data) 1208 + { 1209 + struct device *dev = &pdev->dev; 1210 + struct k3_ringacc *ringacc; 1211 + void __iomem *base_rt; 1212 + struct resource *res; 1213 + int i; 1214 + 1215 + ringacc = devm_kzalloc(dev, sizeof(*ringacc), GFP_KERNEL); 1216 + if (!ringacc) 1217 + return ERR_PTR(-ENOMEM); 1218 + 1219 + ringacc->dev = dev; 1220 + ringacc->dma_rings = true; 1221 + ringacc->num_rings = data->num_rings; 1222 + ringacc->tisci = data->tisci; 1223 + ringacc->tisci_dev_id = data->tisci_dev_id; 1224 + 1225 + mutex_init(&ringacc->req_lock); 1226 + 1227 + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ringrt"); 1228 + base_rt = devm_ioremap_resource(dev, res); 1229 + if (IS_ERR(base_rt)) 1230 + return ERR_CAST(base_rt); 1231 + 1232 + ringacc->rings = devm_kzalloc(dev, 1233 + sizeof(*ringacc->rings) * 1234 + ringacc->num_rings * 2, 1235 + GFP_KERNEL); 1236 + ringacc->rings_inuse = devm_kcalloc(dev, 1237 + BITS_TO_LONGS(ringacc->num_rings), 1238 + sizeof(unsigned long), GFP_KERNEL); 1239 + 1240 + if (!ringacc->rings || !ringacc->rings_inuse) 1241 + return ERR_PTR(-ENOMEM); 1242 + 1243 + for (i = 0; i < ringacc->num_rings; i++) { 1244 + struct k3_ring *ring = &ringacc->rings[i]; 1245 + 1246 + ring->rt = base_rt + K3_DMARING_RT_REGS_STEP * i; 1247 + ring->parent = ringacc; 1248 + ring->ring_id = i; 1249 + ring->proxy_id = K3_RINGACC_PROXY_NOT_USED; 1250 + 1251 + ring = &ringacc->rings[ringacc->num_rings + i]; 1252 + ring->rt = base_rt + K3_DMARING_RT_REGS_STEP * i + 1253 + K3_DMARING_RT_REGS_REVERSE_OFS; 1254 + ring->parent = ringacc; 1255 + ring->ring_id = i; 1256 + ring->proxy_id = K3_RINGACC_PROXY_NOT_USED; 1257 + ring->flags = K3_RING_FLAG_REVERSE; 1258 + } 1259 + 1260 + ringacc->tisci_ring_ops = &ringacc->tisci->ops.rm_ring_ops; 1261 + 1262 + dev_info(dev, "Number of rings: %u\n", ringacc->num_rings); 1263 + 1264 + return ringacc; 1265 + } 1266 + EXPORT_SYMBOL_GPL(k3_ringacc_dmarings_init); 1454 1267 1455 1268 static int k3_ringacc_probe(struct platform_device *pdev) 1456 1269 {
+44
include/dt-bindings/dma/jz4775-dma.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * This header provides macros for JZ4775 DMA bindings. 4 + * 5 + * Copyright (c) 2020 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com> 6 + */ 7 + 8 + #ifndef __DT_BINDINGS_DMA_JZ4775_DMA_H__ 9 + #define __DT_BINDINGS_DMA_JZ4775_DMA_H__ 10 + 11 + /* 12 + * Request type numbers for the JZ4775 DMA controller (written to the DRTn 13 + * register for the channel). 14 + */ 15 + #define JZ4775_DMA_I2S0_TX 0x6 16 + #define JZ4775_DMA_I2S0_RX 0x7 17 + #define JZ4775_DMA_AUTO 0x8 18 + #define JZ4775_DMA_SADC_RX 0x9 19 + #define JZ4775_DMA_UART3_TX 0x0e 20 + #define JZ4775_DMA_UART3_RX 0x0f 21 + #define JZ4775_DMA_UART2_TX 0x10 22 + #define JZ4775_DMA_UART2_RX 0x11 23 + #define JZ4775_DMA_UART1_TX 0x12 24 + #define JZ4775_DMA_UART1_RX 0x13 25 + #define JZ4775_DMA_UART0_TX 0x14 26 + #define JZ4775_DMA_UART0_RX 0x15 27 + #define JZ4775_DMA_SSI0_TX 0x16 28 + #define JZ4775_DMA_SSI0_RX 0x17 29 + #define JZ4775_DMA_MSC0_TX 0x1a 30 + #define JZ4775_DMA_MSC0_RX 0x1b 31 + #define JZ4775_DMA_MSC1_TX 0x1c 32 + #define JZ4775_DMA_MSC1_RX 0x1d 33 + #define JZ4775_DMA_MSC2_TX 0x1e 34 + #define JZ4775_DMA_MSC2_RX 0x1f 35 + #define JZ4775_DMA_PCM0_TX 0x20 36 + #define JZ4775_DMA_PCM0_RX 0x21 37 + #define JZ4775_DMA_SMB0_TX 0x24 38 + #define JZ4775_DMA_SMB0_RX 0x25 39 + #define JZ4775_DMA_SMB1_TX 0x26 40 + #define JZ4775_DMA_SMB1_RX 0x27 41 + #define JZ4775_DMA_SMB2_TX 0x28 42 + #define JZ4775_DMA_SMB2_RX 0x29 43 + 44 + #endif /* __DT_BINDINGS_DMA_JZ4775_DMA_H__ */
+11
include/dt-bindings/dma/qcom-gpi.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */ 2 + /* Copyright (c) 2020, Linaro Ltd. */ 3 + 4 + #ifndef __DT_BINDINGS_DMA_QCOM_GPI_H__ 5 + #define __DT_BINDINGS_DMA_QCOM_GPI_H__ 6 + 7 + #define QCOM_GPI_SPI 1 8 + #define QCOM_GPI_UART 2 9 + #define QCOM_GPI_I2C 3 10 + 11 + #endif /* __DT_BINDINGS_DMA_QCOM_GPI_H__ */
+54
include/dt-bindings/dma/x2000-dma.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * This header provides macros for X2000 DMA bindings. 4 + * 5 + * Copyright (c) 2020 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com> 6 + */ 7 + 8 + #ifndef __DT_BINDINGS_DMA_X2000_DMA_H__ 9 + #define __DT_BINDINGS_DMA_X2000_DMA_H__ 10 + 11 + /* 12 + * Request type numbers for the X2000 DMA controller (written to the DRTn 13 + * register for the channel). 14 + */ 15 + #define X2000_DMA_AUTO 0x8 16 + #define X2000_DMA_UART5_TX 0xa 17 + #define X2000_DMA_UART5_RX 0xb 18 + #define X2000_DMA_UART4_TX 0xc 19 + #define X2000_DMA_UART4_RX 0xd 20 + #define X2000_DMA_UART3_TX 0xe 21 + #define X2000_DMA_UART3_RX 0xf 22 + #define X2000_DMA_UART2_TX 0x10 23 + #define X2000_DMA_UART2_RX 0x11 24 + #define X2000_DMA_UART1_TX 0x12 25 + #define X2000_DMA_UART1_RX 0x13 26 + #define X2000_DMA_UART0_TX 0x14 27 + #define X2000_DMA_UART0_RX 0x15 28 + #define X2000_DMA_SSI0_TX 0x16 29 + #define X2000_DMA_SSI0_RX 0x17 30 + #define X2000_DMA_SSI1_TX 0x18 31 + #define X2000_DMA_SSI1_RX 0x19 32 + #define X2000_DMA_I2C0_TX 0x24 33 + #define X2000_DMA_I2C0_RX 0x25 34 + #define X2000_DMA_I2C1_TX 0x26 35 + #define X2000_DMA_I2C1_RX 0x27 36 + #define X2000_DMA_I2C2_TX 0x28 37 + #define X2000_DMA_I2C2_RX 0x29 38 + #define X2000_DMA_I2C3_TX 0x2a 39 + #define X2000_DMA_I2C3_RX 0x2b 40 + #define X2000_DMA_I2C4_TX 0x2c 41 + #define X2000_DMA_I2C4_RX 0x2d 42 + #define X2000_DMA_I2C5_TX 0x2e 43 + #define X2000_DMA_I2C5_RX 0x2f 44 + #define X2000_DMA_UART6_TX 0x30 45 + #define X2000_DMA_UART6_RX 0x31 46 + #define X2000_DMA_UART7_TX 0x32 47 + #define X2000_DMA_UART7_RX 0x33 48 + #define X2000_DMA_UART8_TX 0x34 49 + #define X2000_DMA_UART8_RX 0x35 50 + #define X2000_DMA_UART9_TX 0x36 51 + #define X2000_DMA_UART9_RX 0x37 52 + #define X2000_DMA_SADC_RX 0x38 53 + 54 + #endif /* __DT_BINDINGS_DMA_X2000_DMA_H__ */
+16
include/linux/dma/k3-event-router.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (C) 2020 Texas Instruments Incorporated - https://www.ti.com 4 + */ 5 + 6 + #ifndef K3_EVENT_ROUTER_ 7 + #define K3_EVENT_ROUTER_ 8 + 9 + #include <linux/types.h> 10 + 11 + struct k3_event_route_data { 12 + void *priv; 13 + int (*set_event)(void *priv, u32 event); 14 + }; 15 + 16 + #endif /* K3_EVENT_ROUTER_ */
+16
include/linux/dma/k3-psil.h
··· 50 50 * @channel_tpl: Desired throughput level for the channel 51 51 * @pdma_acc32: ACC32 must be enabled on the PDMA side 52 52 * @pdma_burst: BURST must be enabled on the PDMA side 53 + * @mapped_channel_id: PKTDMA thread to channel mapping for mapped channels. 54 + * The thread must be serviced by the specified channel if 55 + * mapped_channel_id is >= 0 in case of PKTDMA 56 + * @flow_start: PKDMA flow range start of mapped channel. Unmapped 57 + * channels use flow_id == chan_id 58 + * @flow_num: PKDMA flow count of mapped channel. Unmapped channels 59 + * use flow_id == chan_id 60 + * @default_flow_id: PKDMA default (r)flow index of mapped channel. 61 + * Must be within the flow range of the mapped channel. 53 62 */ 54 63 struct psil_endpoint_config { 55 64 enum psil_endpoint_type ep_type; ··· 72 63 /* PDMA properties, valid for PSIL_EP_PDMA_* */ 73 64 unsigned pdma_acc32:1; 74 65 unsigned pdma_burst:1; 66 + 67 + /* PKDMA mapped channel */ 68 + int mapped_channel_id; 69 + /* PKTDMA tflow and rflow ranges for mapped channel */ 70 + u16 flow_start; 71 + u16 flow_num; 72 + u16 default_flow_id; 75 73 }; 76 74 77 75 int psil_set_new_ep_config(struct device *dev, const char *name,
+12
include/linux/dma/k3-udma-glue.h
··· 41 41 u32 k3_udma_glue_tx_get_hdesc_size(struct k3_udma_glue_tx_channel *tx_chn); 42 42 u32 k3_udma_glue_tx_get_txcq_id(struct k3_udma_glue_tx_channel *tx_chn); 43 43 int k3_udma_glue_tx_get_irq(struct k3_udma_glue_tx_channel *tx_chn); 44 + struct device * 45 + k3_udma_glue_tx_get_dma_device(struct k3_udma_glue_tx_channel *tx_chn); 46 + void k3_udma_glue_tx_dma_to_cppi5_addr(struct k3_udma_glue_tx_channel *tx_chn, 47 + dma_addr_t *addr); 48 + void k3_udma_glue_tx_cppi5_to_dma_addr(struct k3_udma_glue_tx_channel *tx_chn, 49 + dma_addr_t *addr); 44 50 45 51 enum { 46 52 K3_UDMA_GLUE_SRC_TAG_LO_KEEP = 0, ··· 136 130 u32 flow_idx); 137 131 int k3_udma_glue_rx_flow_disable(struct k3_udma_glue_rx_channel *rx_chn, 138 132 u32 flow_idx); 133 + struct device * 134 + k3_udma_glue_rx_get_dma_device(struct k3_udma_glue_rx_channel *rx_chn); 135 + void k3_udma_glue_rx_dma_to_cppi5_addr(struct k3_udma_glue_rx_channel *rx_chn, 136 + dma_addr_t *addr); 137 + void k3_udma_glue_rx_cppi5_to_dma_addr(struct k3_udma_glue_rx_channel *rx_chn, 138 + dma_addr_t *addr); 139 139 140 140 #endif /* K3_UDMA_GLUE_H_ */
+83
include/linux/dma/qcom-gpi-dma.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (c) 2020, Linaro Limited 4 + */ 5 + 6 + #ifndef QCOM_GPI_DMA_H 7 + #define QCOM_GPI_DMA_H 8 + 9 + /** 10 + * enum spi_transfer_cmd - spi transfer commands 11 + */ 12 + enum spi_transfer_cmd { 13 + SPI_TX = 1, 14 + SPI_RX, 15 + SPI_DUPLEX, 16 + }; 17 + 18 + /** 19 + * struct gpi_spi_config - spi config for peripheral 20 + * 21 + * @loopback_en: spi loopback enable when set 22 + * @clock_pol_high: clock polarity 23 + * @data_pol_high: data polarity 24 + * @pack_en: process tx/rx buffers as packed 25 + * @word_len: spi word length 26 + * @clk_div: source clock divider 27 + * @clk_src: serial clock 28 + * @cmd: spi cmd 29 + * @fragmentation: keep CS assserted at end of sequence 30 + * @cs: chip select toggle 31 + * @set_config: set peripheral config 32 + * @rx_len: receive length for buffer 33 + */ 34 + struct gpi_spi_config { 35 + u8 set_config; 36 + u8 loopback_en; 37 + u8 clock_pol_high; 38 + u8 data_pol_high; 39 + u8 pack_en; 40 + u8 word_len; 41 + u8 fragmentation; 42 + u8 cs; 43 + u32 clk_div; 44 + u32 clk_src; 45 + enum spi_transfer_cmd cmd; 46 + u32 rx_len; 47 + }; 48 + 49 + enum i2c_op { 50 + I2C_WRITE = 1, 51 + I2C_READ, 52 + }; 53 + 54 + /** 55 + * struct gpi_i2c_config - i2c config for peripheral 56 + * 57 + * @pack_enable: process tx/rx buffers as packed 58 + * @cycle_count: clock cycles to be sent 59 + * @high_count: high period of clock 60 + * @low_count: low period of clock 61 + * @clk_div: source clock divider 62 + * @addr: i2c bus address 63 + * @stretch: stretch the clock at eot 64 + * @set_config: set peripheral config 65 + * @rx_len: receive length for buffer 66 + * @op: i2c cmd 67 + * @muli-msg: is part of multi i2c r-w msgs 68 + */ 69 + struct gpi_i2c_config { 70 + u8 set_config; 71 + u8 pack_enable; 72 + u8 cycle_count; 73 + u8 high_count; 74 + u8 low_count; 75 + u8 addr; 76 + u8 stretch; 77 + u16 clk_div; 78 + u32 rx_len; 79 + enum i2c_op op; 80 + bool multi_msg; 81 + }; 82 + 83 + #endif /* QCOM_GPI_DMA_H */
+19
include/linux/dmaengine.h
··· 357 357 * @chan: driver channel device 358 358 * @device: sysfs device 359 359 * @dev_id: parent dma_device dev_id 360 + * @chan_dma_dev: The channel is using custom/different dma-mapping 361 + * compared to the parent dma_device 360 362 */ 361 363 struct dma_chan_dev { 362 364 struct dma_chan *chan; 363 365 struct device device; 364 366 int dev_id; 367 + bool chan_dma_dev; 365 368 }; 366 369 367 370 /** ··· 421 418 * @slave_id: Slave requester id. Only valid for slave channels. The dma 422 419 * slave peripheral will have unique id as dma requester which need to be 423 420 * pass as slave config. 421 + * @peripheral_config: peripheral configuration for programming peripheral 422 + * for dmaengine transfer 423 + * @peripheral_size: peripheral configuration buffer size 424 424 * 425 425 * This struct is passed in as configuration data to a DMA engine 426 426 * in order to set up a certain channel for DMA transport at runtime. ··· 449 443 u32 dst_port_window_size; 450 444 bool device_fc; 451 445 unsigned int slave_id; 446 + void *peripheral_config; 447 + size_t peripheral_size; 452 448 }; 453 449 454 450 /** ··· 808 800 * by tx_status 809 801 * @device_alloc_chan_resources: allocate resources and return the 810 802 * number of allocated descriptors 803 + * @device_router_config: optional callback for DMA router configuration 811 804 * @device_free_chan_resources: release DMA channel's resources 812 805 * @device_prep_dma_memcpy: prepares a memcpy operation 813 806 * @device_prep_dma_xor: prepares a xor operation ··· 883 874 enum dma_residue_granularity residue_granularity; 884 875 885 876 int (*device_alloc_chan_resources)(struct dma_chan *chan); 877 + int (*device_router_config)(struct dma_chan *chan); 886 878 void (*device_free_chan_resources)(struct dma_chan *chan); 887 879 888 880 struct dma_async_tx_descriptor *(*device_prep_dma_memcpy)( ··· 1621 1611 return "invalid"; 1622 1612 } 1623 1613 } 1614 + 1615 + static inline struct device *dmaengine_get_dma_device(struct dma_chan *chan) 1616 + { 1617 + if (chan->dev->chan_dma_dev) 1618 + return &chan->dev->device; 1619 + 1620 + return chan->device->dev; 1621 + } 1622 + 1624 1623 #endif /* DMAENGINE_H */
+17
include/linux/soc/ti/k3-ringacc.h
··· 70 70 * @dma_dev: Master device which is using and accessing to the ring 71 71 * memory when the mode is K3_RINGACC_RING_MODE_RING. Memory allocations 72 72 * should be done using this device. 73 + * @asel: Address Space Select value for physical addresses 73 74 */ 74 75 struct k3_ring_cfg { 75 76 u32 size; ··· 80 79 u32 flags; 81 80 82 81 struct device *dma_dev; 82 + u32 asel; 83 83 }; 84 84 85 85 #define K3_RINGACC_RING_ID_ANY (-1) ··· 251 249 int k3_ringacc_ring_pop_tail(struct k3_ring *ring, void *elem); 252 250 253 251 u32 k3_ringacc_get_tisci_dev_id(struct k3_ring *ring); 252 + 253 + /* DMA ring support */ 254 + struct ti_sci_handle; 255 + 256 + /** 257 + * struct struct k3_ringacc_init_data - Initialization data for DMA rings 258 + */ 259 + struct k3_ringacc_init_data { 260 + const struct ti_sci_handle *tisci; 261 + u32 tisci_dev_id; 262 + u32 num_rings; 263 + }; 264 + 265 + struct k3_ringacc *k3_ringacc_dmarings_init(struct platform_device *pdev, 266 + struct k3_ringacc_init_data *data); 254 267 255 268 #endif /* __SOC_TI_K3_RINGACC_API_H_ */
+79
include/uapi/linux/idxd.h
··· 26 26 #define IDXD_OP_FLAG_DRDBK 0x4000 27 27 #define IDXD_OP_FLAG_DSTS 0x8000 28 28 29 + /* IAX */ 30 + #define IDXD_OP_FLAG_RD_SRC2_AECS 0x010000 31 + 29 32 /* Opcode */ 30 33 enum dsa_opcode { 31 34 DSA_OPCODE_NOOP = 0, ··· 48 45 DSA_OPCODE_DIF_STRP, 49 46 DSA_OPCODE_DIF_UPDT, 50 47 DSA_OPCODE_CFLUSH = 0x20, 48 + }; 49 + 50 + enum iax_opcode { 51 + IAX_OPCODE_NOOP = 0, 52 + IAX_OPCODE_DRAIN = 2, 53 + IAX_OPCODE_MEMMOVE, 54 + IAX_OPCODE_DECOMPRESS = 0x42, 55 + IAX_OPCODE_COMPRESS, 51 56 }; 52 57 53 58 /* Completion record status */ ··· 89 78 DSA_COMP_HW_ERR1, 90 79 DSA_COMP_HW_ERR_DRB, 91 80 DSA_COMP_TRANSLATION_FAIL, 81 + }; 82 + 83 + enum iax_completion_status { 84 + IAX_COMP_NONE = 0, 85 + IAX_COMP_SUCCESS, 86 + IAX_COMP_PAGE_FAULT_IR = 0x04, 87 + IAX_COMP_OUTBUF_OVERFLOW, 88 + IAX_COMP_BAD_OPCODE = 0x10, 89 + IAX_COMP_INVALID_FLAGS, 90 + IAX_COMP_NOZERO_RESERVE, 91 + IAX_COMP_INVALID_SIZE, 92 + IAX_COMP_OVERLAP_BUFFERS = 0x16, 93 + IAX_COMP_INT_HANDLE_INVAL = 0x19, 94 + IAX_COMP_CRA_XLAT, 95 + IAX_COMP_CRA_ALIGN, 96 + IAX_COMP_ADDR_ALIGN, 97 + IAX_COMP_PRIV_BAD, 98 + IAX_COMP_TRAFFIC_CLASS_CONF, 99 + IAX_COMP_PFAULT_RDBA, 100 + IAX_COMP_HW_ERR1, 101 + IAX_COMP_HW_ERR_DRB, 102 + IAX_COMP_TRANSLATION_FAIL, 103 + IAX_COMP_PRS_TIMEOUT, 104 + IAX_COMP_WATCHDOG, 105 + IAX_COMP_INVALID_COMP_FLAG = 0x30, 106 + IAX_COMP_INVALID_FILTER_FLAG, 107 + IAX_COMP_INVALID_NUM_ELEMS = 0x33, 92 108 }; 93 109 94 110 #define DSA_COMP_STATUS_MASK 0x7f ··· 201 163 }; 202 164 } __attribute__((packed)); 203 165 166 + struct iax_hw_desc { 167 + uint32_t pasid:20; 168 + uint32_t rsvd:11; 169 + uint32_t priv:1; 170 + uint32_t flags:24; 171 + uint32_t opcode:8; 172 + uint64_t completion_addr; 173 + uint64_t src1_addr; 174 + uint64_t dst_addr; 175 + uint32_t src1_size; 176 + uint16_t int_handle; 177 + union { 178 + uint16_t compr_flags; 179 + uint16_t decompr_flags; 180 + }; 181 + uint64_t src2_addr; 182 + uint32_t max_dst_size; 183 + uint32_t src2_size; 184 + uint32_t filter_flags; 185 + uint32_t num_inputs; 186 + } __attribute__((packed)); 187 + 204 188 struct dsa_raw_desc { 205 189 uint64_t field[8]; 206 190 } __attribute__((packed)); ··· 281 221 282 222 struct dsa_raw_completion_record { 283 223 uint64_t field[4]; 224 + } __attribute__((packed)); 225 + 226 + struct iax_completion_record { 227 + volatile uint8_t status; 228 + uint8_t error_code; 229 + uint16_t rsvd; 230 + uint32_t bytes_completed; 231 + uint64_t fault_addr; 232 + uint32_t invalid_flags; 233 + uint32_t rsvd2; 234 + uint32_t output_size; 235 + uint8_t output_bits; 236 + uint8_t rsvd3; 237 + uint16_t rsvd4; 238 + uint64_t rsvd5[4]; 239 + } __attribute__((packed)); 240 + 241 + struct iax_raw_completion_record { 242 + uint64_t field[8]; 284 243 } __attribute__((packed)); 285 244 286 245 #endif