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 }