1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include "memory.h"
22
23struct soc_dma_s;
24struct soc_dma_ch_s;
25typedef void (*soc_dma_io_t)(void *opaque, uint8_t *buf, int len);
26typedef void (*soc_dma_transfer_t)(struct soc_dma_ch_s *ch);
27
28enum soc_dma_port_type {
29 soc_dma_port_mem,
30 soc_dma_port_fifo,
31 soc_dma_port_other,
32};
33
34enum soc_dma_access_type {
35 soc_dma_access_const,
36 soc_dma_access_linear,
37 soc_dma_access_other,
38};
39
40struct soc_dma_ch_s {
41
42 struct soc_dma_s *dma;
43 int num;
44 QEMUTimer *timer;
45
46
47 int enable;
48 int update;
49
50
51 int bytes;
52
53 enum soc_dma_access_type type[2];
54 target_phys_addr_t vaddr[2];
55
56 void *paddr[2];
57 soc_dma_io_t io_fn[2];
58 void *io_opaque[2];
59
60 int running;
61 soc_dma_transfer_t transfer_fn;
62
63
64 void *opaque;
65};
66
67struct soc_dma_s {
68
69
70 uint64_t drqbmp;
71 qemu_irq *drq;
72 void *opaque;
73 int64_t freq;
74 soc_dma_transfer_t transfer_fn;
75 soc_dma_transfer_t setup_fn;
76
77 struct soc_dma_ch_s *ch;
78};
79
80
81void soc_dma_set_request(struct soc_dma_ch_s *ch, int level);
82
83
84
85
86
87
88void soc_dma_ch_update(struct soc_dma_ch_s *ch);
89
90
91void soc_dma_reset(struct soc_dma_s *s);
92struct soc_dma_s *soc_dma_init(int n);
93
94void soc_dma_port_add_fifo(struct soc_dma_s *dma, target_phys_addr_t virt_base,
95 soc_dma_io_t fn, void *opaque, int out);
96void soc_dma_port_add_mem(struct soc_dma_s *dma, uint8_t *phys_base,
97 target_phys_addr_t virt_base, size_t size);
98
99static inline void soc_dma_port_add_fifo_in(struct soc_dma_s *dma,
100 target_phys_addr_t virt_base, soc_dma_io_t fn, void *opaque)
101{
102 return soc_dma_port_add_fifo(dma, virt_base, fn, opaque, 0);
103}
104
105static inline void soc_dma_port_add_fifo_out(struct soc_dma_s *dma,
106 target_phys_addr_t virt_base, soc_dma_io_t fn, void *opaque)
107{
108 return soc_dma_port_add_fifo(dma, virt_base, fn, opaque, 1);
109}
110