Mercurial > archived > louis > epitech > mq > rathaxes
annotate rathaxes_samples_e1000_add_a_dma_abstraction.patch @ 112:bfe10def90e3
Wip
author | Louis Opter <louis@lse.epita.fr> |
---|---|
date | Fri, 19 Jul 2013 19:12:10 -0700 |
parents | b072f682823d |
children | 5a663f8f0e54 |
rev | line source |
---|---|
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
1 # HG changeset patch |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
2 # Parent 0f12e80e810de1a9927db1f25dbea49acd73ae3c |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
3 e1000: start a DMA allocation/mapping abstraction |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
4 |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
5 It currently matches a lot the Linux DMA API but it should be usable by |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
6 other OSes too. The Linux DMA API is described at the end of the chapter |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
7 15 in the LDD3. |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
8 |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
9 This will be useful to remove Linux specific DMA code from |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
10 e1000::set_up_device which should be only device independent code. |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
11 |
112 | 12 diff --git a/rathaxes/samples/e1000/CMakeLists.txt b/rathaxes/samples/e1000/CMakeLists.txt |
13 --- a/rathaxes/samples/e1000/CMakeLists.txt | |
14 +++ b/rathaxes/samples/e1000/CMakeLists.txt | |
15 @@ -5,6 +5,7 @@ | |
16 log.rti | |
17 lkm.rti | |
18 device.rti | |
19 + dma.rti | |
20 pci.rti | |
21 socket.rti | |
22 ethernet.rti | |
23 @@ -12,8 +13,9 @@ | |
24 BLT | |
25 log.blt | |
26 lkm.blt | |
27 + device.blt | |
28 + dma.blt | |
29 pci.blt | |
30 - device.blt | |
31 socket.blt | |
32 e1000.blt | |
33 ethernet.blt) | |
34 diff --git a/rathaxes/samples/e1000/dma.blt b/rathaxes/samples/e1000/dma.blt | |
35 new file mode 100644 | |
36 --- /dev/null | |
37 +++ b/rathaxes/samples/e1000/dma.blt | |
38 @@ -0,0 +1,81 @@ | |
39 +with DMA, Builtin, LKM, Device | |
40 +{ | |
41 + template type AbstractDMAHandle() | |
42 + { | |
43 + chunk LKM::includes() | |
44 + { | |
45 + #include <linux/dma-mapping.h> | |
46 + } | |
47 + | |
48 + decl data_types() | |
49 + { | |
50 + dma_addr_t data; | |
51 + } | |
52 + | |
53 + map | |
54 + { | |
55 + k_dma_handle: ((dma_addr_t *)${self}); | |
56 + } | |
57 + } | |
58 + | |
59 + template type AbstractDMADirection() | |
60 + { | |
61 + decl data_types() | |
62 + { | |
63 + enum dma_data_direction data; | |
64 + } | |
65 + | |
66 + map | |
67 + { | |
68 + k_dma_direction: ((enum dma_data_direction)${self}); | |
69 + } | |
70 + } | |
71 + | |
72 + template type DMADirection() | |
73 + { | |
74 + decl data_types() | |
75 + { | |
76 + RTX_DMA_BIDIRECTIONAL = DMA_BIDIRECTIONAL, | |
77 + RTX_DMA_TO_DEVICE = DMA_TO_DEVICE, | |
78 + RTX_DMA_FROM_DEVICE = DMA_FROM_DEVICE | |
79 + } | |
80 + | |
81 + map | |
82 + { | |
83 + /* XXX: we should use ${AbstractDMADirection} here: */ | |
84 + dma_direction: ((enum dma_data_direction)${self}); | |
85 + } | |
86 + } | |
87 + | |
88 + template sequence map(Device::AbstractDevice dev, Builtin::symbol buf, Builtin::number size, DMADirection dir) | |
89 + { | |
90 + chunk ::CALL() | |
91 + { | |
92 + dma_map_single(${dev.k_device}, ${buf}, ${size}, ${dir.dma_direction}); | |
93 + } | |
94 + } | |
95 + | |
96 + template sequence unmap(Device::AbstractDevice dev, AbstractDMAHandle handle, Builtin::number size, DMADirection dir) | |
97 + { | |
98 + chunk ::CALL() | |
99 + { | |
100 + dma_unmap_single(${dev.k_device}, ${handle.k_dma_handle}, ${size}, ${dir.dma_direction}); | |
101 + } | |
102 + } | |
103 + | |
104 + template sequence alloc_coherent(Device::AbstractDevice dev, Builtin::number size, AbstractDMAHandle handle) | |
105 + { | |
106 + chunk ::CALL() | |
107 + { | |
108 + dma_alloc_coherent(${dev.k_device}, ${size}, ${handle.k_dma_handle}, GFP_KERNEL); | |
109 + } | |
110 + } | |
111 + | |
112 + template sequence free_coherent(Device::AbstractDevice dev, Builtin::number size, Builtin::symbol addr, AbstractDMAHandle handle) | |
113 + { | |
114 + chunk ::CALL() | |
115 + { | |
116 + dma_free_coherent(${dev.k_device}, ${size}, ${addr}, ${handle.k_dma_handle}); | |
117 + } | |
118 + } | |
119 +} | |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
120 diff --git a/rathaxes/samples/e1000/dma.rti b/rathaxes/samples/e1000/dma.rti |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
121 new file mode 100644 |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
122 --- /dev/null |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
123 +++ b/rathaxes/samples/e1000/dma.rti |
112 | 124 @@ -0,0 +1,42 @@ |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
125 +interface DMA : Builtin, LKM, Device |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
126 +{ |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
127 + provided type AbstractDMAHandle |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
128 + { |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
129 + chunk LKM::includes(); |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
130 + decl data_types(); |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
131 + attribute Builtin::symbol.scalar k_dma_handle; |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
132 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
133 + |
112 | 134 + provided type AbstractDMADirection |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
135 + { |
112 | 136 + decl data_types(); |
137 + attribute Builtin::symbol.scalar k_dma_direction; | |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
138 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
139 + |
112 | 140 + provided type DMADirection |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
141 + { |
112 | 142 + decl data_types(); |
143 + attribute AbstractDMADirection.scalar dma_direction; | |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
144 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
145 + |
112 | 146 + provided sequence map(Device::AbstractDevice, Builtin::symbol, Builtin::number, DMADirection) |
147 + { | |
148 + provided chunk ::CALL(); /* -> DMAHandle */ | |
149 + } | |
150 + | |
151 + provided sequence unmap(Device::AbstractDevice, AbstractDMAHandle, Builtin::number, DMADirection) | |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
152 + { |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
153 + provided chunk ::CALL(); |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
154 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
155 + |
112 | 156 + provided sequence alloc_coherent(Device::AbstractDevice, Builtin::number, AbstractDMAHandle) |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
157 + { |
112 | 158 + /* return the addr and the handle via the AbstractDMAHandle ptr: */ |
159 + provided chunk ::CALL(); | |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
160 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
161 + |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
162 + provided sequence free_coherent(Device::AbstractDevice, Builtin::number, Builtin::symbol, AbstractDMAHandle) |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
163 + { |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
164 + provided chunk ::CALL(); |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
165 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
166 +} |