1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (C) 2013,2018,2020-2021 Intel Corporation
4 #include <linux/bitops.h>
5 #include <linux/dmaengine.h>
6 #include <linux/errno.h>
9 #include <linux/slab.h>
10 #include <linux/types.h>
14 #define DMA_CTL_CH(x) (0x1000 + (x) * 4)
15 #define DMA_SRC_ADDR_FILLIN(x) (0x1100 + (x) * 4)
16 #define DMA_DST_ADDR_FILLIN(x) (0x1200 + (x) * 4)
17 #define DMA_XBAR_SEL(x) (0x1300 + (x) * 4)
18 #define DMA_REGACCESS_CHID_CFG (0x1400)
20 #define CTL_CH_TRANSFER_MODE_MASK GENMASK(1, 0)
21 #define CTL_CH_TRANSFER_MODE_S2S 0
22 #define CTL_CH_TRANSFER_MODE_S2D 1
23 #define CTL_CH_TRANSFER_MODE_D2S 2
24 #define CTL_CH_TRANSFER_MODE_D2D 3
25 #define CTL_CH_RD_RS_MASK GENMASK(4, 3)
26 #define CTL_CH_WR_RS_MASK GENMASK(6, 5)
27 #define CTL_CH_RD_NON_SNOOP_BIT BIT(8)
28 #define CTL_CH_WR_NON_SNOOP_BIT BIT(9)
30 #define XBAR_SEL_DEVID_MASK GENMASK(15, 0)
31 #define XBAR_SEL_RX_TX_BIT BIT(16)
32 #define XBAR_SEL_RX_TX_SHIFT 16
34 #define REGACCESS_CHID_MASK GENMASK(2, 0)
36 static unsigned int idma32_get_slave_devfn(struct dw_dma_chan
*dwc
)
38 struct device
*slave
= dwc
->chan
.slave
;
40 if (!slave
|| !dev_is_pci(slave
))
43 return to_pci_dev(slave
)->devfn
;
46 static void idma32_initialize_chan_xbar(struct dw_dma_chan
*dwc
)
48 struct dw_dma
*dw
= to_dw_dma(dwc
->chan
.device
);
49 void __iomem
*misc
= __dw_regs(dw
);
50 u32 cfghi
= 0, cfglo
= 0;
54 /* DMA Channel ID Configuration register must be programmed first */
55 value
= readl(misc
+ DMA_REGACCESS_CHID_CFG
);
57 value
&= ~REGACCESS_CHID_MASK
;
58 value
|= dwc
->chan
.chan_id
;
60 writel(value
, misc
+ DMA_REGACCESS_CHID_CFG
);
62 /* Configure channel attributes */
63 value
= readl(misc
+ DMA_CTL_CH(dwc
->chan
.chan_id
));
65 value
&= ~(CTL_CH_RD_NON_SNOOP_BIT
| CTL_CH_WR_NON_SNOOP_BIT
);
66 value
&= ~(CTL_CH_RD_RS_MASK
| CTL_CH_WR_RS_MASK
);
67 value
&= ~CTL_CH_TRANSFER_MODE_MASK
;
69 switch (dwc
->direction
) {
71 value
|= CTL_CH_TRANSFER_MODE_D2S
;
72 value
|= CTL_CH_WR_NON_SNOOP_BIT
;
75 value
|= CTL_CH_TRANSFER_MODE_S2D
;
76 value
|= CTL_CH_RD_NON_SNOOP_BIT
;
80 * Memory-to-Memory and Device-to-Device are ignored for now.
82 * For Memory-to-Memory transfers we would need to set mode
83 * and disable snooping on both sides.
88 writel(value
, misc
+ DMA_CTL_CH(dwc
->chan
.chan_id
));
90 /* Configure crossbar selection */
91 value
= readl(misc
+ DMA_XBAR_SEL(dwc
->chan
.chan_id
));
94 value
&= ~XBAR_SEL_DEVID_MASK
;
95 value
|= idma32_get_slave_devfn(dwc
);
97 switch (dwc
->direction
) {
99 value
|= XBAR_SEL_RX_TX_BIT
;
102 value
&= ~XBAR_SEL_RX_TX_BIT
;
105 /* Memory-to-Memory and Device-to-Device are ignored for now */
109 writel(value
, misc
+ DMA_XBAR_SEL(dwc
->chan
.chan_id
));
111 /* Configure DMA channel low and high registers */
112 switch (dwc
->direction
) {
114 dst_id
= dwc
->chan
.chan_id
;
115 src_id
= dwc
->dws
.src_id
;
118 dst_id
= dwc
->dws
.dst_id
;
119 src_id
= dwc
->chan
.chan_id
;
122 /* Memory-to-Memory and Device-to-Device are ignored for now */
126 /* Set default burst alignment */
127 cfglo
|= IDMA32C_CFGL_DST_BURST_ALIGN
| IDMA32C_CFGL_SRC_BURST_ALIGN
;
129 /* Low 4 bits of the request lines */
130 cfghi
|= IDMA32C_CFGH_DST_PER(dst_id
& 0xf);
131 cfghi
|= IDMA32C_CFGH_SRC_PER(src_id
& 0xf);
133 /* Request line extension (2 bits) */
134 cfghi
|= IDMA32C_CFGH_DST_PER_EXT(dst_id
>> 4 & 0x3);
135 cfghi
|= IDMA32C_CFGH_SRC_PER_EXT(src_id
>> 4 & 0x3);
137 channel_writel(dwc
, CFG_LO
, cfglo
);
138 channel_writel(dwc
, CFG_HI
, cfghi
);
141 static void idma32_initialize_chan_generic(struct dw_dma_chan
*dwc
)
146 /* Set default burst alignment */
147 cfglo
|= IDMA32C_CFGL_DST_BURST_ALIGN
| IDMA32C_CFGL_SRC_BURST_ALIGN
;
149 /* Low 4 bits of the request lines */
150 cfghi
|= IDMA32C_CFGH_DST_PER(dwc
->dws
.dst_id
& 0xf);
151 cfghi
|= IDMA32C_CFGH_SRC_PER(dwc
->dws
.src_id
& 0xf);
153 /* Request line extension (2 bits) */
154 cfghi
|= IDMA32C_CFGH_DST_PER_EXT(dwc
->dws
.dst_id
>> 4 & 0x3);
155 cfghi
|= IDMA32C_CFGH_SRC_PER_EXT(dwc
->dws
.src_id
>> 4 & 0x3);
157 channel_writel(dwc
, CFG_LO
, cfglo
);
158 channel_writel(dwc
, CFG_HI
, cfghi
);
161 static void idma32_suspend_chan(struct dw_dma_chan
*dwc
, bool drain
)
163 u32 cfglo
= channel_readl(dwc
, CFG_LO
);
166 cfglo
|= IDMA32C_CFGL_CH_DRAIN
;
168 channel_writel(dwc
, CFG_LO
, cfglo
| DWC_CFGL_CH_SUSP
);
171 static void idma32_resume_chan(struct dw_dma_chan
*dwc
, bool drain
)
173 u32 cfglo
= channel_readl(dwc
, CFG_LO
);
176 cfglo
&= ~IDMA32C_CFGL_CH_DRAIN
;
178 channel_writel(dwc
, CFG_LO
, cfglo
& ~DWC_CFGL_CH_SUSP
);
181 static u32
idma32_bytes2block(struct dw_dma_chan
*dwc
,
182 size_t bytes
, unsigned int width
, size_t *len
)
186 if (bytes
> dwc
->block_size
) {
187 block
= dwc
->block_size
;
188 *len
= dwc
->block_size
;
197 static size_t idma32_block2bytes(struct dw_dma_chan
*dwc
, u32 block
, u32 width
)
199 return IDMA32C_CTLH_BLOCK_TS(block
);
202 static inline u8
idma32_encode_maxburst(u32 maxburst
)
204 return maxburst
> 1 ? fls(maxburst
) - 1 : 0;
207 static u32
idma32_prepare_ctllo(struct dw_dma_chan
*dwc
)
209 struct dma_slave_config
*sconfig
= &dwc
->dma_sconfig
;
210 u8 smsize
= 0, dmsize
= 0;
212 if (dwc
->direction
== DMA_MEM_TO_DEV
)
213 dmsize
= idma32_encode_maxburst(sconfig
->dst_maxburst
);
214 else if (dwc
->direction
== DMA_DEV_TO_MEM
)
215 smsize
= idma32_encode_maxburst(sconfig
->src_maxburst
);
217 return DWC_CTLL_LLP_D_EN
| DWC_CTLL_LLP_S_EN
|
218 DWC_CTLL_DST_MSIZE(dmsize
) | DWC_CTLL_SRC_MSIZE(smsize
);
221 static void idma32_set_device_name(struct dw_dma
*dw
, int id
)
223 snprintf(dw
->name
, sizeof(dw
->name
), "idma32:dmac%d", id
);
227 * Program FIFO size of channels.
229 * By default full FIFO (512 bytes) is assigned to channel 0. Here we
230 * slice FIFO on equal parts between channels.
232 static void idma32_fifo_partition(struct dw_dma
*dw
)
234 u64 value
= IDMA32C_FP_PSIZE_CH0(64) | IDMA32C_FP_PSIZE_CH1(64) |
236 u64 fifo_partition
= 0;
238 /* Fill FIFO_PARTITION low bits (Channels 0..1, 4..5) */
239 fifo_partition
|= value
<< 0;
241 /* Fill FIFO_PARTITION high bits (Channels 2..3, 6..7) */
242 fifo_partition
|= value
<< 32;
244 /* Program FIFO Partition registers - 64 bytes per channel */
245 idma32_writeq(dw
, FIFO_PARTITION1
, fifo_partition
);
246 idma32_writeq(dw
, FIFO_PARTITION0
, fifo_partition
);
249 static void idma32_disable(struct dw_dma
*dw
)
252 idma32_fifo_partition(dw
);
255 static void idma32_enable(struct dw_dma
*dw
)
257 idma32_fifo_partition(dw
);
261 int idma32_dma_probe(struct dw_dma_chip
*chip
)
265 dw
= devm_kzalloc(chip
->dev
, sizeof(*dw
), GFP_KERNEL
);
269 /* Channel operations */
270 if (chip
->pdata
->quirks
& DW_DMA_QUIRK_XBAR_PRESENT
)
271 dw
->initialize_chan
= idma32_initialize_chan_xbar
;
273 dw
->initialize_chan
= idma32_initialize_chan_generic
;
274 dw
->suspend_chan
= idma32_suspend_chan
;
275 dw
->resume_chan
= idma32_resume_chan
;
276 dw
->prepare_ctllo
= idma32_prepare_ctllo
;
277 dw
->bytes2block
= idma32_bytes2block
;
278 dw
->block2bytes
= idma32_block2bytes
;
280 /* Device operations */
281 dw
->set_device_name
= idma32_set_device_name
;
282 dw
->disable
= idma32_disable
;
283 dw
->enable
= idma32_enable
;
286 return do_dma_probe(chip
);
288 EXPORT_SYMBOL_GPL(idma32_dma_probe
);
290 int idma32_dma_remove(struct dw_dma_chip
*chip
)
292 return do_dma_remove(chip
);
294 EXPORT_SYMBOL_GPL(idma32_dma_remove
);