1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include "platform.h"
27#include "diva_dma.h"
28
29
30
31
32struct _diva_dma_map_entry {
33 int busy;
34 dword phys_bus_addr;
35 void *local_ram_addr;
36 void *addr_handle;
37};
38
39
40
41struct _diva_dma_map_entry *diva_alloc_dma_map(void *os_context, int nentries) {
42 diva_dma_map_entry_t *pmap = diva_os_malloc(0, sizeof(*pmap) * (nentries + 1));
43 if (pmap)
44 memset(pmap, 0, sizeof(*pmap) * (nentries + 1));
45 return pmap;
46}
47
48
49
50void diva_free_dma_mapping(struct _diva_dma_map_entry *pmap) {
51 if (pmap) {
52 diva_os_free(0, pmap);
53 }
54}
55
56
57
58void diva_init_dma_map_entry(struct _diva_dma_map_entry *pmap,
59 int nr, void *virt, dword phys,
60 void *addr_handle) {
61 pmap[nr].phys_bus_addr = phys;
62 pmap[nr].local_ram_addr = virt;
63 pmap[nr].addr_handle = addr_handle;
64}
65
66
67
68int diva_alloc_dma_map_entry(struct _diva_dma_map_entry *pmap) {
69 int i;
70 for (i = 0; (pmap && pmap[i].local_ram_addr); i++) {
71 if (!pmap[i].busy) {
72 pmap[i].busy = 1;
73 return (i);
74 }
75 }
76 return (-1);
77}
78
79
80
81void diva_free_dma_map_entry(struct _diva_dma_map_entry *pmap, int nr) {
82 pmap[nr].busy = 0;
83}
84
85
86
87void diva_get_dma_map_entry(struct _diva_dma_map_entry *pmap, int nr,
88 void **pvirt, dword *pphys) {
89 *pphys = pmap[nr].phys_bus_addr;
90 *pvirt = pmap[nr].local_ram_addr;
91}
92void *diva_get_entry_handle(struct _diva_dma_map_entry *pmap, int nr) {
93 return (pmap[nr].addr_handle);
94}
95