Zephyr API Documentation  3.5.0
A Scalable Open Source RTOS
3.5.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
dma.h
Go to the documentation of this file.
1
7/*
8 * Copyright (c) 2016 Intel Corporation
9 *
10 * SPDX-License-Identifier: Apache-2.0
11 */
12
13#ifndef ZEPHYR_INCLUDE_DRIVERS_DMA_H_
14#define ZEPHYR_INCLUDE_DRIVERS_DMA_H_
15
16#include <zephyr/kernel.h>
17#include <zephyr/device.h>
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
23
38
43
49
54};
55
61};
62
63/* channel attributes */
65 DMA_CHANNEL_NORMAL, /* normal DMA channel */
66 DMA_CHANNEL_PERIODIC, /* can be triggered by periodic sources */
67};
68
69/* DMA attributes */
75};
76
115#ifdef CONFIG_DMA_64BIT
118#else
121#endif
137};
138
139#define DMA_STATUS_COMPLETE 0
140#define DMA_STATUS_BLOCK 1
141
159typedef void (*dma_callback_t)(const struct device *dev, void *user_data,
160 uint32_t channel, int status);
161
224};
225
239 bool busy;
246};
247
262};
263
264/* magic code to identify context content */
265#define DMA_MAGIC 0x47494749
266
273typedef int (*dma_api_config)(const struct device *dev, uint32_t channel,
274 struct dma_config *config);
275
276#ifdef CONFIG_DMA_64BIT
277typedef int (*dma_api_reload)(const struct device *dev, uint32_t channel,
278 uint64_t src, uint64_t dst, size_t size);
279#else
280typedef int (*dma_api_reload)(const struct device *dev, uint32_t channel,
281 uint32_t src, uint32_t dst, size_t size);
282#endif
283
284typedef int (*dma_api_start)(const struct device *dev, uint32_t channel);
285
286typedef int (*dma_api_stop)(const struct device *dev, uint32_t channel);
287
288typedef int (*dma_api_suspend)(const struct device *dev, uint32_t channel);
289
290typedef int (*dma_api_resume)(const struct device *dev, uint32_t channel);
291
292typedef int (*dma_api_get_status)(const struct device *dev, uint32_t channel,
293 struct dma_status *status);
294
295typedef int (*dma_api_get_attribute)(const struct device *dev, uint32_t type, uint32_t *value);
296
310typedef bool (*dma_api_chan_filter)(const struct device *dev,
311 int channel, void *filter_param);
312
313__subsystem struct dma_driver_api {
314 dma_api_config config;
315 dma_api_reload reload;
316 dma_api_start start;
317 dma_api_stop stop;
318 dma_api_suspend suspend;
319 dma_api_resume resume;
320 dma_api_get_status get_status;
321 dma_api_get_attribute get_attribute;
322 dma_api_chan_filter chan_filter;
323};
339static inline int dma_config(const struct device *dev, uint32_t channel,
340 struct dma_config *config)
341{
342 const struct dma_driver_api *api =
343 (const struct dma_driver_api *)dev->api;
344
345 return api->config(dev, channel, config);
346}
347
361#ifdef CONFIG_DMA_64BIT
362static inline int dma_reload(const struct device *dev, uint32_t channel,
363 uint64_t src, uint64_t dst, size_t size)
364#else
365static inline int dma_reload(const struct device *dev, uint32_t channel,
366 uint32_t src, uint32_t dst, size_t size)
367#endif
368{
369 const struct dma_driver_api *api =
370 (const struct dma_driver_api *)dev->api;
371
372 if (api->reload) {
373 return api->reload(dev, channel, src, dst, size);
374 }
375
376 return -ENOSYS;
377}
378
396__syscall int dma_start(const struct device *dev, uint32_t channel);
397
398static inline int z_impl_dma_start(const struct device *dev, uint32_t channel)
399{
400 const struct dma_driver_api *api =
401 (const struct dma_driver_api *)dev->api;
402
403 return api->start(dev, channel);
404}
405
422__syscall int dma_stop(const struct device *dev, uint32_t channel);
423
424static inline int z_impl_dma_stop(const struct device *dev, uint32_t channel)
425{
426 const struct dma_driver_api *api =
427 (const struct dma_driver_api *)dev->api;
428
429 return api->stop(dev, channel);
430}
431
432
447__syscall int dma_suspend(const struct device *dev, uint32_t channel);
448
449static inline int z_impl_dma_suspend(const struct device *dev, uint32_t channel)
450{
451 const struct dma_driver_api *api = (const struct dma_driver_api *)dev->api;
452
453 if (api->suspend == NULL) {
454 return -ENOSYS;
455 }
456 return api->suspend(dev, channel);
457}
458
473__syscall int dma_resume(const struct device *dev, uint32_t channel);
474
475static inline int z_impl_dma_resume(const struct device *dev, uint32_t channel)
476{
477 const struct dma_driver_api *api = (const struct dma_driver_api *)dev->api;
478
479 if (api->resume == NULL) {
480 return -ENOSYS;
481 }
482 return api->resume(dev, channel);
483}
484
497__syscall int dma_request_channel(const struct device *dev,
498 void *filter_param);
499
500static inline int z_impl_dma_request_channel(const struct device *dev,
501 void *filter_param)
502{
503 int i = 0;
504 int channel = -EINVAL;
505 const struct dma_driver_api *api =
506 (const struct dma_driver_api *)dev->api;
507 /* dma_context shall be the first one in dev data */
508 struct dma_context *dma_ctx = (struct dma_context *)dev->data;
509
510 if (dma_ctx->magic != DMA_MAGIC) {
511 return channel;
512 }
513
514 for (i = 0; i < dma_ctx->dma_channels; i++) {
515 if (!atomic_test_and_set_bit(dma_ctx->atomic, i)) {
516 if (api->chan_filter &&
517 !api->chan_filter(dev, i, filter_param)) {
518 atomic_clear_bit(dma_ctx->atomic, i);
519 continue;
520 }
521 channel = i;
522 break;
523 }
524 }
525
526 return channel;
527}
528
538__syscall void dma_release_channel(const struct device *dev,
539 uint32_t channel);
540
541static inline void z_impl_dma_release_channel(const struct device *dev,
542 uint32_t channel)
543{
544 struct dma_context *dma_ctx = (struct dma_context *)dev->data;
545
546 if (dma_ctx->magic != DMA_MAGIC) {
547 return;
548 }
549
550 if ((int)channel < dma_ctx->dma_channels) {
551 atomic_clear_bit(dma_ctx->atomic, channel);
552 }
553
554}
555
568__syscall int dma_chan_filter(const struct device *dev,
569 int channel, void *filter_param);
570
571static inline int z_impl_dma_chan_filter(const struct device *dev,
572 int channel, void *filter_param)
573{
574 const struct dma_driver_api *api =
575 (const struct dma_driver_api *)dev->api;
576
577 if (api->chan_filter) {
578 return api->chan_filter(dev, channel, filter_param);
579 }
580
581 return -ENOSYS;
582}
583
598static inline int dma_get_status(const struct device *dev, uint32_t channel,
599 struct dma_status *stat)
600{
601 const struct dma_driver_api *api =
602 (const struct dma_driver_api *)dev->api;
603
604 if (api->get_status) {
605 return api->get_status(dev, channel, stat);
606 }
607
608 return -ENOSYS;
609}
610
626static inline int dma_get_attribute(const struct device *dev, uint32_t type, uint32_t *value)
627{
628 const struct dma_driver_api *api = (const struct dma_driver_api *)dev->api;
629
630 if (api->get_attribute) {
631 return api->get_attribute(dev, type, value);
632 }
633
634 return -ENOSYS;
635}
636
651{
652 /* Check boundaries (max supported width is 32 Bytes) */
653 if (size < 1 || size > 32) {
654 return 0; /* Zero is the default (8 Bytes) */
655 }
656
657 /* Ensure size is a power of 2 */
658 if (!is_power_of_two(size)) {
659 return 0; /* Zero is the default (8 Bytes) */
660 }
661
662 /* Convert to bit pattern for writing to a register */
663 return find_msb_set(size);
664}
665
680{
681 /* Check boundaries (max supported burst length is 256) */
682 if (burst < 1 || burst > 256) {
683 return 0; /* Zero is the default (1 burst length) */
684 }
685
686 /* Ensure burst is a power of 2 */
687 if (!(burst & (burst - 1))) {
688 return 0; /* Zero is the default (1 burst length) */
689 }
690
691 /* Convert to bit pattern for writing to a register */
692 return find_msb_set(burst);
693}
694
704#define DMA_BUF_ADDR_ALIGNMENT(node) DT_PROP(node, dma_buf_addr_alignment)
705
715#define DMA_BUF_SIZE_ALIGNMENT(node) DT_PROP(node, dma_buf_size_alignment)
716
723#define DMA_COPY_ALIGNMENT(node) DT_PROP(node, dma_copy_alignment)
724
729#ifdef __cplusplus
730}
731#endif
732
733#include <syscalls/dma.h>
734
735#endif /* ZEPHYR_INCLUDE_DRIVERS_DMA_H_ */
long atomic_t
Definition: atomic.h:22
static ALWAYS_INLINE unsigned int find_msb_set(uint32_t op)
find most significant bit set in a 32-bit word
Definition: ffs.h:31
static void atomic_clear_bit(atomic_t *target, int bit)
Atomically clear a bit.
Definition: atomic.h:198
static bool atomic_test_and_set_bit(atomic_t *target, int bit)
Atomically set a bit.
Definition: atomic.h:176
dma_attribute_type
Definition: dma.h:70
static int dma_get_status(const struct device *dev, uint32_t channel, struct dma_status *stat)
get current runtime status of DMA transfer
Definition: dma.h:598
int dma_stop(const struct device *dev, uint32_t channel)
Stops the DMA transfer and disables the channel.
static int dma_reload(const struct device *dev, uint32_t channel, uint32_t src, uint32_t dst, size_t size)
Reload buffer(s) for a DMA channel.
Definition: dma.h:365
static int dma_get_attribute(const struct device *dev, uint32_t type, uint32_t *value)
get attribute of a dma controller
Definition: dma.h:626
int dma_suspend(const struct device *dev, uint32_t channel)
Suspend a DMA channel transfer.
int dma_chan_filter(const struct device *dev, int channel, void *filter_param)
DMA channel filter.
int dma_resume(const struct device *dev, uint32_t channel)
Resume a DMA channel transfer.
int dma_request_channel(const struct device *dev, void *filter_param)
request DMA channel.
static uint32_t dma_burst_index(uint32_t burst)
Look-up generic burst index to be used in registers.
Definition: dma.h:679
void dma_release_channel(const struct device *dev, uint32_t channel)
release DMA channel.
int dma_start(const struct device *dev, uint32_t channel)
Enables DMA channel and starts the transfer, the channel must be configured beforehand.
void(* dma_callback_t)(const struct device *dev, void *user_data, uint32_t channel, int status)
Callback function for DMA transfer completion.
Definition: dma.h:159
static uint32_t dma_width_index(uint32_t size)
Look-up generic width index to be used in registers.
Definition: dma.h:650
dma_channel_filter
Definition: dma.h:64
#define DMA_MAGIC
Definition: dma.h:265
dma_channel_direction
Definition: dma.h:31
dma_addr_adj
Valid values for source_addr_adj and dest_addr_adj.
Definition: dma.h:57
@ DMA_ATTR_BUFFER_ADDRESS_ALIGNMENT
Definition: dma.h:71
@ DMA_ATTR_COPY_ALIGNMENT
Definition: dma.h:73
@ DMA_ATTR_BUFFER_SIZE_ALIGNMENT
Definition: dma.h:72
@ DMA_ATTR_MAX_BLOCK_COUNT
Definition: dma.h:74
@ DMA_CHANNEL_NORMAL
Definition: dma.h:65
@ DMA_CHANNEL_PERIODIC
Definition: dma.h:66
@ DMA_CHANNEL_DIRECTION_PRIV_START
This and higher values are dma controller or soc specific.
Definition: dma.h:48
@ MEMORY_TO_PERIPHERAL
Definition: dma.h:33
@ MEMORY_TO_MEMORY
Definition: dma.h:32
@ PERIPHERAL_TO_MEMORY
Definition: dma.h:34
@ MEMORY_TO_HOST
Definition: dma.h:37
@ HOST_TO_MEMORY
Definition: dma.h:36
@ DMA_CHANNEL_DIRECTION_MAX
Maximum allowed value (3 bit field!)
Definition: dma.h:53
@ PERIPHERAL_TO_PERIPHERAL
Definition: dma.h:35
@ DMA_CHANNEL_DIRECTION_COMMON_COUNT
Number of all common channel directions.
Definition: dma.h:42
@ DMA_ADDR_ADJ_DECREMENT
Definition: dma.h:59
@ DMA_ADDR_ADJ_INCREMENT
Definition: dma.h:58
@ DMA_ADDR_ADJ_NO_CHANGE
Definition: dma.h:60
static bool is_power_of_two(unsigned int x)
Is x a power of two?
Definition: util.h:379
#define EINVAL
Invalid argument.
Definition: errno.h:61
#define ENOSYS
Function not implemented.
Definition: errno.h:83
Public kernel APIs.
#define bool
Definition: stdbool.h:13
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__INT32_TYPE__ int32_t
Definition: stdint.h:74
__UINT64_TYPE__ uint64_t
Definition: stdint.h:91
__UINT16_TYPE__ uint16_t
Definition: stdint.h:89
Runtime device structure (in ROM) per driver instance.
Definition: device.h:381
void * data
Address of the device instance private data.
Definition: device.h:391
const void * api
Address of the API structure exposed by the device instance.
Definition: device.h:387
DMA block configuration structure.
Definition: dma.h:114
uint32_t dest_scatter_interval
Definition: dma.h:123
uint16_t reserved
Definition: dma.h:136
uint32_t source_gather_interval
Definition: dma.h:122
uint32_t block_size
Definition: dma.h:126
uint16_t source_reload_en
Definition: dma.h:132
uint16_t dest_scatter_en
Definition: dma.h:129
uint16_t dest_reload_en
Definition: dma.h:133
uint16_t fifo_mode_control
Definition: dma.h:134
uint16_t source_gather_count
Definition: dma.h:125
uint16_t source_addr_adj
Definition: dma.h:130
struct dma_block_config * next_block
Definition: dma.h:127
uint32_t dest_address
Definition: dma.h:120
uint32_t source_address
Definition: dma.h:119
uint16_t source_gather_en
Definition: dma.h:128
uint16_t dest_addr_adj
Definition: dma.h:131
uint16_t dest_scatter_count
Definition: dma.h:124
uint16_t flow_control_mode
Definition: dma.h:135
DMA configuration structure.
Definition: dma.h:203
uint32_t channel_priority
Definition: dma.h:210
uint32_t source_handshake
Definition: dma.h:208
uint32_t complete_callback_en
Definition: dma.h:206
void * user_data
Definition: dma.h:222
uint32_t error_callback_en
Definition: dma.h:207
dma_callback_t dma_callback
Definition: dma.h:223
uint32_t source_chaining_en
Definition: dma.h:211
uint32_t dest_chaining_en
Definition: dma.h:212
uint32_t dma_slot
Definition: dma.h:204
uint32_t channel_direction
Definition: dma.h:205
uint32_t source_data_size
Definition: dma.h:216
uint32_t dest_burst_length
Definition: dma.h:219
struct dma_block_config * head_block
Definition: dma.h:221
uint32_t linked_channel
Definition: dma.h:213
uint32_t source_burst_length
Definition: dma.h:218
uint32_t block_count
Definition: dma.h:220
uint32_t dest_data_size
Definition: dma.h:217
uint32_t reserved
Definition: dma.h:215
uint32_t dest_handshake
Definition: dma.h:209
uint32_t cyclic
Definition: dma.h:214
DMA context structure Note: the dma_context shall be the first member of DMA client driver Data,...
Definition: dma.h:258
int32_t magic
Definition: dma.h:259
atomic_t * atomic
Definition: dma.h:261
int dma_channels
Definition: dma.h:260
DMA runtime status structure.
Definition: dma.h:238
uint32_t free
Definition: dma.h:242
uint32_t pending_length
Definition: dma.h:241
bool busy
Definition: dma.h:239
uint64_t total_copied
Definition: dma.h:245
uint32_t write_position
Definition: dma.h:243
enum dma_channel_direction dir
Definition: dma.h:240
uint32_t read_position
Definition: dma.h:244
Definition: stat.h:92