Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/arm/include/asm/dma.h
26295 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
#ifndef __ASM_ARM_DMA_H
3
#define __ASM_ARM_DMA_H
4
5
/*
6
* This is the maximum virtual address which can be DMA'd from.
7
*/
8
#ifndef CONFIG_ZONE_DMA
9
#define MAX_DMA_ADDRESS 0xffffffffUL
10
#else
11
#define MAX_DMA_ADDRESS ({ \
12
extern phys_addr_t arm_dma_zone_size; \
13
arm_dma_zone_size && arm_dma_zone_size < (0x100000000ULL - PAGE_OFFSET) ? \
14
(PAGE_OFFSET + arm_dma_zone_size) : 0xffffffffUL; })
15
16
extern phys_addr_t arm_dma_limit;
17
#define ARCH_LOW_ADDRESS_LIMIT arm_dma_limit
18
#endif
19
20
#ifdef CONFIG_ISA_DMA_API
21
/*
22
* This is used to support drivers written for the x86 ISA DMA API.
23
* It should not be re-used except for that purpose.
24
*/
25
#include <linux/spinlock.h>
26
#include <linux/scatterlist.h>
27
28
#include <mach/isa-dma.h>
29
30
/*
31
* The DMA modes reflect the settings for the ISA DMA controller
32
*/
33
#define DMA_MODE_MASK 0xcc
34
35
#define DMA_MODE_READ 0x44
36
#define DMA_MODE_WRITE 0x48
37
#define DMA_MODE_CASCADE 0xc0
38
#define DMA_AUTOINIT 0x10
39
40
extern raw_spinlock_t dma_spin_lock;
41
42
static inline unsigned long claim_dma_lock(void)
43
{
44
unsigned long flags;
45
raw_spin_lock_irqsave(&dma_spin_lock, flags);
46
return flags;
47
}
48
49
static inline void release_dma_lock(unsigned long flags)
50
{
51
raw_spin_unlock_irqrestore(&dma_spin_lock, flags);
52
}
53
54
/* Clear the 'DMA Pointer Flip Flop'.
55
* Write 0 for LSB/MSB, 1 for MSB/LSB access.
56
*/
57
#define clear_dma_ff(chan)
58
59
/* Set only the page register bits of the transfer address.
60
*
61
* NOTE: This is an architecture specific function, and should
62
* be hidden from the drivers
63
*/
64
extern void set_dma_page(unsigned int chan, char pagenr);
65
66
/* Request a DMA channel
67
*
68
* Some architectures may need to do allocate an interrupt
69
*/
70
extern int request_dma(unsigned int chan, const char * device_id);
71
72
/* Free a DMA channel
73
*
74
* Some architectures may need to do free an interrupt
75
*/
76
extern void free_dma(unsigned int chan);
77
78
/* Enable DMA for this channel
79
*
80
* On some architectures, this may have other side effects like
81
* enabling an interrupt and setting the DMA registers.
82
*/
83
extern void enable_dma(unsigned int chan);
84
85
/* Disable DMA for this channel
86
*
87
* On some architectures, this may have other side effects like
88
* disabling an interrupt or whatever.
89
*/
90
extern void disable_dma(unsigned int chan);
91
92
/* Test whether the specified channel has an active DMA transfer
93
*/
94
extern int dma_channel_active(unsigned int chan);
95
96
/* Set the DMA scatter gather list for this channel
97
*
98
* This should not be called if a DMA channel is enabled,
99
* especially since some DMA architectures don't update the
100
* DMA address immediately, but defer it to the enable_dma().
101
*/
102
extern void set_dma_sg(unsigned int chan, struct scatterlist *sg, int nr_sg);
103
104
/* Set the DMA address for this channel
105
*
106
* This should not be called if a DMA channel is enabled,
107
* especially since some DMA architectures don't update the
108
* DMA address immediately, but defer it to the enable_dma().
109
*/
110
extern void __set_dma_addr(unsigned int chan, void *addr);
111
#define set_dma_addr(chan, addr) \
112
__set_dma_addr(chan, (void *)isa_bus_to_virt(addr))
113
114
/* Set the DMA byte count for this channel
115
*
116
* This should not be called if a DMA channel is enabled,
117
* especially since some DMA architectures don't update the
118
* DMA count immediately, but defer it to the enable_dma().
119
*/
120
extern void set_dma_count(unsigned int chan, unsigned long count);
121
122
/* Set the transfer direction for this channel
123
*
124
* This should not be called if a DMA channel is enabled,
125
* especially since some DMA architectures don't update the
126
* DMA transfer direction immediately, but defer it to the
127
* enable_dma().
128
*/
129
extern void set_dma_mode(unsigned int chan, unsigned int mode);
130
131
/* Set the transfer speed for this channel
132
*/
133
extern void set_dma_speed(unsigned int chan, int cycle_ns);
134
135
/* Get DMA residue count. After a DMA transfer, this
136
* should return zero. Reading this while a DMA transfer is
137
* still in progress will return unpredictable results.
138
* If called before the channel has been used, it may return 1.
139
* Otherwise, it returns the number of _bytes_ left to transfer.
140
*/
141
extern int get_dma_residue(unsigned int chan);
142
143
#ifndef NO_DMA
144
#define NO_DMA 255
145
#endif
146
147
#endif /* CONFIG_ISA_DMA_API */
148
149
#endif /* __ASM_ARM_DMA_H */
150
151