Sound Open Firmware
Loading...
Searching...
No Matches
dma-legacy.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 *
3 * Copyright(c) 2024 Intel Corporation.
4 */
5
6#ifndef __SOF_LIB_DMA_LEGACY_H__
7#define __SOF_LIB_DMA_LEGACY_H__
8
9/* DMA attributes */
10#define DMA_ATTR_BUFFER_ALIGNMENT 0
11#define DMA_ATTR_COPY_ALIGNMENT 1
12#define DMA_ATTR_BUFFER_ADDRESS_ALIGNMENT 2
13#define DMA_ATTR_BUFFER_PERIOD_COUNT 3
14
15/* Compatibility for definitions without SOF_ namespace */
16#define DMA_DIR_MEM_TO_MEM SOF_DMA_DIR_MEM_TO_MEM
17#define DMA_DIR_HMEM_TO_LMEM SOF_DMA_DIR_HMEM_TO_LMEM
18#define DMA_DIR_LMEM_TO_HMEM SOF_DMA_DIR_LMEM_TO_HMEM
19#define DMA_DIR_MEM_TO_DEV SOF_DMA_DIR_MEM_TO_DEV
20#define DMA_DIR_DEV_TO_MEM SOF_DMA_DIR_DEV_TO_MEM
21#define DMA_DIR_DEV_TO_DEV SOF_DMA_DIR_DEV_TO_DEV
22#define DMA_COPY_BLOCKING SOF_DMA_COPY_BLOCKING
23#define DMA_COPY_ONE_SHOT SOF_DMA_COPY_ONE_SHOT
24#define DMA_DEV_HOST SOF_DMA_DEV_HOST
25#define DMA_ACCESS_EXCLUSIVE SOF_DMA_ACCESS_EXCLUSIVE
26#define DMA_ACCESS_SHARED SOF_DMA_ACCESS_SHARED
27#define DMA_CHAN_INVALID SOF_DMA_CHAN_INVALID
28#define DMA_CORE_INVALID SOF_DMA_CORE_INVALID
29
30struct dma *dma_get(uint32_t dir, uint32_t caps, uint32_t dev, uint32_t flags);
31void dma_put(struct dma *dma);
32
37
38/* DMA interrupt commands */
45
46/* DMA operations */
47struct dma_ops {
48
49 struct dma_chan_data *(*channel_get)(struct dma *dma,
50 unsigned int req_channel);
51 void (*channel_put)(struct dma_chan_data *channel);
52
53 int (*start)(struct dma_chan_data *channel);
54 int (*stop)(struct dma_chan_data *channel);
55 int (*stop_delayed)(struct dma_chan_data *channel);
56 int (*copy)(struct dma_chan_data *channel, int bytes, uint32_t flags);
57 int (*pause)(struct dma_chan_data *channel);
58 int (*release)(struct dma_chan_data *channel);
59 int (*status)(struct dma_chan_data *channel,
60 struct dma_chan_status *status, uint8_t direction);
61
62 int (*set_config)(struct dma_chan_data *channel,
63 struct dma_sg_config *config);
64
65 int (*probe)(struct dma *dma);
66 int (*remove)(struct dma *dma);
67
68 int (*get_data_size)(struct dma_chan_data *channel, uint32_t *avail,
69 uint32_t *free);
70
71 int (*get_attribute)(struct dma *dma, uint32_t type, uint32_t *value);
72
73 int (*interrupt)(struct dma_chan_data *channel, enum dma_irq_cmd cmd);
74};
75
76/* DMA API
77 * Programming flow is :-
78 *
79 * 1) dma_channel_get()
80 * 2) notifier_register()
81 * 3) dma_set_config()
82 * 4) dma_start()
83 * ... DMA now running ...
84 * 5) dma_stop()
85 * 6) dma_stop_delayed()
86 * 7) dma_channel_put()
87 */
88
89static inline struct dma_chan_data *dma_channel_get_legacy(struct dma *dma,
90 int req_channel)
91{
92 if (!dma || !dma->ops || !dma->ops->channel_get)
93 return NULL;
94
95 struct dma_chan_data *chan = dma->ops->channel_get(dma, req_channel);
96
97 return chan;
98}
99
100static inline void dma_channel_put_legacy(struct dma_chan_data *channel)
101{
102 channel->dma->ops->channel_put(channel);
103}
104
105static inline int dma_start_legacy(struct dma_chan_data *channel)
106{
107 return channel->dma->ops->start(channel);
108}
109
110static inline int dma_stop_legacy(struct dma_chan_data *channel)
111{
112 if (channel->dma->ops->stop)
113 return channel->dma->ops->stop(channel);
114
115 return 0;
116}
117
118static inline int dma_stop_delayed_legacy(struct dma_chan_data *channel)
119{
120 if (channel->dma->ops->stop_delayed)
121 return channel->dma->ops->stop_delayed(channel);
122
123 return 0;
124}
125
132static inline int dma_copy_legacy(struct dma_chan_data *channel, int bytes,
133 uint32_t flags)
134{
135 return channel->dma->ops->copy(channel, bytes, flags);
136}
137
138
139static inline int dma_pause_legacy(struct dma_chan_data *channel)
140{
141 if (channel->dma->ops->pause)
142 return channel->dma->ops->pause(channel);
143
144 return 0;
145}
146
147static inline int dma_release_legacy(struct dma_chan_data *channel)
148{
149 if (channel->dma->ops->release)
150 return channel->dma->ops->release(channel);
151
152 return 0;
153}
154
155static inline int dma_status_legacy(struct dma_chan_data *channel,
156 struct dma_chan_status *status, uint8_t direction)
157{
158 return channel->dma->ops->status(channel, status, direction);
159}
160
161static inline int dma_set_config_legacy(struct dma_chan_data *channel,
162 struct dma_sg_config *config)
163{
164 return channel->dma->ops->set_config(channel, config);
165}
166
167static inline int dma_probe_legacy(struct dma *dma)
168{
169 return dma->ops->probe(dma);
170}
171
172static inline int dma_remove_legacy(struct dma *dma)
173{
174 return dma->ops->remove(dma);
175}
176
177static inline int dma_get_data_size_legacy(struct dma_chan_data *channel,
178 uint32_t *avail, uint32_t *free)
179{
180 return channel->dma->ops->get_data_size(channel, avail, free);
181}
182
183static inline int dma_get_attribute_legacy(struct dma *dma, uint32_t type,
184 uint32_t *value)
185{
186 return dma->ops->get_attribute(dma, type, value);
187}
188
189static inline int dma_interrupt_legacy(struct dma_chan_data *channel,
190 enum dma_irq_cmd cmd)
191{
192 return channel->dma->ops->interrupt(channel, cmd);
193}
194
195#define dma_set_drvdata(dma, data) \
196 (dma->priv_data = data)
197#define dma_get_drvdata(dma) \
198 dma->priv_data
199#define dma_base(dma) \
200 dma->plat_data.base
201#define dma_irq(dma) \
202 dma->plat_data.irq
203#define dma_irq_name(dma) \
204 dma->plat_data.irq_name
205#define dma_chan_size(dma) \
206 dma->plat_data.chan_size
207#define dma_chan_base(dma, chan) \
208 (dma->plat_data.base + chan * dma->plat_data.chan_size)
209#define dma_chan_get_data(chan) \
210 ((chan)->priv_data)
211#define dma_chan_set_data(chan, data) \
212 ((chan)->priv_data = data)
213
214/* DMA hardware register operations */
215static inline uint32_t dma_reg_read(struct dma *dma, uint32_t reg)
216{
217 return io_reg_read(dma_base(dma) + reg);
218}
219
220static inline uint16_t dma_reg_read16(struct dma *dma, uint32_t reg)
221{
222 return io_reg_read16(dma_base(dma) + reg);
223}
224
225static inline void dma_reg_write(struct dma *dma, uint32_t reg, uint32_t value)
226{
228}
229
230static inline void dma_reg_write16(struct dma *dma, uint32_t reg,
231 uint16_t value)
232{
234}
235
236static inline void dma_reg_update_bits(struct dma *dma, uint32_t reg,
237 uint32_t mask, uint32_t value)
238{
239 io_reg_update_bits(dma_base(dma) + reg, mask, value);
240}
241
242static inline uint32_t dma_chan_reg_read(struct dma_chan_data *channel,
243 uint32_t reg)
244{
245 return io_reg_read(dma_chan_base(channel->dma, channel->index) + reg);
246}
247
248static inline uint16_t dma_chan_reg_read16(struct dma_chan_data *channel,
249 uint32_t reg)
250{
251 return io_reg_read16(dma_chan_base(channel->dma, channel->index) + reg);
252}
253
254static inline void dma_chan_reg_write(struct dma_chan_data *channel,
255 uint32_t reg, uint32_t value)
256{
257 io_reg_write(dma_chan_base(channel->dma, channel->index) + reg, value);
258}
259
260static inline void dma_chan_reg_write16(struct dma_chan_data *channel,
261 uint32_t reg, uint16_t value)
262{
263 io_reg_write16(dma_chan_base(channel->dma, channel->index) + reg,
264 value);
265}
266
267static inline void dma_chan_reg_update_bits(struct dma_chan_data *channel,
268 uint32_t reg, uint32_t mask,
269 uint32_t value)
270{
271 io_reg_update_bits(dma_chan_base(channel->dma, channel->index) + reg,
272 mask, value);
273}
274
275static inline void dma_chan_reg_update_bits16(struct dma_chan_data *channel,
276 uint32_t reg, uint16_t mask,
277 uint16_t value)
278{
279 io_reg_update_bits16(dma_chan_base(channel->dma, channel->index) + reg,
280 mask, value);
281}
282
283/* init dma copy context */
284int dma_copy_new(struct dma_copy *dc);
285
286/* free dma copy context resources */
287static inline void dma_copy_free(struct dma_copy *dc)
288{
290}
291
292/* DMA copy data from host to DSP */
293int dma_copy_from_host(struct dma_copy *dc, struct dma_sg_config *host_sg,
294 int32_t host_offset, void *local_ptr, int32_t size);
296 struct dma_sg_config *host_sg,
297 int32_t host_offset, void *local_ptr,
298 int32_t size);
299
300/* DMA copy data from DSP to host */
301int dma_copy_to_host(struct dma_copy *dc, struct dma_sg_config *host_sg,
302 int32_t host_offset, void *local_ptr, int32_t size);
303int dma_copy_to_host_nowait(struct dma_copy *dc, struct dma_sg_config *host_sg,
304 int32_t host_offset, void *local_ptr, int32_t size);
305
306
307int dma_copy_set_stream_tag(struct dma_copy *dc, uint32_t stream_tag);
308
309#endif /* __SOF_LIB_DMA_LEGACY_H__ */
static void dma_chan_reg_update_bits(struct dma_chan_data *channel, uint32_t reg, uint32_t mask, uint32_t value)
Definition dma-legacy.h:267
static uint16_t dma_reg_read16(struct dma *dma, uint32_t reg)
Definition dma-legacy.h:220
static void dma_reg_write16(struct dma *dma, uint32_t reg, uint16_t value)
Definition dma-legacy.h:230
static int dma_release_legacy(struct dma_chan_data *channel)
Definition dma-legacy.h:147
static uint32_t dma_reg_read(struct dma *dma, uint32_t reg)
Definition dma-legacy.h:215
static void dma_copy_free(struct dma_copy *dc)
Definition dma-legacy.h:287
static void dma_reg_write(struct dma *dma, uint32_t reg, uint32_t value)
Definition dma-legacy.h:225
#define dma_chan_base(dma, chan)
Definition dma-legacy.h:207
static int dma_stop_legacy(struct dma_chan_data *channel)
Definition dma-legacy.h:110
static int dma_start_legacy(struct dma_chan_data *channel)
Definition dma-legacy.h:105
static void dma_reg_update_bits(struct dma *dma, uint32_t reg, uint32_t mask, uint32_t value)
Definition dma-legacy.h:236
static void dma_chan_reg_write16(struct dma_chan_data *channel, uint32_t reg, uint16_t value)
Definition dma-legacy.h:260
static uint16_t dma_chan_reg_read16(struct dma_chan_data *channel, uint32_t reg)
Definition dma-legacy.h:248
static void dma_chan_reg_update_bits16(struct dma_chan_data *channel, uint32_t reg, uint16_t mask, uint16_t value)
Definition dma-legacy.h:275
static void dma_channel_put_legacy(struct dma_chan_data *channel)
Definition dma-legacy.h:100
static void dma_chan_reg_write(struct dma_chan_data *channel, uint32_t reg, uint32_t value)
Definition dma-legacy.h:254
static struct dma_chan_data * dma_channel_get_legacy(struct dma *dma, int req_channel)
Definition dma-legacy.h:89
int dma_copy_set_stream_tag(struct dma_copy *dc, uint32_t stream_tag)
static uint32_t dma_chan_reg_read(struct dma_chan_data *channel, uint32_t reg)
Definition dma-legacy.h:242
void dma_put(struct dma *dma)
static int dma_probe_legacy(struct dma *dma)
Definition dma-legacy.h:167
static int dma_pause_legacy(struct dma_chan_data *channel)
Definition dma-legacy.h:139
int dma_copy_from_host(struct dma_copy *dc, struct dma_sg_config *host_sg, int32_t host_offset, void *local_ptr, int32_t size)
static int dma_status_legacy(struct dma_chan_data *channel, struct dma_chan_status *status, uint8_t direction)
Definition dma-legacy.h:155
int dma_copy_new(struct dma_copy *dc)
static int dma_interrupt_legacy(struct dma_chan_data *channel, enum dma_irq_cmd cmd)
Definition dma-legacy.h:189
static int dma_remove_legacy(struct dma *dma)
Definition dma-legacy.h:172
dma_cb_status
Definition dma-legacy.h:33
@ DMA_CB_STATUS_END
Definition dma-legacy.h:35
@ DMA_CB_STATUS_RELOAD
Definition dma-legacy.h:34
static int dma_set_config_legacy(struct dma_chan_data *channel, struct dma_sg_config *config)
Definition dma-legacy.h:161
static int dma_get_data_size_legacy(struct dma_chan_data *channel, uint32_t *avail, uint32_t *free)
Definition dma-legacy.h:177
static int dma_stop_delayed_legacy(struct dma_chan_data *channel)
Definition dma-legacy.h:118
dma_irq_cmd
Definition dma-legacy.h:39
@ DMA_IRQ_STATUS_GET
Definition dma-legacy.h:40
@ DMA_IRQ_CLEAR
Definition dma-legacy.h:41
@ DMA_IRQ_UNMASK
Definition dma-legacy.h:43
@ DMA_IRQ_MASK
Definition dma-legacy.h:42
struct dma * dma_get(uint32_t dir, uint32_t caps, uint32_t dev, uint32_t flags)
static int dma_get_attribute_legacy(struct dma *dma, uint32_t type, uint32_t *value)
Definition dma-legacy.h:183
#define dma_base(dma)
Definition dma-legacy.h:199
int dma_copy_to_host(struct dma_copy *dc, struct dma_sg_config *host_sg, int32_t host_offset, void *local_ptr, int32_t size)
int dma_copy_to_host_nowait(struct dma_copy *dc, struct dma_sg_config *host_sg, int32_t host_offset, void *local_ptr, int32_t size)
int dma_copy_from_host_nowait(struct dma_copy *dc, struct dma_sg_config *host_sg, int32_t host_offset, void *local_ptr, int32_t size)
static int dma_copy_legacy(struct dma_chan_data *channel, int bytes, uint32_t flags)
Definition dma-legacy.h:132
static void io_reg_update_bits(uint32_t reg, uint32_t mask, uint32_t value)
Definition io.h:66
static void io_reg_write16(uint32_t reg, uint16_t val)
Definition io.h:44
static uint32_t io_reg_read(uint32_t reg)
Definition io.h:56
static void io_reg_write(uint32_t reg, uint32_t val)
Definition io.h:61
static uint16_t io_reg_read16(uint32_t reg)
Definition io.h:39
static void io_reg_update_bits16(uint32_t reg, uint16_t mask, uint16_t value)
Definition io.h:49
Definition dma.h:221
uint32_t index
Definition dma.h:231
uint32_t direction
Definition dma.h:229
uint32_t status
Definition dma.h:228
struct dma * dma
Definition dma.h:225
Definition dma.h:177
Definition dma.h:253
struct dma_chan_data * chan
Definition dma.h:254
Definition dma-legacy.h:47
int(* get_attribute)(struct dma *dma, uint32_t type, uint32_t *value)
Definition dma-legacy.h:71
struct dma_chan_data *(* channel_get)(struct dma *dma, unsigned int req_channel)
Definition dma-legacy.h:49
int(* get_data_size)(struct dma_chan_data *channel, uint32_t *avail, uint32_t *free)
Definition dma-legacy.h:68
int(* start)(struct dma_chan_data *channel)
Definition dma-legacy.h:53
int(* interrupt)(struct dma_chan_data *channel, enum dma_irq_cmd cmd)
Definition dma-legacy.h:73
void(* channel_put)(struct dma_chan_data *channel)
Definition dma-legacy.h:51
int(* remove)(struct dma *dma)
Definition dma-legacy.h:66
int(* status)(struct dma_chan_data *channel, struct dma_chan_status *status, uint8_t direction)
Definition dma-legacy.h:59
int(* stop_delayed)(struct dma_chan_data *channel)
Definition dma-legacy.h:55
int(* stop)(struct dma_chan_data *channel)
Definition dma-legacy.h:54
int(* release)(struct dma_chan_data *channel)
Definition dma-legacy.h:58
int(* set_config)(struct dma_chan_data *channel, struct dma_sg_config *config)
Definition dma-legacy.h:62
int(* pause)(struct dma_chan_data *channel)
Definition dma-legacy.h:57
int(* copy)(struct dma_chan_data *channel, int bytes, uint32_t flags)
Definition dma-legacy.h:56
int(* probe)(struct dma *dma)
Definition dma-legacy.h:65
Definition dma.h:161
Definition dma.h:209
const struct dma_ops * ops
Definition dma.h:214
char value[]
Definition tlv.h:2
uint32_t type
Definition tlv.h:0