comparison rathaxes_samples_e1000_use_the_dma_abstraction_in_socket.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 8eac160e5f1c
children f3c7e9b0c5cf
comparison
equal deleted inserted replaced
114:8eac160e5f1c 115:5a663f8f0e54
1 # HG changeset patch 1 # HG changeset patch
2 # Parent 5a53813ed1306484aa98dd95fe1d284ed24111ab 2 # Parent 22cdd951a10d1b8b06daf6448da73e738f21d2e3
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 @@ -1,6 +1,6 @@
9 with DMA, Builtin, LKM, Device
10 {
11 - template type AbstractDMAHandle()
12 + template type DMA::AbstractDMAHandle()
13 {
14 chunk LKM::includes()
15 {
16 @@ -14,11 +14,11 @@
17
18 map
19 {
20 - k_dma_handle: ((dma_addr_t *)${self});
21 + k_dma_handle: ((dma_addr_t)${self});
22 }
23 }
24
25 - template type AbstractDMADirection()
26 + template type DMA::AbstractDMADirection()
27 {
28 decl data_types()
29 {
30 @@ -42,7 +42,7 @@
31
32 map
33 {
34 - /* XXX: we should use ${AbstractDMADirection} here: */
35 + /* XXX: we should use ${DMA::AbstractDMADirection} here: */
36 dma_direction: ((enum dma_data_direction)${self});
37 }
38 }
39 @@ -51,11 +51,11 @@
40 {
41 chunk ::CALL()
42 {
43 - dma_map_single(${dev.k_device}, ${buf}, ${size}, ${dir.dma_direction});
44 + ((${DMA::DMA::AbstractDMAHandle})dma_map_single(${dev.k_device}, ${buf}, ${size}, ${dir.dma_direction}));
45 }
46 }
47
48 - template sequence unmap(Device::AbstractDevice dev, AbstractDMAHandle handle, Builtin::number size, DMADirection dir)
49 + template sequence unmap(Device::AbstractDevice dev, DMA::AbstractDMAHandle handle, Builtin::number size, DMADirection dir)
50 {
51 chunk ::CALL()
52 {
53 @@ -63,15 +63,23 @@
54 }
55 }
56
57 - template sequence alloc_coherent(Device::AbstractDevice dev, Builtin::number size, AbstractDMAHandle handle)
58 + template sequence mapping_error(Device::AbstractDevice dev, DMA::AbstractDMAHandle handle)
59 + {
60 + chunk ::CALL()
61 + {
62 + dma_mapping_error(${dev.k_device}, ${handle.k_dma_handle});
63 + }
64 + }
65 +
66 + template sequence alloc_coherent(Device::AbstractDevice dev, Builtin::number size, DMA::AbstractDMAHandle handle)
67 {
68 chunk ::CALL()
69 {
70 - dma_alloc_coherent(${dev.k_device}, ${size}, ${handle.k_dma_handle}, GFP_KERNEL);
71 + dma_alloc_coherent(${dev.k_device}, ${size}, &${handle.k_dma_handle}, GFP_KERNEL);
72 }
73 }
74
75 - template sequence free_coherent(Device::AbstractDevice dev, Builtin::number size, Builtin::symbol addr, AbstractDMAHandle handle)
76 + template sequence free_coherent(Device::AbstractDevice dev, Builtin::number size, Builtin::symbol addr, DMA::AbstractDMAHandle handle)
77 {
78 chunk ::CALL()
79 {
80 diff --git a/rathaxes/samples/e1000/dma.rti b/rathaxes/samples/e1000/dma.rti
81 --- a/rathaxes/samples/e1000/dma.rti
82 +++ b/rathaxes/samples/e1000/dma.rti
83 @@ -29,6 +29,12 @@
84 provided chunk ::CALL();
85 }
86
87 + /* XXX: Until we have a real error handling mechanism: */
88 + provided sequence mapping_error(Device::AbstractDevice, AbstractDMAHandle)
89 + {
90 + provided chunk ::CALL(); /* -> != 0 if the mapping failed */
91 + }
92 +
93 provided sequence alloc_coherent(Device::AbstractDevice, Builtin::number, AbstractDMAHandle)
94 {
95 /* return the addr and the handle via the AbstractDMAHandle ptr: */
96 diff --git a/rathaxes/samples/e1000/socket.blt b/rathaxes/samples/e1000/socket.blt 5 diff --git a/rathaxes/samples/e1000/socket.blt b/rathaxes/samples/e1000/socket.blt
97 --- a/rathaxes/samples/e1000/socket.blt 6 --- a/rathaxes/samples/e1000/socket.blt
98 +++ b/rathaxes/samples/e1000/socket.blt 7 +++ b/rathaxes/samples/e1000/socket.blt
99 @@ -1,4 +1,4 @@ 8 @@ -1,4 +1,4 @@
100 -with Socket, LKM, Device, Ethernet 9 -with Socket, LKM, Device, Ethernet
101 +with Socket, LKM, Device, DMA, Ethernet 10 +with Socket, LKM, Device, DMA, Ethernet
102 { 11 {
103 template type Socket::AbstractSKBuff() 12 template type Socket::AbstractSKBuff()
104 { 13 {
105 @@ -22,15 +22,15 @@ 14 @@ -22,35 +22,34 @@
106 { 15 {
107 decl data_types() 16 decl data_types()
108 { 17 {
109 - ${Socket::AbstractSKBuff.ref} skbuff; 18 - ${Socket::AbstractSKBuff.ref} skbuff;
110 - dma_addr_t dma_handle; 19 - dma_addr_t dma_handle;
116 { 25 {
117 static void rtx_socket_skbuff_dump_infos(${Socket::SKBuff.ref}); 26 static void rtx_socket_skbuff_dump_infos(${Socket::SKBuff.ref});
118 - static int rtx_socket_skbuff_map(${Socket::SKBuff.ref}, struct device *, enum dma_data_direction); 27 - static int rtx_socket_skbuff_map(${Socket::SKBuff.ref}, struct device *, enum dma_data_direction);
119 - static void rtx_socket_skbuff_unmap_and_free(${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);
120 + static int rtx_socket_skbuff_map(${Socket::SKBuff.ref}, ${Device::AbstractDevice.ref}, ${DMA::DMADirection.scalar}); 29 + static int rtx_socket_skbuff_map(${Socket::SKBuff.ref}, ${Device::AbstractDevice.ref}, ${DMA::DMADirection.scalar});
121 + static void rtx_socket_skbuff_unmap_and_free(${Socket::SKBuff.ref}, struct device *, ${DMA::DMADirection.scalar}); 30 + static void rtx_socket_skbuff_unmap_and_free(${Socket::SKBuff.ref}, ${Device::AbstractDevice.ref}, ${DMA::DMADirection.scalar});
122 } 31 }
123 32
124 chunk LKM::code() 33 chunk LKM::code()
125 @@ -65,23 +65,21 @@ 34 {
35 static void rtx_socket_skbuff_dump_infos(${Socket::SKBuff.ref} self)
36 {
37 - WARN_ON(!self->skbuff);
38 + WARN_ON(!${local.self.k_sk_buff});
39 +
40 + ${Ethernet::ProtocolId} ethernet_proto = { .id = be16_to_cpu(${local.self.k_sk_buff}->protocol) };
41 + static const char * const ip_summed_values[] = {
42 + "none", "unnecessary", "complete", "partial"
43 + };
44 + struct skb_shared_info *shinfo = skb_shinfo(${local.self.k_sk_buff});
45
46 /*
47 * We should use a Rathaxes log abstraction instead of pr_info here,
48 * but Rathaxes doesn't support functions with a variable number of
49 * arguments yet.
50 */
51 - ${Socket::AbstractSKBuff.ref} skb = self->skbuff;
52 - ${Ethernet::ProtocolId} ethernet_proto = { .id = be16_to_cpu(${local.skb.k_sk_buff}->protocol) };
53 - static const char * const ip_summed_values[] = {
54 - "none", "unnecessary", "complete", "partial"
55 - };
56 - struct skb_shared_info *shinfo = skb_shinfo(${local.skb.k_sk_buff});
57 -
58 pr_info(
59 "\t protocol = %#-5x (%s) ip_summed = %d (%s)\n"
60 "\t len = %-5u data_len = %-5u head_len = %-5u\n"
61 @@ -58,30 +57,26 @@
62 "\t gso_size = %-5u gso_segs = %-5u gso_type = %-5u",
63 /* XXX: can't use ${local.ethernet_proto.id} here (issue #52): */
64 ethernet_proto.id, ${local.ethernet_proto.str},
65 - ${local.skb.k_sk_buff}->ip_summed, ip_summed_values[${local.skb.k_sk_buff}->ip_summed],
66 - ${local.skb.k_sk_buff}->len, ${local.skb.k_sk_buff}->data_len, skb_headlen(${local.skb.k_sk_buff}),
67 + ${local.self.k_sk_buff}->ip_summed, ip_summed_values[${local.self.k_sk_buff}->ip_summed],
68 + ${local.self.k_sk_buff}->len, ${local.self.k_sk_buff}->data_len, skb_headlen(${local.self.k_sk_buff}),
69 shinfo->nr_frags, shinfo->gso_size, shinfo->gso_segs, shinfo->gso_type
70 );
126 } 71 }
127 72
128 static int rtx_socket_skbuff_map(${Socket::SKBuff.ref} self, 73 static int rtx_socket_skbuff_map(${Socket::SKBuff.ref} self,
129 - struct device *dev, 74 - struct device *dev,
130 - enum dma_data_direction direction) 75 - enum dma_data_direction direction)
131 + ${Device::AbstractDevice.ref} dev, 76 + ${Device::AbstractDevice.ref} dev,
132 + ${DMA::DMADirection.scalar} direction) 77 + ${DMA::DMADirection.scalar} direction)
133 { 78 {
134 - ${Socket::AbstractSKBuff.ref} skb = self->skbuff; 79 - ${Socket::AbstractSKBuff.ref} skb = self->skbuff;
135 -
136 - WARN_ON(!${local.skb.k_sk_buff});
137 - WARN_ON(self->dma_handle);
138 + WARN_ON(!${local.self.k_sk_buff}); 80 + WARN_ON(!${local.self.k_sk_buff});
139 + WARN_ON(${local.self.k_dma_handle}); 81 + WARN_ON(${local.self.k_dma_handle});
140 82
141 self->dma_handle = dma_map_single( 83 - WARN_ON(!${local.skb.k_sk_buff});
84 - WARN_ON(self->dma_handle);
85 -
86 - self->dma_handle = dma_map_single(
142 - dev, 87 - dev,
143 + ${dev.k_device}, 88 - ${local.skb.k_sk_buff},
144 ${local.skb.k_sk_buff}, 89 - skb_headlen(${local.skb.k_sk_buff}),
145 skb_headlen(${local.skb.k_sk_buff}),
146 - direction); 90 - direction);
147 - int err = dma_mapping_error(dev, self->dma_handle); 91 - int err = dma_mapping_error(dev, self->dma_handle);
148 + ${local.direction.dma_direction}); 92 + unsigned int len = skb_headlen(${local.skb.k_sk_buff});
93 + ${cast local.len as Builtin::number};
94 + ${local.self.k_dma_handle} = ${DMA::map(local.dev, local.skb.k_sk_buff, local.len, local.direction)};
149 + int err = ${DMA::mapping_error(local.dev, local.self.k_dma_handle)}; 95 + int err = ${DMA::mapping_error(local.dev, local.self.k_dma_handle)};
150 if (err) 96 if (err)
151 { 97 {
152 - self->dma_handle = 0; 98 - self->dma_handle = 0;
153 + ${local.self.k_dma_handle} = 0; 99 + ${local.self.k_dma_handle} = 0;
154 return err; 100 return err;
155 } 101 }
156 return 0; 102 return 0;
157 @@ -89,7 +87,7 @@ 103 @@ -89,7 +84,7 @@
158 104
159 static void rtx_socket_skbuff_unmap_and_free(${Socket::SKBuff.ref} self, 105 static void rtx_socket_skbuff_unmap_and_free(${Socket::SKBuff.ref} self,
160 struct device *dev, 106 struct device *dev,
161 - enum dma_data_direction direction) 107 - enum dma_data_direction direction)
162 + ${DMA::DMADirection} direction) 108 + ${DMA::DMADirection} direction)
163 { 109 {
164 ${Socket::AbstractSKBuff.ref} skb = self->skbuff; 110 ${Socket::AbstractSKBuff.ref} skb = self->skbuff;
165 111
166 @@ -100,7 +98,7 @@ 112 @@ -100,7 +95,7 @@
167 dma_unmap_single(dev, 113 dma_unmap_single(dev,
168 self->dma_handle, 114 self->dma_handle,
169 skb_headlen(${local.skb.k_sk_buff}), 115 skb_headlen(${local.skb.k_sk_buff}),
170 - direction); 116 - direction);
171 + ${local.direction.dma_direction}); 117 + ${local.direction.dma_direction});
172 self->dma_handle = 0; 118 self->dma_handle = 0;
173 } 119 }
174 dev_kfree_skb_any(${local.skb.k_sk_buff}); 120 dev_kfree_skb_any(${local.skb.k_sk_buff});
175 @@ -126,30 +124,32 @@ 121 @@ -126,30 +121,32 @@
176 122
177 method map_to(Device::AbstractDevice dev) 123 method map_to(Device::AbstractDevice dev)
178 { 124 {
179 - rtx_socket_skbuff_map(${self}, ${dev.k_device}, DMA_TO_DEVICE); 125 - rtx_socket_skbuff_map(${self}, ${dev.k_device}, DMA_TO_DEVICE);
180 + rtx_socket_skbuff_map(${self}, ${dev}, RTX_DMA_TO_DEVICE); 126 + rtx_socket_skbuff_map(${self}, ${dev}, RTX_DMA_TO_DEVICE);