Zephyr API Documentation 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
dma.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2016 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
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
31
65
79
87
101
169
171#define DMA_STATUS_COMPLETE 0
173#define DMA_STATUS_BLOCK 1
175#define DMA_STATUS_HALF_COMPLETE 2
176
194typedef void (*dma_callback_t)(const struct device *dev, void *user_data,
195 uint32_t channel, int status);
196
277
297
311
313#define DMA_MAGIC 0x47494749
314
319
324typedef int (*dma_api_config)(const struct device *dev, uint32_t channel,
325 struct dma_config *config);
326
331#ifdef CONFIG_DMA_64BIT
332typedef int (*dma_api_reload)(const struct device *dev, uint32_t channel,
333 uint64_t src, uint64_t dst, size_t size);
334#else
335typedef int (*dma_api_reload)(const struct device *dev, uint32_t channel,
336 uint32_t src, uint32_t dst, size_t size);
337#endif
338
343typedef int (*dma_api_start)(const struct device *dev, uint32_t channel);
344
349typedef int (*dma_api_stop)(const struct device *dev, uint32_t channel);
350
355typedef int (*dma_api_suspend)(const struct device *dev, uint32_t channel);
356
361typedef int (*dma_api_resume)(const struct device *dev, uint32_t channel);
362
367typedef int (*dma_api_get_status)(const struct device *dev, uint32_t channel,
368 struct dma_status *status);
369
374typedef int (*dma_api_get_attribute)(const struct device *dev, uint32_t type, uint32_t *value);
375
388typedef bool (*dma_api_chan_filter)(const struct device *dev,
389 int channel, void *filter_param);
390
401typedef void (*dma_api_chan_release)(const struct device *dev,
402 uint32_t channel);
403
433
435
446static inline int dma_config(const struct device *dev, uint32_t channel,
447 struct dma_config *config)
448{
449 return DEVICE_API_GET(dma, dev)->config(dev, channel, config);
450}
451
464#ifdef CONFIG_DMA_64BIT
465static inline int dma_reload(const struct device *dev, uint32_t channel,
466 uint64_t src, uint64_t dst, size_t size)
467#else
468static inline int dma_reload(const struct device *dev, uint32_t channel,
469 uint32_t src, uint32_t dst, size_t size)
470#endif
471{
472 const struct dma_driver_api *api = DEVICE_API_GET(dma, dev);
473
474 if (api->reload) {
475 return api->reload(dev, channel, src, dst, size);
476 }
477
478 return -ENOSYS;
479}
480
499static inline int dma_start(const struct device *dev, uint32_t channel)
500{
501 return DEVICE_API_GET(dma, dev)->start(dev, channel);
502}
503
523static inline int dma_stop(const struct device *dev, uint32_t channel)
524{
525 const struct dma_driver_api *api = DEVICE_API_GET(dma, dev);
526
527 if (api->stop == NULL) {
528 return -ENOSYS;
529 }
530 return api->stop(dev, channel);
531}
532
548static inline int dma_suspend(const struct device *dev, uint32_t channel)
549{
550 const struct dma_driver_api *api = DEVICE_API_GET(dma, dev);
551
552 if (api->suspend == NULL) {
553 return -ENOSYS;
554 }
555 return api->suspend(dev, channel);
556}
557
573static inline int dma_resume(const struct device *dev, uint32_t channel)
574{
575 const struct dma_driver_api *api = DEVICE_API_GET(dma, dev);
576
577 if (api->resume == NULL) {
578 return -ENOSYS;
579 }
580 return api->resume(dev, channel);
581}
582
598static inline int dma_request_channel(const struct device *dev, void *filter_param)
599{
600 int i = 0;
601 int channel = -EINVAL;
602 const struct dma_driver_api *api = DEVICE_API_GET(dma, dev);
603 /* dma_context shall be the first one in dev data */
604 struct dma_context *dma_ctx = (struct dma_context *)dev->data;
605
606 if (dma_ctx->magic != DMA_MAGIC) {
607 return channel;
608 }
609
610 for (i = 0; i < dma_ctx->dma_channels; i++) {
611 if (!atomic_test_and_set_bit(dma_ctx->atomic, i)) {
612 if (api->chan_filter &&
613 !api->chan_filter(dev, i, filter_param)) {
614 atomic_clear_bit(dma_ctx->atomic, i);
615 continue;
616 }
617 channel = i;
618 break;
619 }
620 }
621
622 return channel;
623}
624
638static inline void dma_release_channel(const struct device *dev, uint32_t channel)
639{
640 const struct dma_driver_api *api = DEVICE_API_GET(dma, dev);
641 struct dma_context *dma_ctx = (struct dma_context *)dev->data;
642
643 if (dma_ctx->magic != DMA_MAGIC) {
644 return;
645 }
646
647 if ((int)channel < dma_ctx->dma_channels) {
648 if (api->chan_release) {
649 api->chan_release(dev, channel);
650 }
651
652 atomic_clear_bit(dma_ctx->atomic, channel);
653 }
654
655}
656
668static inline int dma_chan_filter(const struct device *dev, int channel, void *filter_param)
669{
670 const struct dma_driver_api *api = DEVICE_API_GET(dma, dev);
671
672 if (api->chan_filter) {
673 return api->chan_filter(dev, channel, filter_param);
674 }
675
676 return -ENOSYS;
677}
678
694static inline int dma_get_status(const struct device *dev, uint32_t channel,
695 struct dma_status *stat)
696{
697 const struct dma_driver_api *api = DEVICE_API_GET(dma, dev);
698
699 if (api->get_status) {
700 return api->get_status(dev, channel, stat);
701 }
702
703 return -ENOSYS;
704}
705
722static inline int dma_get_attribute(const struct device *dev, uint32_t type, uint32_t *value)
723{
724 const struct dma_driver_api *api = DEVICE_API_GET(dma, dev);
725
726 if (api->get_attribute) {
727 return api->get_attribute(dev, type, value);
728 }
729
730 return -ENOSYS;
731}
732
747{
748 /* Check boundaries (max supported width is 32 Bytes) */
749 if (size < 1 || size > 32) {
750 return 0; /* Zero is the default (8 Bytes) */
751 }
752
753 /* Ensure size is a power of 2 */
754 if (!is_power_of_two(size)) {
755 return 0; /* Zero is the default (8 Bytes) */
756 }
757
758 /* Convert to bit pattern for writing to a register */
759 return find_msb_set(size);
760}
761
776{
777 /* Check boundaries (max supported burst length is 256) */
778 if (burst < 1 || burst > 256) {
779 return 0; /* Zero is the default (1 burst length) */
780 }
781
782 /* Ensure burst is a power of 2 */
783 if (!(burst & (burst - 1))) {
784 return 0; /* Zero is the default (1 burst length) */
785 }
786
787 /* Convert to bit pattern for writing to a register */
788 return find_msb_set(burst);
789}
790
800#define DMA_BUF_ADDR_ALIGNMENT(node) DT_PROP(node, dma_buf_addr_alignment)
801
811#define DMA_BUF_SIZE_ALIGNMENT(node) DT_PROP(node, dma_buf_size_alignment)
812
819#define DMA_COPY_ALIGNMENT(node) DT_PROP(node, dma_copy_alignment)
820
824
825#ifdef __cplusplus
826}
827#endif
828
829#endif /* ZEPHYR_INCLUDE_DRIVERS_DMA_H_ */
#define DEVICE_API_GET(_class, _dev)
Expands to the pointer of a device's API for a given class.
Definition device.h:1449
static ALWAYS_INLINE unsigned int find_msb_set(uint32_t op)
find most significant bit set in a 32-bit word
Definition ffs.h:32
long atomic_t
Atomic integer variable.
Definition atomic_types.h:31
static void atomic_clear_bit(atomic_t *target, int bit)
Atomically clear a bit.
Definition atomic.h:227
static bool atomic_test_and_set_bit(atomic_t *target, int bit)
Atomically set a bit and test it.
Definition atomic.h:181
void(* dma_api_chan_release)(const struct device *dev, uint32_t channel)
channel release function call
Definition dma.h:401
int(* dma_api_get_status)(const struct device *dev, uint32_t channel, struct dma_status *status)
Get current runtime status of DMA transfer.
Definition dma.h:367
bool(* dma_api_chan_filter)(const struct device *dev, int channel, void *filter_param)
channel filter function call
Definition dma.h:388
int(* dma_api_start)(const struct device *dev, uint32_t channel)
Enable DMA channel and start the transfer.
Definition dma.h:343
int(* dma_api_get_attribute)(const struct device *dev, uint32_t type, uint32_t *value)
Get attribute of a DMA controller.
Definition dma.h:374
int(* dma_api_resume)(const struct device *dev, uint32_t channel)
Resume a DMA channel transfer.
Definition dma.h:361
int(* dma_api_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:335
int(* dma_api_config)(const struct device *dev, uint32_t channel, struct dma_config *config)
Configure individual channel for DMA transfer.
Definition dma.h:324
int(* dma_api_suspend)(const struct device *dev, uint32_t channel)
Suspend a DMA channel transfer.
Definition dma.h:355
int(* dma_api_stop)(const struct device *dev, uint32_t channel)
Stop the DMA transfer and disable the channel.
Definition dma.h:349
dma_attribute_type
DMA attributes.
Definition dma.h:91
static int dma_resume(const struct device *dev, uint32_t channel)
Resume a DMA channel transfer.
Definition dma.h:573
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:694
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:468
static int dma_get_attribute(const struct device *dev, uint32_t type, uint32_t *value)
get attribute of a dma controller
Definition dma.h:722
static int dma_chan_filter(const struct device *dev, int channel, void *filter_param)
DMA channel filter.
Definition dma.h:668
static int dma_config(const struct device *dev, uint32_t channel, struct dma_config *config)
Configure individual channel for DMA transfer.
Definition dma.h:446
static void dma_release_channel(const struct device *dev, uint32_t channel)
release DMA channel.
Definition dma.h:638
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:194
static int dma_suspend(const struct device *dev, uint32_t channel)
Suspend a DMA channel transfer.
Definition dma.h:548
static uint32_t dma_burst_index(uint32_t burst)
Look-up generic burst index to be used in registers.
Definition dma.h:775
static int dma_request_channel(const struct device *dev, void *filter_param)
request DMA channel.
Definition dma.h:598
static uint32_t dma_width_index(uint32_t size)
Look-up generic width index to be used in registers.
Definition dma.h:746
dma_channel_filter
DMA channel attributes.
Definition dma.h:83
#define DMA_MAGIC
Magic code to identify context content.
Definition dma.h:313
dma_channel_direction
DMA channel direction.
Definition dma.h:35
static int dma_start(const struct device *dev, uint32_t channel)
Enables DMA channel and starts the transfer, the channel must be configured beforehand.
Definition dma.h:499
static int dma_stop(const struct device *dev, uint32_t channel)
Stops the DMA transfer and disables the channel.
Definition dma.h:523
dma_addr_adj
DMA address adjustment.
Definition dma.h:71
@ DMA_ATTR_BUFFER_ADDRESS_ALIGNMENT
Required alignment of buffer addresses, in bytes.
Definition dma.h:93
@ DMA_ATTR_COPY_ALIGNMENT
Required alignment of memory-to-memory copies, in bytes.
Definition dma.h:97
@ DMA_ATTR_BUFFER_SIZE_ALIGNMENT
Required alignment of buffer sizes, in bytes.
Definition dma.h:95
@ DMA_ATTR_MAX_BLOCK_COUNT
Maximum number of blocks in a single transfer.
Definition dma.h:99
@ DMA_CHANNEL_NORMAL
Normal DMA channel.
Definition dma.h:84
@ DMA_CHANNEL_PERIODIC
Channel that can be triggered by periodic sources.
Definition dma.h:85
@ DMA_CHANNEL_DIRECTION_PRIV_START
This and higher values are dma controller or soc specific.
Definition dma.h:58
@ MEMORY_TO_PERIPHERAL
Memory to peripheral.
Definition dma.h:39
@ MEMORY_TO_MEMORY
Memory to memory.
Definition dma.h:37
@ PERIPHERAL_TO_MEMORY
Peripheral to memory.
Definition dma.h:41
@ MEMORY_TO_HOST
Memory to host.
Definition dma.h:47
@ HOST_TO_MEMORY
Host to memory.
Definition dma.h:45
@ DMA_CHANNEL_DIRECTION_MAX
Maximum allowed value (3 bit field!).
Definition dma.h:63
@ PERIPHERAL_TO_PERIPHERAL
Peripheral to peripheral.
Definition dma.h:43
@ DMA_CHANNEL_DIRECTION_COMMON_COUNT
Number of all common channel directions.
Definition dma.h:52
@ DMA_ADDR_ADJ_DECREMENT
Decrement the address.
Definition dma.h:75
@ DMA_ADDR_ADJ_INCREMENT
Increment the address.
Definition dma.h:73
@ DMA_ADDR_ADJ_NO_CHANGE
No change the address.
Definition dma.h:77
static bool is_power_of_two(unsigned int x)
Is x a power of two?
Definition util.h:581
#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:513
void * data
Address of the device instance private data.
Definition device.h:523
DMA block configuration structure.
Definition dma.h:109
uint32_t dest_scatter_interval
Address adjustment at scatter boundary.
Definition dma.h:124
uint32_t source_gather_interval
Address adjustment at gather boundary.
Definition dma.h:122
uint32_t block_size
Number of bytes to be transferred for this block.
Definition dma.h:130
uint16_t source_reload_en
Reload source address at the end of block transfer.
Definition dma.h:154
uint16_t dest_scatter_en
Enable destination scattering when set to 1.
Definition dma.h:136
uint16_t dest_reload_en
Reload destination address at the end of block transfer.
Definition dma.h:156
uint16_t fifo_mode_control
FIFO fill before starting transfer, HW specific meaning.
Definition dma.h:158
uint16_t source_gather_count
Continuous transfer count between gather boundaries.
Definition dma.h:128
uint16_t source_addr_adj
Source address adjustment option.
Definition dma.h:144
struct dma_block_config * next_block
Pointer to next block in a transfer list.
Definition dma.h:132
uint32_t dest_address
block starting address at destination
Definition dma.h:119
uint32_t source_address
block starting address at source
Definition dma.h:117
uint16_t source_gather_en
Enable source gathering when set to 1.
Definition dma.h:134
uint16_t dest_addr_adj
Destination address adjustment.
Definition dma.h:152
uint16_t dest_scatter_count
Continuous transfer count between scatter boundaries.
Definition dma.h:126
uint16_t flow_control_mode
Transfer flow control mode.
Definition dma.h:165
DMA configuration structure.
Definition dma.h:201
uint32_t half_complete_callback_en
enable half completion callback when set to 1
Definition dma.h:217
uint32_t channel_priority
Channel priority for arbitration, HW specific.
Definition dma.h:249
uint32_t source_handshake
Source handshake, HW specific.
Definition dma.h:238
uint32_t complete_callback_en
Completion callback enable.
Definition dma.h:224
uint32_t error_callback_dis
Error callback disable.
Definition dma.h:231
void * user_data
Optional attached user data for callbacks.
Definition dma.h:273
dma_callback_t dma_callback
Optional callback for completion and error events.
Definition dma.h:275
uint32_t source_chaining_en
Source chaining enable, HW specific.
Definition dma.h:251
uint32_t dest_chaining_en
Destination chaining enable, HW specific.
Definition dma.h:253
uint32_t dma_slot
Which peripheral and direction, HW specific.
Definition dma.h:203
uint32_t channel_direction
Direction the transfers are occurring.
Definition dma.h:215
uint32_t source_data_size
Width of source data (in bytes).
Definition dma.h:261
uint32_t dest_burst_length
Destination burst length in bytes.
Definition dma.h:267
struct dma_block_config * head_block
Pointer to the first block in the transfer list.
Definition dma.h:271
uint32_t linked_channel
Linked channel, HW specific.
Definition dma.h:255
uint32_t source_burst_length
Source burst length in bytes.
Definition dma.h:265
uint32_t block_count
Number of blocks in transfer list.
Definition dma.h:269
uint32_t dest_data_size
Width of destination data (in bytes).
Definition dma.h:263
uint32_t dest_handshake
Destination handshake, HW specific.
Definition dma.h:245
uint32_t cyclic
Cyclic transfer list, HW specific.
Definition dma.h:257
DMA context structure Note: the dma_context shall be the first member of DMA client driver Data,...
Definition dma.h:303
int32_t magic
magic code to identify the context
Definition dma.h:305
atomic_t * atomic
atomic holding bit flags for each channel to mark as used/unused
Definition dma.h:309
int dma_channels
number of dma channels
Definition dma.h:307
<span class="mlabel">Driver Operations</span> DMA driver operations
Definition dma.h:407
dma_api_config config
<span class="op-badge op-req" title="This operation MUST be implemented by the driver....
Definition dma.h:409
dma_api_stop stop
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition dma.h:415
dma_api_chan_release chan_release
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition dma.h:431
dma_api_suspend suspend
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition dma.h:417
dma_api_reload reload
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition dma.h:411
dma_api_chan_filter chan_filter
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition dma.h:425
dma_api_start start
<span class="op-badge op-req" title="This operation MUST be implemented by the driver....
Definition dma.h:413
dma_api_get_status get_status
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition dma.h:421
dma_api_resume resume
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition dma.h:419
dma_api_get_attribute get_attribute
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition dma.h:423
DMA runtime status structure.
Definition dma.h:281
uint32_t free
Available buffers space, HW specific.
Definition dma.h:289
uint32_t pending_length
Pending length to be transferred in bytes, HW specific.
Definition dma.h:287
bool busy
Is the current DMA transfer busy or idle.
Definition dma.h:283
uint64_t total_copied
Total copied, HW specific.
Definition dma.h:295
uint32_t write_position
Write position in circular DMA buffer, HW specific.
Definition dma.h:291
enum dma_channel_direction dir
Direction for the transfer.
Definition dma.h:285
uint32_t read_position
Read position in circular DMA buffer, HW specific.
Definition dma.h:293
Definition stat.h:57