Mercurial > archived > louis > epitech > mq > rathaxes
comparison rathaxes_samples_e1000_use_the_dma_abstraction_in_socket.patch @ 113:b22983cb9e3a
WIP, thanks joa for some fixes on the compiler
author | Louis Opter <louis@lse.epita.fr> |
---|---|
date | Sat, 20 Jul 2013 20:45:39 -0700 |
parents | bfe10def90e3 |
children | 8eac160e5f1c |
comparison
equal
deleted
inserted
replaced
112:bfe10def90e3 | 113:b22983cb9e3a |
---|---|
1 # HG changeset patch | 1 # HG changeset patch |
2 # Parent c571aba317b28723d36bf15393be227b41fce242 | 2 # Parent 05460906d5aba5d3671969d9ac53182d0ac91649 |
3 Replace Linux specific code in Socket by DMA calls | 3 Replace Linux specific code in Socket by DMA calls |
4 | 4 |
5 diff --git a/rathaxes/samples/e1000/dma.blt b/rathaxes/samples/e1000/dma.blt | |
6 --- a/rathaxes/samples/e1000/dma.blt | |
7 +++ b/rathaxes/samples/e1000/dma.blt | |
8 @@ -14,7 +14,7 @@ | |
9 | |
10 map | |
11 { | |
12 - k_dma_handle: ((dma_addr_t *)${self}); | |
13 + k_dma_handle: ((dma_addr_t)${self}); | |
14 } | |
15 } | |
16 | |
17 @@ -51,7 +51,7 @@ | |
18 { | |
19 chunk ::CALL() | |
20 { | |
21 - dma_map_single(${dev.k_device}, ${buf}, ${size}, ${dir.dma_direction}); | |
22 + ((${DMA::AbstractDMAHandle})dma_map_single(${dev.k_device}, ${buf}, ${size}, ${dir.dma_direction})); | |
23 } | |
24 } | |
25 | |
26 @@ -63,11 +63,19 @@ | |
27 } | |
28 } | |
29 | |
30 + template sequence mapping_error(Device::AbstractDevice dev, AbstractDMAHandle handle) | |
31 + { | |
32 + chunk ::CALL() | |
33 + { | |
34 + dma_mapping_error(${dev.k_device}, ${handle.k_dma_handle}); | |
35 + } | |
36 + } | |
37 + | |
38 template sequence alloc_coherent(Device::AbstractDevice dev, Builtin::number size, AbstractDMAHandle handle) | |
39 { | |
40 chunk ::CALL() | |
41 { | |
42 - dma_alloc_coherent(${dev.k_device}, ${size}, ${handle.k_dma_handle}, GFP_KERNEL); | |
43 + dma_alloc_coherent(${dev.k_device}, ${size}, &${handle.k_dma_handle}, GFP_KERNEL); | |
44 } | |
45 } | |
46 | |
47 diff --git a/rathaxes/samples/e1000/dma.rti b/rathaxes/samples/e1000/dma.rti | |
48 --- a/rathaxes/samples/e1000/dma.rti | |
49 +++ b/rathaxes/samples/e1000/dma.rti | |
50 @@ -29,6 +29,12 @@ | |
51 provided chunk ::CALL(); | |
52 } | |
53 | |
54 + /* XXX: Until we have a real error handling mechanism: */ | |
55 + provided sequence mapping_error(Device::AbstractDevice, AbstractDMAHandle) | |
56 + { | |
57 + provided chunk ::CALL(); /* -> != 0 if the mapping failed */ | |
58 + } | |
59 + | |
60 provided sequence alloc_coherent(Device::AbstractDevice, Builtin::number, AbstractDMAHandle) | |
61 { | |
62 /* return the addr and the handle via the AbstractDMAHandle ptr: */ | |
5 diff --git a/rathaxes/samples/e1000/socket.blt b/rathaxes/samples/e1000/socket.blt | 63 diff --git a/rathaxes/samples/e1000/socket.blt b/rathaxes/samples/e1000/socket.blt |
6 --- a/rathaxes/samples/e1000/socket.blt | 64 --- a/rathaxes/samples/e1000/socket.blt |
7 +++ b/rathaxes/samples/e1000/socket.blt | 65 +++ b/rathaxes/samples/e1000/socket.blt |
8 @@ -1,4 +1,4 @@ | 66 @@ -1,4 +1,4 @@ |
9 -with Socket, LKM, Device, Ethernet | 67 -with Socket, LKM, Device, Ethernet |
24 chunk LKM::prototypes() | 82 chunk LKM::prototypes() |
25 { | 83 { |
26 static void rtx_socket_skbuff_dump_infos(${Socket::SKBuff.ref}); | 84 static void rtx_socket_skbuff_dump_infos(${Socket::SKBuff.ref}); |
27 - static int rtx_socket_skbuff_map(${Socket::SKBuff.ref}, struct device *, enum dma_data_direction); | 85 - static int rtx_socket_skbuff_map(${Socket::SKBuff.ref}, struct device *, enum dma_data_direction); |
28 - static void rtx_socket_skbuff_unmap_and_free(${Socket::SKBuff.ref}, struct device *, enum dma_data_direction); | 86 - static void rtx_socket_skbuff_unmap_and_free(${Socket::SKBuff.ref}, struct device *, enum dma_data_direction); |
29 + static int rtx_socket_skbuff_map(${Socket::SKBuff.ref}, struct device *, ${DMA::DMADirection}); | 87 + static int rtx_socket_skbuff_map(${Socket::SKBuff.ref}, ${Device::AbstractDevice.ref}, ${DMA::DMADirection.scalar}); |
30 + static void rtx_socket_skbuff_unmap_and_free(${Socket::SKBuff.ref}, struct device *, ${DMA::DMADirection}); | 88 + static void rtx_socket_skbuff_unmap_and_free(${Socket::SKBuff.ref}, struct device *, ${DMA::DMADirection.scalar}); |
31 } | 89 } |
32 | 90 |
33 chunk LKM::code() | 91 chunk LKM::code() |
34 @@ -66,7 +66,7 @@ | 92 @@ -65,23 +65,21 @@ |
93 } | |
35 | 94 |
36 static int rtx_socket_skbuff_map(${Socket::SKBuff.ref} self, | 95 static int rtx_socket_skbuff_map(${Socket::SKBuff.ref} self, |
37 struct device *dev, | 96 - struct device *dev, |
38 - enum dma_data_direction direction) | 97 - enum dma_data_direction direction) |
39 + ${DMA::DMADirection} direction) | 98 + ${Device::AbstractDevice.ref} dev, |
99 + ${DMA::DMADirection.scalar} direction) | |
40 { | 100 { |
41 ${Socket::AbstractSKBuff.ref} skb = self->skbuff; | 101 - ${Socket::AbstractSKBuff.ref} skb = self->skbuff; |
42 | 102 - |
43 @@ -77,7 +77,7 @@ | 103 - WARN_ON(!${local.skb.k_sk_buff}); |
44 dev, | 104 - WARN_ON(self->dma_handle); |
105 + WARN_ON(!${local.self.k_sk_buff}); | |
106 + WARN_ON(${local.self.k_dma_handle}); | |
107 | |
108 self->dma_handle = dma_map_single( | |
109 - dev, | |
110 + ${dev.k_device}, | |
45 ${local.skb.k_sk_buff}, | 111 ${local.skb.k_sk_buff}, |
46 skb_headlen(${local.skb.k_sk_buff}), | 112 skb_headlen(${local.skb.k_sk_buff}), |
47 - direction); | 113 - direction); |
114 - int err = dma_mapping_error(dev, self->dma_handle); | |
48 + ${local.direction.dma_direction}); | 115 + ${local.direction.dma_direction}); |
49 int err = dma_mapping_error(dev, self->dma_handle); | 116 + int err = ${DMA::mapping_error(local.dev, local.self.k_dma_handle)}; |
50 if (err) | 117 if (err) |
51 { | 118 { |
52 @@ -89,7 +89,7 @@ | 119 - self->dma_handle = 0; |
120 + ${local.self.k_dma_handle} = 0; | |
121 return err; | |
122 } | |
123 return 0; | |
124 @@ -89,7 +87,7 @@ | |
53 | 125 |
54 static void rtx_socket_skbuff_unmap_and_free(${Socket::SKBuff.ref} self, | 126 static void rtx_socket_skbuff_unmap_and_free(${Socket::SKBuff.ref} self, |
55 struct device *dev, | 127 struct device *dev, |
56 - enum dma_data_direction direction) | 128 - enum dma_data_direction direction) |
57 + ${DMA::DMADirection} direction) | 129 + ${DMA::DMADirection} direction) |
58 { | 130 { |
59 ${Socket::AbstractSKBuff.ref} skb = self->skbuff; | 131 ${Socket::AbstractSKBuff.ref} skb = self->skbuff; |
60 | 132 |
61 @@ -100,7 +100,7 @@ | 133 @@ -100,7 +98,7 @@ |
62 dma_unmap_single(dev, | 134 dma_unmap_single(dev, |
63 self->dma_handle, | 135 self->dma_handle, |
64 skb_headlen(${local.skb.k_sk_buff}), | 136 skb_headlen(${local.skb.k_sk_buff}), |
65 - direction); | 137 - direction); |
66 + ${local.direction.dma_direction}); | 138 + ${local.direction.dma_direction}); |
67 self->dma_handle = 0; | 139 self->dma_handle = 0; |
68 } | 140 } |
69 dev_kfree_skb_any(${local.skb.k_sk_buff}); | 141 dev_kfree_skb_any(${local.skb.k_sk_buff}); |
70 @@ -126,22 +126,22 @@ | 142 @@ -126,30 +124,32 @@ |
71 | 143 |
72 method map_to(Device::AbstractDevice dev) | 144 method map_to(Device::AbstractDevice dev) |
73 { | 145 { |
74 - rtx_socket_skbuff_map(${self}, ${dev.k_device}, DMA_TO_DEVICE); | 146 - rtx_socket_skbuff_map(${self}, ${dev.k_device}, DMA_TO_DEVICE); |
75 + rtx_socket_skbuff_map(${self}, ${dev.k_device}, RTX_DMA_TO_DEVICE); | 147 + rtx_socket_skbuff_map(${self}, ${dev}, RTX_DMA_TO_DEVICE); |
76 } | 148 } |
77 | 149 |
78 method map_from(Device::AbstractDevice dev) | 150 method map_from(Device::AbstractDevice dev) |
79 { | 151 { |
80 - rtx_socket_skbuff_map(${self}, ${dev.k_device}, DMA_FROM_DEVICE); | 152 - rtx_socket_skbuff_map(${self}, ${dev.k_device}, DMA_FROM_DEVICE); |
92 - rtx_socket_skbuff_unmap_and_free(${self}, ${dev.k_device}, DMA_FROM_DEVICE); | 164 - rtx_socket_skbuff_unmap_and_free(${self}, ${dev.k_device}, DMA_FROM_DEVICE); |
93 + rtx_socket_skbuff_unmap_and_free(${self}, ${dev.k_device}, RTX_DMA_FROM_DEVICE); | 165 + rtx_socket_skbuff_unmap_and_free(${self}, ${dev.k_device}, RTX_DMA_FROM_DEVICE); |
94 } | 166 } |
95 | 167 |
96 map | 168 map |
169 { | |
170 - // some work may have to be done here in order | |
171 - // to access to some field of the sk_buff. | |
172 - // We should determine if all the sk_buff management | |
173 - // can be abstracted from the user. | |
174 + // Some work may have to be done here in order to access to some | |
175 + // field of the sk_buff. We should determine if all the sk_buff | |
176 + // management can be abstracted from the user. But this is at least | |
177 + // useful for internal use: | |
178 + k_sk_buff: ((struct skbuff *)(${self}->skbuff)); | |
179 + k_dma_handle: ((dma_addr_t)(${self}->dma_handle)); | |
180 } | |
181 } | |
182 } | |
183 diff --git a/rathaxes/samples/e1000/socket.rti b/rathaxes/samples/e1000/socket.rti | |
184 --- a/rathaxes/samples/e1000/socket.rti | |
185 +++ b/rathaxes/samples/e1000/socket.rti | |
186 @@ -1,4 +1,4 @@ | |
187 -interface Socket : LKM, Device | |
188 +interface Socket : LKM, Device, DMA | |
189 { | |
190 /* The SKBuff type from the kernel */ | |
191 provided type AbstractSKBuff | |
192 @@ -19,5 +19,8 @@ | |
193 method map_from(Device::AbstractDevice); | |
194 method unmap_to_and_free(Device::AbstractDevice); | |
195 method unmap_from_and_free(Device::AbstractDevice); | |
196 + | |
197 + attribute Socket::AbstractSKBuff.ref k_sk_buff; | |
198 + attribute DMA::AbstractDMAHandle.scalar k_dma_handle; | |
199 } | |
200 } |