Lines Matching +full:memcpy +full:- +full:channels

1 // SPDX-License-Identifier: GPL-2.0+
3 * Direct Memory Access U-Class Simulation driver
13 #include <dma-uclass.h>
14 #include <dt-structs.h>
32 struct sandbox_dma_chan channels[SANDBOX_DMA_CH_CNT]; member
42 memcpy(dst, src, len); in sandbox_dma_transfer()
50 struct sandbox_dma_dev *ud = dev_get_priv(dma->dev); in sandbox_dma_of_xlate()
53 debug("%s(dma id=%u)\n", __func__, args->args[0]); in sandbox_dma_of_xlate()
55 if (args->args[0] >= SANDBOX_DMA_CH_CNT) in sandbox_dma_of_xlate()
56 return -EINVAL; in sandbox_dma_of_xlate()
58 dma->id = args->args[0]; in sandbox_dma_of_xlate()
60 uc = &ud->channels[dma->id]; in sandbox_dma_of_xlate()
62 if (dma->id == 1) in sandbox_dma_of_xlate()
63 uc->dir = DMA_MEM_TO_DEV; in sandbox_dma_of_xlate()
64 else if (dma->id == 2) in sandbox_dma_of_xlate()
65 uc->dir = DMA_DEV_TO_MEM; in sandbox_dma_of_xlate()
67 uc->dir = DMA_MEM_TO_MEM; in sandbox_dma_of_xlate()
68 debug("%s(dma id=%lu dir=%d)\n", __func__, dma->id, uc->dir); in sandbox_dma_of_xlate()
75 struct sandbox_dma_dev *ud = dev_get_priv(dma->dev); in sandbox_dma_request()
78 if (dma->id >= SANDBOX_DMA_CH_CNT) in sandbox_dma_request()
79 return -EINVAL; in sandbox_dma_request()
81 uc = &ud->channels[dma->id]; in sandbox_dma_request()
82 if (uc->in_use) in sandbox_dma_request()
83 return -EBUSY; in sandbox_dma_request()
85 uc->in_use = true; in sandbox_dma_request()
86 debug("%s(dma id=%lu in_use=%d)\n", __func__, dma->id, uc->in_use); in sandbox_dma_request()
93 struct sandbox_dma_dev *ud = dev_get_priv(dma->dev); in sandbox_dma_free()
96 if (dma->id >= SANDBOX_DMA_CH_CNT) in sandbox_dma_free()
97 return -EINVAL; in sandbox_dma_free()
99 uc = &ud->channels[dma->id]; in sandbox_dma_free()
100 if (!uc->in_use) in sandbox_dma_free()
101 return -EINVAL; in sandbox_dma_free()
103 uc->in_use = false; in sandbox_dma_free()
104 ud->buf_rx = NULL; in sandbox_dma_free()
105 ud->data_len = 0; in sandbox_dma_free()
106 debug("%s(dma id=%lu in_use=%d)\n", __func__, dma->id, uc->in_use); in sandbox_dma_free()
113 struct sandbox_dma_dev *ud = dev_get_priv(dma->dev); in sandbox_dma_enable()
116 if (dma->id >= SANDBOX_DMA_CH_CNT) in sandbox_dma_enable()
117 return -EINVAL; in sandbox_dma_enable()
119 uc = &ud->channels[dma->id]; in sandbox_dma_enable()
120 if (!uc->in_use) in sandbox_dma_enable()
121 return -EINVAL; in sandbox_dma_enable()
122 if (uc->enabled) in sandbox_dma_enable()
123 return -EINVAL; in sandbox_dma_enable()
125 uc->enabled = true; in sandbox_dma_enable()
126 debug("%s(dma id=%lu enabled=%d)\n", __func__, dma->id, uc->enabled); in sandbox_dma_enable()
133 struct sandbox_dma_dev *ud = dev_get_priv(dma->dev); in sandbox_dma_disable()
136 if (dma->id >= SANDBOX_DMA_CH_CNT) in sandbox_dma_disable()
137 return -EINVAL; in sandbox_dma_disable()
139 uc = &ud->channels[dma->id]; in sandbox_dma_disable()
140 if (!uc->in_use) in sandbox_dma_disable()
141 return -EINVAL; in sandbox_dma_disable()
142 if (!uc->enabled) in sandbox_dma_disable()
143 return -EINVAL; in sandbox_dma_disable()
145 uc->enabled = false; in sandbox_dma_disable()
146 debug("%s(dma id=%lu enabled=%d)\n", __func__, dma->id, uc->enabled); in sandbox_dma_disable()
154 struct sandbox_dma_dev *ud = dev_get_priv(dma->dev); in sandbox_dma_send()
157 if (dma->id >= SANDBOX_DMA_CH_CNT) in sandbox_dma_send()
158 return -EINVAL; in sandbox_dma_send()
160 return -EINVAL; in sandbox_dma_send()
162 debug("%s(dma id=%lu)\n", __func__, dma->id); in sandbox_dma_send()
164 uc = &ud->channels[dma->id]; in sandbox_dma_send()
165 if (uc->dir != DMA_MEM_TO_DEV) in sandbox_dma_send()
166 return -EINVAL; in sandbox_dma_send()
167 if (!uc->in_use) in sandbox_dma_send()
168 return -EINVAL; in sandbox_dma_send()
169 if (!uc->enabled) in sandbox_dma_send()
170 return -EINVAL; in sandbox_dma_send()
172 return -EINVAL; in sandbox_dma_send()
174 memcpy(ud->buf, src, len); in sandbox_dma_send()
175 ud->data_len = len; in sandbox_dma_send()
176 ud->meta = *((u32 *)metadata); in sandbox_dma_send()
179 __func__, dma->id, len, ud->meta); in sandbox_dma_send()
186 struct sandbox_dma_dev *ud = dev_get_priv(dma->dev); in sandbox_dma_receive()
189 if (dma->id >= SANDBOX_DMA_CH_CNT) in sandbox_dma_receive()
190 return -EINVAL; in sandbox_dma_receive()
192 return -EINVAL; in sandbox_dma_receive()
194 uc = &ud->channels[dma->id]; in sandbox_dma_receive()
195 if (uc->dir != DMA_DEV_TO_MEM) in sandbox_dma_receive()
196 return -EINVAL; in sandbox_dma_receive()
197 if (!uc->in_use) in sandbox_dma_receive()
198 return -EINVAL; in sandbox_dma_receive()
199 if (!uc->enabled) in sandbox_dma_receive()
200 return -EINVAL; in sandbox_dma_receive()
201 if (!ud->data_len) in sandbox_dma_receive()
204 if (ud->buf_rx) { in sandbox_dma_receive()
205 memcpy(ud->buf_rx, ud->buf, ud->data_len); in sandbox_dma_receive()
206 *dst = ud->buf_rx; in sandbox_dma_receive()
208 memcpy(*dst, ud->buf, ud->data_len); in sandbox_dma_receive()
211 *((u32 *)metadata) = ud->meta; in sandbox_dma_receive()
214 __func__, dma->id, ud->data_len, ud->meta, *dst); in sandbox_dma_receive()
216 return ud->data_len; in sandbox_dma_receive()
221 struct sandbox_dma_dev *ud = dev_get_priv(dma->dev); in sandbox_dma_prepare_rcv_buf()
223 ud->buf_rx = dst; in sandbox_dma_prepare_rcv_buf()
246 uc_priv->supported = DMA_SUPPORTS_MEM_TO_MEM | in sandbox_dma_probe()
250 ud->ch_count = SANDBOX_DMA_CH_CNT; in sandbox_dma_probe()
251 ud->buf_rx = NULL; in sandbox_dma_probe()
252 ud->meta = 0; in sandbox_dma_probe()
253 ud->data_len = 0; in sandbox_dma_probe()
255 pr_err("Number of channels: %u\n", ud->ch_count); in sandbox_dma_probe()
257 for (i = 0; i < ud->ch_count; i++) { in sandbox_dma_probe()
258 struct sandbox_dma_chan *uc = &ud->channels[i]; in sandbox_dma_probe()
260 uc->ud = ud; in sandbox_dma_probe()
261 uc->id = i; in sandbox_dma_probe()
262 sprintf(uc->name, "DMA chan%d\n", i); in sandbox_dma_probe()
263 uc->in_use = false; in sandbox_dma_probe()
264 uc->enabled = false; in sandbox_dma_probe()
276 .name = "sandbox-dma",