Mercurial > archived > louis > epitech > mq > rathaxes
annotate rathaxes_samples_e1000_add_a_dma_abstraction.patch @ 115:5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
author | Louis Opter <louis@lse.epita.fr> |
---|---|
date | Mon, 22 Jul 2013 13:52:00 -0700 |
parents | bfe10def90e3 |
children | f3c7e9b0c5cf |
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 |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
2 # Parent af7a1f8589d632497e2f2574570f5153cae59b91 |
111
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 | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
38 @@ -0,0 +1,89 @@ |
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 + { | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
55 + k_dma_handle: ((dma_addr_t)${self}); |
112 | 56 + } |
57 + } | |
58 + | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
59 + template type DMA::AbstractDMADirection() |
112 | 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 + | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
72 + template type DMA::DMADirection() |
112 | 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 + { | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
83 + /* XXX: we should use ${DMA::AbstractDMADirection} here: */ |
112 | 84 + dma_direction: ((enum dma_data_direction)${self}); |
85 + } | |
86 + } | |
87 + | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
88 + template sequence map(Device::AbstractDevice dev, Builtin::symbol buf, Builtin::number size, DMA::DMADirection dir) |
112 | 89 + { |
90 + chunk ::CALL() | |
91 + { | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
92 + ((${DMA::DMA::AbstractDMAHandle})dma_map_single(${dev.k_device}, ${buf}, ${size}, ${dir.dma_direction})); |
112 | 93 + } |
94 + } | |
95 + | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
96 + template sequence unmap(Device::AbstractDevice dev, DMA::AbstractDMAHandle handle, Builtin::number size, DMA::DMADirection dir) |
112 | 97 + { |
98 + chunk ::CALL() | |
99 + { | |
100 + dma_unmap_single(${dev.k_device}, ${handle.k_dma_handle}, ${size}, ${dir.dma_direction}); | |
101 + } | |
102 + } | |
103 + | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
104 + 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
|
105 + { |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
106 + chunk ::CALL() |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
107 + { |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
108 + 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
|
109 + } |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
110 + } |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
111 + |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
112 + template sequence alloc_coherent(Device::AbstractDevice dev, Builtin::number size, DMA::AbstractDMAHandle handle) |
112 | 113 + { |
114 + chunk ::CALL() | |
115 + { | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
116 + dma_alloc_coherent(${dev.k_device}, ${size}, &${handle.k_dma_handle}, GFP_KERNEL); |
112 | 117 + } |
118 + } | |
119 + | |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
120 + template sequence free_coherent(Device::AbstractDevice dev, Builtin::number size, Builtin::symbol addr, DMA::AbstractDMAHandle handle) |
112 | 121 + { |
122 + chunk ::CALL() | |
123 + { | |
124 + dma_free_coherent(${dev.k_device}, ${size}, ${addr}, ${handle.k_dma_handle}); | |
125 + } | |
126 + } | |
127 +} | |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
128 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
|
129 new file mode 100644 |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
130 --- /dev/null |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
131 +++ b/rathaxes/samples/e1000/dma.rti |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
132 @@ -0,0 +1,48 @@ |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
133 +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
|
134 +{ |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
135 + provided type AbstractDMAHandle |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
136 + { |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
137 + chunk LKM::includes(); |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
138 + decl data_types(); |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
139 + 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
|
140 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
141 + |
112 | 142 + provided type AbstractDMADirection |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
143 + { |
112 | 144 + decl data_types(); |
145 + 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
|
146 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
147 + |
112 | 148 + provided type DMADirection |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
149 + { |
112 | 150 + decl data_types(); |
151 + 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
|
152 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
153 + |
112 | 154 + provided sequence map(Device::AbstractDevice, Builtin::symbol, Builtin::number, DMADirection) |
155 + { | |
156 + provided chunk ::CALL(); /* -> DMAHandle */ | |
157 + } | |
158 + | |
159 + 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
|
160 + { |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
161 + provided chunk ::CALL(); |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
162 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
163 + |
115
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
164 + /* 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
|
165 + 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
|
166 + { |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
167 + 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
|
168 + } |
5a663f8f0e54
WIP, fix another small bug in rathaxes sequence calls
Louis Opter <louis@lse.epita.fr>
parents:
112
diff
changeset
|
169 + |
112 | 170 + 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
|
171 + { |
112 | 172 + /* return the addr and the handle via the AbstractDMAHandle ptr: */ |
173 + provided chunk ::CALL(); | |
111
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
174 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
175 + |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
176 + 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
|
177 + { |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
178 + provided chunk ::CALL(); |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
179 + } |
b072f682823d
Start a new series to refactor e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents:
diff
changeset
|
180 +} |