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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
12 diff --git a/rathaxes/samples/e1000/CMakeLists.txt b/rathaxes/samples/e1000/CMakeLists.txt
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
13 --- a/rathaxes/samples/e1000/CMakeLists.txt
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
14 +++ b/rathaxes/samples/e1000/CMakeLists.txt
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
15 @@ -5,6 +5,7 @@
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
16 log.rti
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
17 lkm.rti
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
18 device.rti
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
19 + dma.rti
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
20 pci.rti
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
21 socket.rti
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
22 ethernet.rti
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
23 @@ -12,8 +13,9 @@
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
24 BLT
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
25 log.blt
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
26 lkm.blt
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
27 + device.blt
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
28 + dma.blt
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
29 pci.blt
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
30 - device.blt
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
31 socket.blt
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
32 e1000.blt
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
33 ethernet.blt)
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
34 diff --git a/rathaxes/samples/e1000/dma.blt b/rathaxes/samples/e1000/dma.blt
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
35 new file mode 100644
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
36 --- /dev/null
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
37 +++ b/rathaxes/samples/e1000/dma.blt
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
38 @@ -0,0 +1,81 @@
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
39 +with DMA, Builtin, LKM, Device
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
40 +{
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
41 + template type AbstractDMAHandle()
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
42 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
43 + chunk LKM::includes()
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
44 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
45 + #include <linux/dma-mapping.h>
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
46 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
47 +
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
48 + decl data_types()
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
49 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
50 + dma_addr_t data;
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
51 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
52 +
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
53 + map
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
54 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
55 + k_dma_handle: ((dma_addr_t *)${self});
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
56 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
57 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
58 +
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
59 + template type AbstractDMADirection()
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
60 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
61 + decl data_types()
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
62 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
63 + enum dma_data_direction data;
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
64 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
65 +
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
66 + map
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
67 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
68 + k_dma_direction: ((enum dma_data_direction)${self});
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
69 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
70 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
71 +
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
72 + template type DMADirection()
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
73 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
74 + decl data_types()
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
75 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
76 + RTX_DMA_BIDIRECTIONAL = DMA_BIDIRECTIONAL,
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
77 + RTX_DMA_TO_DEVICE = DMA_TO_DEVICE,
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
78 + RTX_DMA_FROM_DEVICE = DMA_FROM_DEVICE
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
79 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
80 +
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
81 + map
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
82 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
83 + /* XXX: we should use ${AbstractDMADirection} here: */
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
84 + dma_direction: ((enum dma_data_direction)${self});
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
85 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
86 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
87 +
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
88 + template sequence map(Device::AbstractDevice dev, Builtin::symbol buf, Builtin::number size, DMADirection dir)
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
89 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
90 + chunk ::CALL()
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
91 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
92 + dma_map_single(${dev.k_device}, ${buf}, ${size}, ${dir.dma_direction});
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
93 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
94 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
95 +
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
96 + template sequence unmap(Device::AbstractDevice dev, AbstractDMAHandle handle, Builtin::number size, DMADirection dir)
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
97 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
98 + chunk ::CALL()
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
99 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
100 + dma_unmap_single(${dev.k_device}, ${handle.k_dma_handle}, ${size}, ${dir.dma_direction});
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
101 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
102 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
103 +
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
104 + template sequence alloc_coherent(Device::AbstractDevice dev, Builtin::number size, AbstractDMAHandle handle)
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
105 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
106 + chunk ::CALL()
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
107 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
108 + dma_alloc_coherent(${dev.k_device}, ${size}, ${handle.k_dma_handle}, GFP_KERNEL);
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
109 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
110 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
111 +
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
112 + template sequence free_coherent(Device::AbstractDevice dev, Builtin::number size, Builtin::symbol addr, AbstractDMAHandle handle)
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
113 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
114 + chunk ::CALL()
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
115 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
116 + dma_free_coherent(${dev.k_device}, ${size}, ${addr}, ${handle.k_dma_handle});
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
117 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
118 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
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
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
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
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
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
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
136 + decl data_types();
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
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
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
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
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
142 + decl data_types();
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
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
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
146 + provided sequence map(Device::AbstractDevice, Builtin::symbol, Builtin::number, DMADirection)
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
147 + {
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
148 + provided chunk ::CALL(); /* -> DMAHandle */
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
149 + }
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
150 +
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
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
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
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
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
158 + /* return the addr and the handle via the AbstractDMAHandle ptr: */
Louis Opter <louis@lse.epita.fr>
parents: 111
diff changeset
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 +}