Mercurial > archived > louis > epitech > mq > rathaxes
annotate rathaxes_samples_e1000_add_a_dma_abstraction.patch @ 119:d84bc9a46771
WIP, finally the alloc_skbuff method will be in the Ethernet subsystem since, the socket subsystem cannot depend on Ethernet (that would cause a circular dependency)
author | Louis Opter <louis@lse.epita.fr> |
---|---|
date | Fri, 26 Jul 2013 17:35:12 -0700 |
parents | ad21d8a182ad |
children |
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 |
119
d84bc9a46771
WIP, finally the alloc_skbuff method will be in the Ethernet subsystem since, the socket subsystem cannot depend on Ethernet (that would cause a circular dependency)
Louis Opter <louis@lse.epita.fr>
parents:
118
diff
changeset
|
2 # Parent fb28afe4be73b2dc25945c07dcac93718b0f3e3e |
d84bc9a46771
WIP, finally the alloc_skbuff method will be in the Ethernet subsystem since, the socket subsystem cannot depend on Ethernet (that would cause a circular dependency)
Louis Opter <louis@lse.epita.fr>
parents:
118
diff
changeset
|
3 rathaxes: start a DMA allocation/mapping abstraction in the e1000 sample |
111
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 | |
117 | 38 @@ -0,0 +1,103 @@ |
112 | 39 +with DMA, Builtin, LKM, Device |
40 +{ | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
41 + template type DMA::AbstractDMAHandle() |
112 | 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 + { | |
118
ad21d8a182ad
WIP: put up (hopefully the last) some touches on the dma abstraction
Louis Opter <louis@lse.epita.fr>
parents:
117
diff
changeset
|
55 + k_dma_handle: (*(dma_addr_t *)&(${self})); |
117 | 56 + } |
57 + } | |
58 + | |
59 + template type DMA::DMAHandle() | |
60 + { | |
61 + decl data_types() | |
62 + { | |
63 + ${DMA::AbstractDMAHandle} data; | |
64 + } | |
65 + | |
66 + map | |
67 + { | |
68 + /* XXX: we should use ${DMA::AbstractDMAHandle} here: */ | |
118
ad21d8a182ad
WIP: put up (hopefully the last) some touches on the dma abstraction
Louis Opter <louis@lse.epita.fr>
parents:
117
diff
changeset
|
69 + dma_handle: (*(dma_addr_t *)&(${self})); |
112 | 70 + } |
71 + } | |
72 + | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
73 + template type DMA::AbstractDMADirection() |
112 | 74 + { |
75 + decl data_types() | |
76 + { | |
77 + enum dma_data_direction data; | |
78 + } | |
79 + | |
80 + map | |
81 + { | |
118
ad21d8a182ad
WIP: put up (hopefully the last) some touches on the dma abstraction
Louis Opter <louis@lse.epita.fr>
parents:
117
diff
changeset
|
82 + k_dma_direction: ((enum dma_data_direction)(${self})); |
112 | 83 + } |
84 + } | |
85 + | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
86 + template type DMA::DMADirection() |
112 | 87 + { |
88 + decl data_types() | |
89 + { | |
90 + RTX_DMA_BIDIRECTIONAL = DMA_BIDIRECTIONAL, | |
91 + RTX_DMA_TO_DEVICE = DMA_TO_DEVICE, | |
92 + RTX_DMA_FROM_DEVICE = DMA_FROM_DEVICE | |
93 + } | |
94 + | |
95 + map | |
96 + { | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
97 + /* XXX: we should use ${DMA::AbstractDMADirection} here: */ |
117 | 98 + dma_direction: (enum dma_data_direction)(${self}); |
112 | 99 + } |
100 + } | |
101 + | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
102 + template sequence map(Device::AbstractDevice dev, Builtin::symbol buf, Builtin::number size, DMA::DMADirection dir) |
112 | 103 + { |
104 + chunk ::CALL() | |
105 + { | |
118
ad21d8a182ad
WIP: put up (hopefully the last) some touches on the dma abstraction
Louis Opter <louis@lse.epita.fr>
parents:
117
diff
changeset
|
106 + dma_map_single(${dev.k_device}, ${buf}, ${size}, ${dir.dma_direction}); |
112 | 107 + } |
108 + } | |
109 + | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
110 + template sequence unmap(Device::AbstractDevice dev, DMA::AbstractDMAHandle handle, Builtin::number size, DMA::DMADirection dir) |
112 | 111 + { |
112 + chunk ::CALL() | |
113 + { | |
114 + dma_unmap_single(${dev.k_device}, ${handle.k_dma_handle}, ${size}, ${dir.dma_direction}); | |
115 + } | |
116 + } | |
117 + | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
118 + template sequence mapping_error(Device::AbstractDevice dev, DMA::AbstractDMAHandle handle) |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
119 + { |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
120 + chunk ::CALL() |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
121 + { |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
122 + dma_mapping_error(${dev.k_device}, ${handle.k_dma_handle}); |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
123 + } |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
124 + } |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
125 + |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
126 + template sequence alloc_coherent(Device::AbstractDevice dev, Builtin::number size, DMA::AbstractDMAHandle handle) |
112 | 127 + { |
128 + chunk ::CALL() | |
129 + { | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
130 + dma_alloc_coherent(${dev.k_device}, ${size}, &${handle.k_dma_handle}, GFP_KERNEL); |
112 | 131 + } |
132 + } | |
133 + | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
134 + template sequence free_coherent(Device::AbstractDevice dev, Builtin::number size, Builtin::symbol addr, DMA::AbstractDMAHandle handle) |
112 | 135 + { |
136 + chunk ::CALL() | |
137 + { | |
138 + dma_free_coherent(${dev.k_device}, ${size}, ${addr}, ${handle.k_dma_handle}); | |
139 + } | |
140 + } | |
141 +} | |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
142 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
|
143 new file mode 100644 |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
144 --- /dev/null |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
145 +++ b/rathaxes/samples/e1000/dma.rti |
117 | 146 @@ -0,0 +1,54 @@ |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
147 +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
|
148 +{ |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
149 + provided type AbstractDMAHandle |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
150 + { |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
151 + chunk LKM::includes(); |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
152 + decl data_types(); |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
153 + 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
|
154 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
155 + |
117 | 156 + provided type DMAHandle |
157 + { | |
158 + decl data_types(); | |
159 + attribute AbstractDMAHandle.scalar dma_handle; | |
160 + } | |
161 + | |
112 | 162 + provided type AbstractDMADirection |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
163 + { |
112 | 164 + decl data_types(); |
165 + 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
|
166 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
167 + |
112 | 168 + provided type DMADirection |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
169 + { |
112 | 170 + decl data_types(); |
171 + 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
|
172 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
173 + |
112 | 174 + provided sequence map(Device::AbstractDevice, Builtin::symbol, Builtin::number, DMADirection) |
175 + { | |
176 + provided chunk ::CALL(); /* -> DMAHandle */ | |
177 + } | |
178 + | |
179 + 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
|
180 + { |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
181 + provided chunk ::CALL(); |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
182 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
183 + |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
184 + /* XXX: Until we have a real error handling mechanism: */ |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
185 + provided sequence mapping_error(Device::AbstractDevice, AbstractDMAHandle) |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
186 + { |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
187 + provided chunk ::CALL(); /* -> != 0 if the mapping failed */ |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
188 + } |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
189 + |
112 | 190 + 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
|
191 + { |
112 | 192 + /* return the addr and the handle via the AbstractDMAHandle ptr: */ |
193 + provided chunk ::CALL(); | |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
194 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
195 + |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
196 + 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
|
197 + { |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
198 + provided chunk ::CALL(); |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
199 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
200 +} |